diff --git a/.github/workflows/every-core-mainnet.yml b/.github/workflows/every-core-mainnet.yml
new file mode 100644
index 0000000..723e269
--- /dev/null
+++ b/.github/workflows/every-core-mainnet.yml
@@ -0,0 +1,18 @@
+name: Deploy 'every.near' App Components to Mainnet
+
+on:
+ push:
+ branches: [main]
+
+jobs:
+ deploy-mainnet:
+ uses: nearbuilders/bos-workspace/.github/workflows/deploy.yml@main
+ with:
+ bw-legacy: false
+ deploy-env: "mainnet"
+ app-name: "core"
+ deploy-account-address: every.near
+ signer-account-address: every.near
+ signer-public-key:
+ secrets:
+ SIGNER_PRIVATE_KEY: ${{ secrets.EVERY_CORE_SIGNER_PRIVATE_KEY_MAINNET }}
\ No newline at end of file
diff --git a/.github/workflows/every-core-testnet.yml b/.github/workflows/every-core-testnet.yml
new file mode 100644
index 0000000..c3b780f
--- /dev/null
+++ b/.github/workflows/every-core-testnet.yml
@@ -0,0 +1,18 @@
+name: Deploy 'every.near' App Components to Testnet
+
+on:
+ push:
+ branches: [develop]
+
+jobs:
+ deploy-mainnet:
+ uses: nearbuilders/bos-workspace/.github/workflows/deploy.yml@main
+ with:
+ bw-legacy: false
+ deploy-env: "testnet"
+ app-name: "core"
+ deploy-account-address: allthethings.testnet
+ signer-account-address: allthethings.testnet
+ signer-public-key:
+ secrets:
+ SIGNER_PRIVATE_KEY: ${{ secrets.EVERY_CORE_SIGNER_PRIVATE_KEY_TESTNET }}
\ No newline at end of file
diff --git a/.github/workflows/every-video-mainnet.yml b/.github/workflows/every-video-mainnet.yml
new file mode 100644
index 0000000..47de1ea
--- /dev/null
+++ b/.github/workflows/every-video-mainnet.yml
@@ -0,0 +1,18 @@
+name: Deploy 'every.video.near' App Components to Mainnet
+
+on:
+ push:
+ branches: [main]
+
+jobs:
+ deploy-mainnet:
+ uses: nearbuilders/bos-workspace/.github/workflows/deploy.yml@main
+ with:
+ bw-legacy: false
+ deploy-env: "mainnet"
+ app-name: "video"
+ deploy-account-address: video.every.near
+ signer-account-address: video.every.near
+ signer-public-key: ed25519:4u1tcYqemMsr84btLphGq5wnUKgPSGgTH1ft8tFPhozB
+ secrets:
+ SIGNER_PRIVATE_KEY: ${{ secrets.EVERY_VIDEO_SIGNER_PRIVATE_KEY_MAINNET }}
\ No newline at end of file
diff --git a/.github/workflows/every-video-testnet.yml b/.github/workflows/every-video-testnet.yml
new file mode 100644
index 0000000..f52e0cd
--- /dev/null
+++ b/.github/workflows/every-video-testnet.yml
@@ -0,0 +1,18 @@
+name: Deploy 'every.video.near' App Components to Testnet
+
+on:
+ push:
+ branches: [main]
+
+jobs:
+ deploy-mainnet:
+ uses: nearbuilders/bos-workspace/.github/workflows/deploy.yml@main
+ with:
+ bw-legacy: false
+ deploy-env: "testnet"
+ app-name: "video"
+ deploy-account-address: video.allthethings.testnet
+ signer-account-address: video.allthethings.testnet
+ signer-public-key:
+ secrets:
+ SIGNER_PRIVATE_KEY: ${{ secrets.EVERY_VIDEO_SIGNER_PRIVATE_KEY_TESTNET }}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index aa275b5..078fa96 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,9 @@
+node_modules
+.vscode
.DS_Store
-/node_modules
-/build
\ No newline at end of file
+
+/build
+/dist
+tree.json
+
+test-results
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..40b878d
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1 @@
+node_modules/
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..372532f
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,7 @@
+{
+ "printWidth": 100,
+ "tabWidth": 2,
+ "singleQuote": false,
+ "trailingComma": "es5",
+ "semi": true
+}
diff --git a/README.md b/README.md
index 26a5f80..c8cc92a 100644
--- a/README.md
+++ b/README.md
@@ -1,26 +1,15 @@
-# sdks.near
+# every.near
-## Setup & Development
+## Getting started
-Install packages:
+1. Install packages
```cmd
-yarn
+yarn install
```
-Start development version:
+2. Start dev environment
```cmd
-yarn dev
-```
-
-This will start both a local gateway (http://127.0.0.1:4040) and http server for loading your local components.
-
-Optionally, to open local widgets in existing, supported gateways:
-
-1. Visit either of the following sites:
-
-- https://near.org/flags
-- https://everything.dev/flags
-
-2. Paste the Bos Loader Http URL (http://127.0.0.1:4040/api/loader)
+yarn run dev
+```
\ No newline at end of file
diff --git a/aliases.mainnet.json b/aliases.mainnet.json
new file mode 100644
index 0000000..11f13ef
--- /dev/null
+++ b/aliases.mainnet.json
@@ -0,0 +1,4 @@
+{
+ "mob": "mob.near",
+ "near": "near"
+}
diff --git a/aliases.testnet.json b/aliases.testnet.json
new file mode 100644
index 0000000..0c08670
--- /dev/null
+++ b/aliases.testnet.json
@@ -0,0 +1,4 @@
+{
+ "mob": "mike.testnet",
+ "near": "discom.testnet"
+}
diff --git a/apps/core/bos.config.json b/apps/core/bos.config.json
new file mode 100644
index 0000000..0132a61
--- /dev/null
+++ b/apps/core/bos.config.json
@@ -0,0 +1,10 @@
+{
+ "account": "every.near",
+ "aliases": ["../../aliases.mainnet.json"],
+ "overrides": {
+ "testnet": {
+ "account": "allthethings.testnet",
+ "aliases": ["../../aliases.testnet.json"]
+ }
+ }
+}
diff --git a/apps/core/data.json b/apps/core/data.json
new file mode 100644
index 0000000..dfc63d2
--- /dev/null
+++ b/apps/core/data.json
@@ -0,0 +1,3 @@
+{
+ "every.near": {}
+}
diff --git a/apps/core/widget/components.jsx b/apps/core/widget/components.jsx
new file mode 100644
index 0000000..1951870
--- /dev/null
+++ b/apps/core/widget/components.jsx
@@ -0,0 +1,18 @@
+const { Avatar } = VM.require("${config_account}/widget/components.ui.avatar");
+const { AvatarGroup } = VM.require("${config_account}/widget/components.ui.avatar-group");
+const { Badge } = VM.require("${config_account}/widget/components.ui.badge");
+const { Button } = VM.require("${config_account}/widget/components.ui.button");
+const { Chip } = VM.require("${config_account}/widget/components.ui.chip");
+const { Container } = VM.require("${config_account}/widget/components.ui.container");
+const { Logo } = VM.require("${config_account}/widget/components.ui.logo");
+const { Tag } = VM.require("${config_account}/widget/components.ui.tag");
+return {
+ Avatar,
+ AvatarGroup,
+ Badge,
+ Button,
+ Chip,
+ Container,
+ Logo,
+ Tag,
+};
diff --git a/apps/core/widget/components/chips.jsx b/apps/core/widget/components/chips.jsx
new file mode 100644
index 0000000..4d89643
--- /dev/null
+++ b/apps/core/widget/components/chips.jsx
@@ -0,0 +1,53 @@
+const { Chip } = VM.require("${config_account}/widget/components") || {
+ Chip: () => <>>,
+};
+
+const items = props.items ?? [];
+const onSelect = props.onSelect ?? (() => {});
+
+const [selectedItems, setSelectedItems] = useState([]);
+
+const handleClick = (item) => {
+ if (props.multiple) {
+ if (!selectedItems.includes(item)) {
+ setSelectedItems((prev) => [...prev, item]);
+ } else if (selectedItems.includes(item)) {
+ setSelectedItems((prev) => prev.filter((i) => i !== item));
+ }
+ } else {
+ if (selectedItems !== item) {
+ setSelectedItems(item);
+ } else if (selectedItems === item) {
+ setSelectedItems(null);
+ }
+ }
+};
+
+useEffect(() => {
+ onSelect(selectedItems);
+}, [selectedItems, onSelect]);
+
+if (items.length === 0) {
+ return
No items passed
;
+}
+
+const duplicates = items.filter((item, index) => items.indexOf(item) !== index);
+if (duplicates.length > 0) {
+ return Duplicate Items Found
;
+}
+
+return (
+
+ {items.map((item) => (
+ handleClick(item)}
+ size={props.size}
+ multiple={props.multiple}
+ >
+ {item}
+
+ ))}
+
+);
diff --git a/apps/core/widget/components/navbar.jsx b/apps/core/widget/components/navbar.jsx
new file mode 100644
index 0000000..95e70d7
--- /dev/null
+++ b/apps/core/widget/components/navbar.jsx
@@ -0,0 +1,492 @@
+const { Avatar, Button, Badge, Logo } = VM.require("${config_account}/widget/components") || {
+ Avatar: () => <>>,
+ Button: () => <>>,
+ Badge: () => <>>,
+ Logo: () => <>>,
+};
+
+const { MobileRight } = VM.require("${config_account}/widget/components.navbar.mobile-right") || {
+ MobileRight: () => <>>,
+};
+const { MobileLeft } = VM.require("${config_account}/widget/components.navbar.mobile-left") || {
+ MobileLeft: () => <>>,
+};
+
+const {
+ Bell,
+ Check,
+ ChevronDown,
+ ChevronUp,
+ Code,
+ Download,
+ Everything,
+ FileCode,
+ GitFork,
+ Grip,
+ History,
+ LayoutTemplate,
+ LogOut,
+ Menu,
+ Moon,
+ PaintRoller,
+ PartyPopper,
+ QRCode,
+ ShoppingCart,
+ Sun,
+ UserCircle,
+ Video,
+} = VM.require("${config_account}/widget/icons") || {
+ Bell: () => <>>,
+ Check: () => <>>,
+ ChevronDown: () => <>>,
+ ChevronUp: () => <>>,
+ Code: () => <>>,
+ Download: () => <>>,
+ Everything: () => <>>,
+ FileCode: () => <>>,
+ GitFork: () => <>>,
+ Grip: () => <>>,
+ History: () => <>>,
+ LayoutTemplate: () => <>>,
+ LogOut: () => <>>,
+ Menu: () => <>>,
+ Moon: () => <>>,
+ PaintRoller: () => <>>,
+ PartyPopper: () => <>>,
+ QRCode: () => <>>,
+ ShoppingCart: () => <>>,
+ Sun: () => <>>,
+ UserCircle: () => <>>,
+ Video: () => <>>,
+};
+
+const [appMenuOpen, setAppMenuOpen] = useState(false);
+const [codeMenuOpen, setCodeMenuOpen] = useState(false);
+const [menuDropdownOpen, setMenuDropdownOpen] = useState(false);
+
+const toggleAppMenu = useCallback(() => {
+ setMenuDropdownOpen(false);
+ setCodeMenuOpen(false);
+ setAppMenuOpen((prev) => !prev);
+}, []);
+
+const toggleCodeMenu = useCallback(() => {
+ setMenuDropdownOpen(false);
+ setAppMenuOpen(false);
+ setCodeMenuOpen((prev) => !prev);
+}, []);
+
+const toggleMenuDropdown = useCallback(() => {
+ setCodeMenuOpen(false);
+ setAppMenuOpen(false);
+ setMenuDropdownOpen((prev) => !prev);
+}, []);
+
+// mobile
+const [mobileRight, setMobileRight] = useState(false);
+const [mobileLeft, setMobileLeft] = useState(false);
+
+const toggleMobileRight = useCallback(() => {
+ setMobileRight((prev) => !prev);
+}, []);
+
+const toggleMobileLeft = useCallback(() => {
+ setMobileLeft((prev) => !prev);
+}, []);
+
+const StyledNavbar = styled.div`
+ display: flex;
+ padding: 12px 40px;
+ align-items: center;
+ justify-content: space-between;
+ gap: 16px;
+ background: var(--bg, #fff);
+ border-bottom: 1px solid var(--stroke, #e2e2e2);
+ @media (max-width: 768px) {
+ padding: 16px;
+ gap: 8px;
+ }
+`;
+
+const DropdownContent = styled.div`
+ position: absolute;
+ top: 100%;
+ width: 100%;
+ min-width: 200px;
+ margin-top: 4px;
+ display: flex;
+ padding: 8px 0;
+ flex-direction: column;
+ align-items: stretch;
+ background: var(--bg, #fff);
+ border-radius: 12px;
+ border: 1px solid var(--stroke, #e2e2e2);
+ box-shadow: 0px 4px 8px -2px rgba(16, 24, 40, 0.1), 0px 2px 4px -2px rgba(16, 24, 40, 0.06);
+
+ button {
+ margin: 0 8px;
+ justify-content: flex-start;
+ color: var(--dropdown-button-color, #1c2024);
+ }
+`;
+
+const BellCounter = styled.div`
+ position: absolute;
+ top: 35%;
+ right: 35%;
+ transform: translate(50%, -50%);
+ display: flex;
+ width: 10px;
+ height: 10px;
+ justify-content: center;
+ align-items: center;
+ border: 2px solid white;
+ gap: 4px;
+ flex-shrink: 0;
+ border-radius: 100%;
+ background: var(--btn-primary-danger-bg, #dc3d43);
+ border: 1.5px solid var(--btn-secondary-bg, #fff);
+ font-size: 12px;
+ font-weight: 500;
+ line-height: 140%;
+ letter-spacing: -0.12px;
+`;
+
+const Separator = styled.div`
+ height: 1px;
+ background: var(--separator-color, #e2e2e2);
+ margin: 4px 0;
+ width: 100%;
+`;
+
+const DropdownHeading = styled.div`
+ display: flex;
+ padding: 16px 16px 8px 16px;
+ margin: 0 8px;
+ align-items: center;
+ align-self: stretch;
+ color: #8f8f8f;
+ font-family: Poppins, sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+`;
+
+const AppGrid = styled.div`
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 1rem;
+`;
+
+const AppCard = styled.div`
+ position: relative;
+ display: flex;
+ min-width: 160px;
+ padding: 16px;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 8px;
+ flex: 1 0 0;
+ border-radius: 20px;
+ border: 1px solid var(--stroke, #e2e2e2);
+ background: var(--btn-secondary-bg, #fff);
+ color: var(--btn-secondary-color, #000);
+
+ /* Poppins/Text/M - 16px/Medium */
+ font-family: Poppins, sans-serif;
+ font-weight: 500;
+ line-height: 150%; /* 24px */
+ letter-spacing: -0.16px;
+
+ .icon {
+ display: flex;
+ width: 40px;
+ height: 40px;
+ justify-content: center;
+ align-items: center;
+ border-radius: 12px;
+ background: var(--btn-secondary-hover-bg, #c7c7c7);
+
+ svg {
+ height: 20px;
+ width: 20px;
+ }
+
+ svg,
+ path {
+ color: var(--btn-secondary-color, #000);
+ stroke: var(--btn-secondary-color, #000);
+ }
+ }
+
+ transition: all 300ms ease;
+
+ &:hover {
+ cursor: pointer;
+ background: var(--btn-secondary-hover-bg, #c7c7c7);
+ }
+ &.disabled {
+ cursor: not-allowed;
+ background: var(--btn-secondary-hover-bg, #c7c7c7);
+ color: #6f6f6f;
+ svg,
+ path {
+ color: #c7c7c7;
+ stroke: #c7c7c7;
+ }
+ }
+`;
+
+const getNotificationCount = () => {
+ const notificationFeedSrc = "mob.near/widget/NotificationFeed";
+
+ const lastBlockHeight = Storage.get("lastBlockHeight", notificationFeedSrc);
+ if (lastBlockHeight === null) {
+ return "";
+ }
+
+ const notifications = Social.index("notify", context.accountId, {
+ order: "asc",
+ from: (lastBlockHeight ?? 0) + 1,
+ // subscribe: true,
+ });
+
+ return notifications.length;
+};
+
+const unreadNotifications = getNotificationCount();
+
+const MemoizedUserDropdown = useMemo(
+ () => (
+
+
+ {context.accountId} {menuDropdownOpen ? : }
+
+ ),
+ [context.accountId, menuDropdownOpen]
+);
+
+const profile = Social.getr(`${context.accountId}/profile`);
+const theme = profile.every.theme ?? "light";
+
+return (
+ <>
+
+
+
+ {/* Desktop */}
+
+
+
+
+
+
+ {appMenuOpen && (
+
+
+
+
+
+
+ Video
+
+
+
+ Canvas
+
+
+
+ Event
+
+
+
+
+
+ Profile
+
+
+
+ Coming Soon
+
+
+
+
+ Marketplace
+
+
+
+
+
+ App
+
+
+
+
+
+ App
+
+
+
+
+
+ App
+
+
+
+ )}
+
+
+
+
+
+
+ {context.accountId ? (
+ <>
+
+
+
+
+ {unreadNotifications && }
+
+
+ {MemoizedUserDropdown}
+ {menuDropdownOpen && (
+
+
+ My Profile
+
+
+ Mobile sign-in QR
+
+
+ Withdraw
+
+
+
+
+ Log Out
+
+
+ )}
+
+ >
+ ) : (
+
connect
+ )}
+
+
+
+
+ {codeMenuOpen && (
+
+ SOURCE CODE
+
+
+ Fork Widget
+
+
+
+ View Source
+
+
+
+ View History
+
+
+ APPEARANCE
+
+ Social.set({
+ profile: {
+ every: {
+ theme: "light",
+ },
+ },
+ })
+ }
+ >
+ Light
+ {theme === "light" && (
+
+
+
+ )}
+
+
+ Social.set({
+ profile: {
+ every: {
+ theme: "dark",
+ },
+ },
+ })
+ }
+ >
+ Dark
+ {theme === "dark" && (
+
+
+
+ )}
+
+ {!context.accountId && (
+
+ Please login to change theme
+
+ )}
+
+ )}
+
+
+
+ {context.accountId && (
+
+
+
+
+ {unreadNotifications && }
+
+ )}
+
+ {context.accountId && }
+
+
+
+ {mobileRight && }
+ {mobileLeft && }
+ >
+);
diff --git a/apps/core/widget/components/navbar/mobile-left.jsx b/apps/core/widget/components/navbar/mobile-left.jsx
new file mode 100644
index 0000000..730b800
--- /dev/null
+++ b/apps/core/widget/components/navbar/mobile-left.jsx
@@ -0,0 +1,227 @@
+const { Badge, Button, Logo } = VM.require("${config_account}/widget/components") || {
+ Badge: () => <>>,
+ Button: () => <>>,
+ Logo: () => <>>,
+};
+
+const { Code, Everything, LayoutTemplate, PaintRoller, PartyPopper, ShoppingCart, X, Video } =
+ VM.require("${config_account}/widget/icons") || {
+ Code: () => <>>,
+ Everything: () => <>>,
+ LayoutTemplate: () => <>>,
+ PaintRoller: () => <>>,
+ PartyPopper: () => <>>,
+ ShoppingCart: () => <>>,
+ X: () => <>>,
+ Video: () => <>>,
+ };
+
+const Container = styled.div`
+ display: none;
+
+ @media (max-width: 768px) {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: var(--bg, #fff);
+ z-index: 1049;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+
+ .close-button {
+ svg {
+ width: 28px;
+ height: 28px;
+ stroke-width: 0;
+ }
+ }
+ }
+`;
+
+const Heading = styled.div`
+ display: flex;
+ padding: 16px 16px 8px 16px;
+ margin: 0 8px;
+ align-items: center;
+ align-self: stretch;
+ color: #8f8f8f;
+ font-family: Poppins, sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+`;
+
+const AppGrid = styled.div`
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 1rem;
+ padding: 1rem;
+`;
+
+const AppCard = styled.div`
+ position: relative;
+ display: flex;
+ min-width: 160px;
+ padding: 16px;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 8px;
+ flex: 1 0 0;
+ border-radius: 20px;
+ border: 1px solid var(--stroke, #e2e2e2);
+ background: var(--btn-secondary-bg, #fff);
+ color: var(--btn-secondary-color, #000);
+
+ /* Poppins/Text/M - 16px/Medium */
+ font-family: Poppins, sans-serif;
+ font-weight: 500;
+ line-height: 150%; /* 24px */
+ letter-spacing: -0.16px;
+
+ .icon {
+ display: flex;
+ width: 40px;
+ height: 40px;
+ justify-content: center;
+ align-items: center;
+ border-radius: 12px;
+ background: var(--btn-secondary-hover-bg, #c7c7c7);
+
+ svg {
+ height: 20px;
+ width: 20px;
+ }
+
+ svg,
+ path {
+ color: var(--btn-secondary-color, #000);
+ stroke: var(--btn-secondary-color, #000);
+ }
+ }
+
+ transition: all 300ms ease;
+
+ &:hover {
+ cursor: pointer;
+ background: var(--btn-secondary-hover-bg, #c7c7c7);
+ }
+ &.disabled {
+ cursor: not-allowed;
+ background: var(--app-card-disabled-bg, #c7c7c7);
+ color: #6f6f6f;
+ svg,
+ path {
+ color: #c7c7c7;
+ stroke: #c7c7c7;
+ }
+ }
+`;
+
+const Links = styled.div`
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ padding: 16px;
+ flex-grow: 1;
+
+ button {
+ justify-content: flex-start;
+ padding: 8px;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+ }
+
+ .active {
+ color: var(--color);
+ font-weight: 500;
+ }
+`;
+
+const MobileLeft = ({ toggle }) => {
+ return (
+
+
+
+
+
+
+
+
+
+ home
+
+
+
+
ALL APPS
+
+
+
+
+
+ Video
+
+
+
+ Canvas
+
+
+
+ Event
+
+
+
+
+
+ Profile
+
+
+
+ Soon
+
+
+
+
+ Marketplace
+
+
+
+
+
+ App
+
+
+
+
+
+ App
+
+
+
+
+
+ App
+
+
+
+
+ );
+};
+return { MobileLeft };
diff --git a/apps/core/widget/components/navbar/mobile-right.jsx b/apps/core/widget/components/navbar/mobile-right.jsx
new file mode 100644
index 0000000..a2d11d7
--- /dev/null
+++ b/apps/core/widget/components/navbar/mobile-right.jsx
@@ -0,0 +1,256 @@
+const { Avatar, Button, Logo } = VM.require("${config_account}/widget/components") || {
+ Avatar: () => <>>,
+ Button: () => <>>,
+ Logo: () => <>>,
+};
+
+const {
+ Everything,
+ X,
+ GitFork,
+ Sun,
+ Moon,
+ Check,
+ FileCode,
+ History,
+ UserCircle,
+ QRCode,
+ Download,
+ LogOut,
+} = VM.require("${config_account}/widget/icons") || {
+ Everything: () => <>>,
+ X: () => <>>,
+ GitFork: () => <>>,
+ Sun: () => <>>,
+ Moon: () => <>>,
+ Check: () => <>>,
+ FileCode: () => <>>,
+ History: () => <>>,
+ UserCircle: () => <>>,
+ QRCode: () => <>>,
+ Download: () => <>>,
+ LogOut: () => <>>,
+};
+
+const Container = styled.div`
+ display: none;
+
+ @media (max-width: 768px) {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: var(--bg, #fff);
+ z-index: 1049;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+
+ .close-button {
+ svg {
+ width: 28px;
+ height: 28px;
+ stroke-width: 0;
+ }
+ }
+ }
+`;
+
+const ProfileSection = styled.div`
+ display: flex;
+ padding: 24px 8px;
+ flex-direction: column;
+ align-items: stretch;
+ gap: 10px;
+ flex: 1 0 0;
+ align-self: stretch;
+`;
+
+const ProfileButtons = styled.div`
+ display: flex;
+ flex-direction: column;
+ button {
+ justify-content: flex-start;
+ color: var(--dropdown-button-color, #1c2024);
+ padding: 8px 12px 8px 8px;
+ }
+`;
+
+const OptionSection = styled.div`
+ display: flex;
+ padding: 8px;
+ flex-direction: column;
+ align-items: stretch;
+ align-self: stretch;
+ button {
+ justify-content: flex-start;
+ color: var(--dropdown-button-color, #1c2024);
+ padding: 8px 12px 8px 8px;
+ }
+`;
+
+const Heading = styled.div`
+ display: flex;
+ padding: 16px 16px 8px 16px;
+ margin: 0 8px;
+ align-items: center;
+ align-self: stretch;
+ color: #8f8f8f;
+ font-family: Poppins, sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+`;
+
+const Separator = styled.div`
+ height: 1px;
+ background: var(--separator-color, #e2e2e2);
+ margin: 4px 0;
+ width: 100%;
+`;
+
+const UserInfo = styled.div`
+ display: flex;
+ flex-direction: column;
+ padding: 0 16px;
+
+ h6 {
+ color: var(--color, #0d0d0d);
+ font-family: Poppins, sans-serif;
+ font-weight: 500;
+ line-height: 150%; /* 24px */
+ letter-spacing: -0.16px;
+ margin: 0;
+ }
+
+ p {
+ color: var(--color, #0d0d0d);
+ font-family: Poppins, sans-serif;
+ font-size: 14px;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+ margin: 0;
+ }
+`;
+
+const MobileRight = ({ toggle, accountId }) => {
+ const profile = Social.getr(`${accountId}/profile`);
+ const theme = profile.every.theme ?? "light";
+
+ return (
+
+
+ {accountId ?
:
}
+
+
+
+
+ {accountId && (
+
+ {profile.name}
+ {accountId}
+
+ )}
+
+ {accountId ? (
+ <>>
+ ) : (
+ <>
+ Connect
+ >
+ )}
+
+
+ My Profile
+
+
+ Mobile sign-in QR
+
+
+ Withdraw
+
+
+
+
+ SOURCE CODE
+
+
+ Fork Widget
+
+
+
+ View Source
+
+
+
+ View History
+
+
+ APPEARANCE
+
+ Social.set({
+ profile: {
+ every: {
+ theme: "light",
+ },
+ },
+ })
+ }
+ >
+ Light
+ {theme === "light" && (
+
+
+
+ )}
+
+
+ Social.set({
+ profile: {
+ every: {
+ theme: "dark",
+ },
+ },
+ })
+ }
+ >
+ Dark
+ {theme === "dark" && (
+
+
+
+ )}
+
+ {!accountId && (
+
+ Please login to change theme
+
+ )}
+
+
+
+ Log Out
+
+
+
+ );
+};
+
+return { MobileRight };
diff --git a/apps/core/widget/components/ui/avatar-group.jsx b/apps/core/widget/components/ui/avatar-group.jsx
new file mode 100644
index 0000000..f6ff70c
--- /dev/null
+++ b/apps/core/widget/components/ui/avatar-group.jsx
@@ -0,0 +1,47 @@
+const { Avatar } = VM.require("${config_account}/widget/components.ui.avatar") || {
+ Avatar: () => <>>,
+};
+
+const AvatarGroup = ({ accountIds, large, size, maxCount }) => {
+ const amount = accountIds.length;
+ const remaining = amount - maxCount;
+
+ return (
+
+ {accountIds.splice(0, maxCount ?? amount).map((accountId) => (
+
+ ))}
+ {remaining > 0 && (
+
+ +{remaining}
+
+ )}
+
+ );
+};
+
+return { AvatarGroup };
diff --git a/apps/core/widget/components/ui/avatar.jsx b/apps/core/widget/components/ui/avatar.jsx
new file mode 100644
index 0000000..293909e
--- /dev/null
+++ b/apps/core/widget/components/ui/avatar.jsx
@@ -0,0 +1,65 @@
+const { User } = VM.require("${config_account}/widget/icons") || {
+ User: () => <>>,
+};
+
+const Avatar = ({ accountId, size, large, form, imageStyle, key }) => {
+ const imageForm = form ?? "circle";
+ const profile = Social.getr(`${accountId}/profile`);
+ if (!profile.image) {
+ return (
+
+ {profile.name ? (
+ profile.name[0]
+ ) : (
+
+ )}
+
+ );
+ }
+
+ return (
+
+ );
+};
+
+return { Avatar };
diff --git a/apps/core/widget/components/ui/badge.jsx b/apps/core/widget/components/ui/badge.jsx
new file mode 100644
index 0000000..a77bc64
--- /dev/null
+++ b/apps/core/widget/components/ui/badge.jsx
@@ -0,0 +1,145 @@
+const StyledBadge = styled.div`
+ display: inline-flex;
+ height: 28px;
+ min-width: 28px;
+ padding: 4px 8px;
+ justify-content: center;
+ align-items: center;
+ gap: 4px;
+ flex-shrink: 0;
+
+ border-radius: 100px;
+
+ background: rgba(0, 0, 0, 0.05);
+ color: #171717;
+ background: ${(props) => {
+ if (props.variant === "outline") {
+ return "white";
+ }
+
+ if (props.color === "black") {
+ return props.variant === "alpha" ? "rgba(0, 0, 0, 0.05)" : "#171717";
+ } else if (props.color === "blue") {
+ return props.variant === "alpha" ? "rgba(2, 128, 255, 0.07)" : "#0081F1";
+ } else if (props.color === "green") {
+ return props.variant === "alpha" ? "rgba(2, 186, 60, 0.09)" : "#299764";
+ } else if (props.color === "yellow") {
+ return props.variant === "alpha" ? "rgba(255, 234, 1, 0.18)" : "#F7CE00";
+ } else if (props.color === "red") {
+ return props.variant === "alpha" ? "rgba(255, 1, 1, 0.06)" : "#DC3D43";
+ }
+ }};
+
+ color: ${(props) => {
+ if (props.variant === "outline") {
+ if (props.color === "black") {
+ return "var(--badge-alpha-black-color, #171717)";
+ } else if (props.color === "blue") {
+ return "#006ADC";
+ } else if (props.color === "green") {
+ return "#18794E";
+ } else if (props.color === "yellow") {
+ return "#35290F";
+ } else if (props.color === "red") {
+ return "#CD2B31";
+ }
+ }
+ if (props.color === "black") {
+ return props.variant === "alpha" ? "var(--badge-alpha-black-color, #171717)" : "#fff";
+ } else if (props.color === "blue") {
+ return props.variant === "alpha" ? "#006ADC" : "#fff";
+ } else if (props.color === "green") {
+ return props.variant === "alpha" ? "#18794E" : "#fff";
+ } else if (props.color === "yellow") {
+ return props.variant === "alpha" ? "#35290F" : "#fff";
+ } else if (props.color === "red") {
+ return props.variant === "alpha" ? "#CD2B31" : "#fff";
+ }
+ }};
+
+ border: 1px solid
+ ${(props) => {
+ if (props.variant === "outline") {
+ if (props.color === "black") {
+ return "var(--badge-alpha-black-color, #171717)";
+ } else if (props.color === "blue") {
+ return "#006ADC";
+ } else if (props.color === "green") {
+ return "#18794E";
+ } else if (props.color === "yellow") {
+ return "#35290F";
+ } else if (props.color === "red") {
+ return "#CD2B31";
+ }
+ }
+ }};
+
+ svg,
+ path {
+ fill: ${(props) => {
+ if (props.variant === "outline") {
+ if (props.color === "black") {
+ return "var(--badge-alpha-black-color, #171717)";
+ } else if (props.color === "blue") {
+ return "#006ADC";
+ } else if (props.color === "green") {
+ return "#18794E";
+ } else if (props.color === "yellow") {
+ return "#35290F";
+ } else if (props.color === "red") {
+ return "#CD2B31";
+ }
+ }
+ if (props.color === "black") {
+ return props.variant === "alpha" ? "var(--badge-alpha-black-color, #171717)" : "#fff";
+ } else if (props.color === "blue") {
+ return props.variant === "alpha" ? "#006ADC" : "#fff";
+ } else if (props.color === "green") {
+ return props.variant === "alpha" ? "#18794E" : "#fff";
+ } else if (props.color === "yellow") {
+ return props.variant === "alpha" ? "#35290F" : "#fff";
+ } else if (props.color === "red") {
+ return props.variant === "alpha" ? "#CD2B31" : "#fff";
+ }
+ }};
+ }
+
+ font-family: Poppins, sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+
+ ${(props) => {
+ if (props.size === "small") {
+ return {
+ height: "24px",
+ minWidth: "24px",
+ fontSize: "12px",
+ };
+ } else if (props.size === "x-small") {
+ return {
+ height: "20px",
+ minWidth: "20px",
+ fontSize: "12px",
+ padding: "4px",
+ };
+ } else if (props.size === "xx-small") {
+ return {
+ height: "16px",
+ minWidth: "16px",
+ padding: "4px",
+ };
+ }
+ }}
+`;
+
+const Badge = ({ children, size, variant, color, ...restProps }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+return { Badge };
diff --git a/apps/core/widget/components/ui/button.jsx b/apps/core/widget/components/ui/button.jsx
new file mode 100644
index 0000000..1207657
--- /dev/null
+++ b/apps/core/widget/components/ui/button.jsx
@@ -0,0 +1,269 @@
+const StyledButton = styled.button`
+ /* base style */
+ all: unset;
+ display: inline-flex;
+ padding: 8px 20px;
+ justify-content: center;
+ align-items: center;
+ gap: 8px;
+ border-radius: 12px;
+
+ /* font */
+ font-family: Poppins, sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 150%; /* 24px */
+ letter-spacing: -0.16px;
+
+ /* transition */
+ transition: all 300ms ease;
+
+ /* variant styles */
+ background: ${(props) => {
+ if (props.variant === "primary" && props.type === "danger") {
+ return "var(--btn-primary-danger-bg, #DC3D43)";
+ } else if (props.variant === "primary") {
+ return "var(--btn-primary-bg, #171717)";
+ } else if (props.variant === "secondary" || props.variant === "tertiary") {
+ return "var(--btn-secondary-bg, #fff)";
+ }
+ }};
+
+ border: ${(props) => {
+ if (props.variant === "secondary" && props.type === "danger") {
+ return "1px solid var(--btn-secondary-danger-stroke, #F3AEAF)";
+ } else if (props.variant === "secondary") {
+ return "1px solid var(--btn-secondary-stroke, #DBDBDB)";
+ } else {
+ return ""; // No border for other cases
+ }
+ }};
+
+ color: ${(props) => {
+ if (props.variant === "primary") {
+ return "var(--btn-primary-color, #fff)";
+ } else if (
+ (props.variant === "secondary" || props.variant === "tertiary") &&
+ props.type === "danger"
+ ) {
+ return "var(--btn-secondary-danger-color, #CD2B31) !important";
+ } else if (props.variant === "secondary") {
+ return "var(--btn-secondary-color, #171717)";
+ } else if (props.variant === "tertiary") {
+ return "var(--btn-tertiary-color, #6F6F6F)";
+ }
+ }};
+
+ /* handle svg */
+ svg,
+ path {
+ stroke: ${(props) => {
+ if (props.variant === "primary") {
+ return "var(--btn-primary-color, #fff)";
+ } else if (
+ (props.variant === "secondary" || props.variant === "tertiary") &&
+ props.type === "danger"
+ ) {
+ return "var(--btn-secondary-danger-color, #CD2B31) !important";
+ } else if (props.variant === "secondary") {
+ return "var(--btn-secondary-color, #171717)";
+ } else if (props.variant === "tertiary") {
+ return "var(--btn-tertiary-color, #6F6F6F)";
+ }
+ }};
+ }
+
+ font-size: ${(props) => {
+ if (props.size === "large") {
+ return "16px";
+ }
+ }};
+
+ height: ${(props) => {
+ if (props.size === "large") {
+ return "32px";
+ } else if (props.size === "medium") {
+ return "24px";
+ } else if (props.size === "small") {
+ return "16px";
+ }
+ }};
+
+ width: ${(props) => {
+ if (props.icon) {
+ if (props.size === "large") {
+ return "32px";
+ } else if (props.size === "medium") {
+ return "24px";
+ } else if (props.size === "small") {
+ return "16px";
+ }
+ }
+ }};
+
+ padding: ${(props) => {
+ if (props.icon) {
+ return "8px";
+ }
+ }};
+
+ &:hover {
+ cursor: pointer;
+ background: ${(props) => {
+ if (props.variant === "primary" && props.type === "danger") {
+ return "#CD2B31";
+ } else if (props.variant === "primary") {
+ return "var(--btn-primary-hover-bg, #6F6F6F)";
+ } else if (props.variant === "secondary") {
+ return "var(btn-secondary-hover-bg, #FCFCFC)";
+ } else if (props.variant === "tertiary" && props.type === "danger") {
+ return "var(--btn-tertiary-danger-hover-bg,#FF050508)";
+ } else if (props.variant === "tertiary") {
+ return "var(--btn-tertiary-hover-bg, #F8F8F8)";
+ }
+ }};
+
+ border: ${(props) => {
+ if (props.variant === "secondary") {
+ return "1px solid var(--btn-secondary-hover-stroke, #C7C7C7)";
+ }
+ }};
+ }
+
+ &:disabled {
+ cursor: not-allowed;
+ background: ${(props) => {
+ if (props.variant === "primary") {
+ return "var(--btn-primary-disabled-bg, #C7C7C7)";
+ }
+ }};
+ border: ${(props) => {
+ if (props.variant === "secondary") {
+ return "1px solid var(--btn-secondary-disabled-stroke, #DBDBDB)";
+ }
+ }};
+ color: ${(props) => {
+ if (props.variant === "primary") {
+ return "rgba(255, 255, 255, 0.59)";
+ } else if (props.variant === "secondary" || props.variant === "tertiary") {
+ return "var(--btn-primary-disabled-bg, #C7C7C7)";
+ }
+ }};
+
+ svg,
+ path {
+ stroke: ${(props) => {
+ if (props.variant === "primary") {
+ return "rgba(255, 255, 255, 0.59)";
+ } else if (props.variant === "secondary" || props.variant === "tertiary") {
+ return "var(--btn-primary-disabled-bg, #C7C7C7)";
+ }
+ }};
+ }
+ }
+`;
+
+const StyledLink = styled.button`
+ all: unset;
+
+ display: inline-flex;
+ padding: 2px 4px;
+ justify-content: center;
+ align-items: center;
+ gap: 8px;
+ border-radius: 12px;
+
+ color: #006adc;
+
+ svg,
+ path {
+ stroke: #006adc;
+ }
+
+ font-family: Poppins, sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+
+ font-size: ${(props) => {
+ if (props.size === "large") {
+ return "16px";
+ }
+ }};
+
+ transition: all 300ms ease;
+
+ &:hover {
+ cursor: pointer;
+ text-decoration: none;
+ background: #f5faff;
+ color: #006adc;
+
+ svg,
+ path {
+ stroke: #006adc;
+ }
+ }
+
+ &:active {
+ color: #006adc;
+
+ svg,
+ path {
+ stroke: #006adc;
+ }
+ }
+
+ &:disabled {
+ color: #c7c7c7;
+ svg,
+ path {
+ stroke: #c7c7c7;
+ }
+ }
+`;
+
+const Button = ({
+ children,
+ onClick,
+ variant,
+ size,
+ href,
+ type,
+ icon,
+ linkClassName,
+ ...restProps
+}) => {
+ if (href) {
+ return (
+
+
+ {children}
+
+
+ );
+ }
+
+ return (
+
+ {children}
+
+ );
+};
+
+return { Button };
diff --git a/apps/core/widget/components/ui/chip.jsx b/apps/core/widget/components/ui/chip.jsx
new file mode 100644
index 0000000..c00b43d
--- /dev/null
+++ b/apps/core/widget/components/ui/chip.jsx
@@ -0,0 +1,65 @@
+const { Plus, X } = VM.require("${config_account}/widget/icons") || {
+ Plus: () => <>>,
+ X: () => <>>,
+};
+
+const StyledChip = styled.div`
+ display: inline-flex;
+ height: 32px;
+ padding: 8px 16px;
+ justify-content: center;
+ align-items: center;
+ gap: 8px;
+ flex-shrink: 0;
+
+ ${(props) => {
+ if (props.size === "small") {
+ return {
+ height: "24px",
+ padding: "8px 12px",
+ };
+ }
+ }}
+
+ border-radius: 12px;
+ background: var(--chip-bg, #f3f3f3);
+
+ color: var(--chip-color, #171717);
+ font-family: Poppins, sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+
+ transition: all 300ms ease;
+ cursor: pointer;
+
+ &:hover {
+ background: var(--chip-hover-bg, #e8e8e8);
+ }
+
+ &.selected {
+ background: var(--chip-selected-bg, #171717);
+ color: var(--chip-selected-color, #fff);
+
+ svg {
+ path {
+ fill: var(--chip-selected-icon, #dbdbdb);
+ }
+ }
+
+ &:hover {
+ background: var(--chip-selected-hover-bg, #6f6f6f);
+ }
+ }
+`;
+
+const Chip = ({ children, selected, onClick, size, multiple, ...restProps }) => {
+ return (
+
+ {children} {multiple ? selected ? : : null}
+
+ );
+};
+
+return { Chip };
diff --git a/apps/core/widget/components/ui/container.jsx b/apps/core/widget/components/ui/container.jsx
new file mode 100644
index 0000000..de091a8
--- /dev/null
+++ b/apps/core/widget/components/ui/container.jsx
@@ -0,0 +1,13 @@
+const Container = styled.div`
+ padding: 32px 40px;
+ background: var(--bg, #fff);
+ color: var(--color, #0d0d0d);
+ height: 100%;
+ flex-grow: 1;
+
+ @media (max-width: 768px) {
+ padding: 24px 16px;
+ }
+`;
+
+return { Container };
diff --git a/apps/core/widget/components/ui/library.jsx b/apps/core/widget/components/ui/library.jsx
new file mode 100644
index 0000000..14982d0
--- /dev/null
+++ b/apps/core/widget/components/ui/library.jsx
@@ -0,0 +1,248 @@
+const { Avatar, AvatarGroup, Button, Badge, Container } = VM.require(
+ "${config_account}/widget/components"
+) || {
+ Avatar: () => <>>,
+ AvatarGroup: () => <>>,
+ Button: () => <>>,
+ Badge: () => <>>,
+ Container: () => <>>,
+};
+
+const badgeSizes = ["xx-small", "x-small", "small", "medium"];
+const badgeStyles = ["alpha", "solid"];
+const badgeColors = ["black", "blue", "green", "yellow", "red"];
+
+const avatarIds = [
+ "itexpert120-contra.near",
+ "kwok0997.near",
+ "itexpert120-contra.near",
+ "itexpert120-contra.near",
+ "itexpert120-contra.near",
+ "itexpert120-contra.near",
+ "itexpert120-contra.near",
+ "itexpert120-contra.near",
+];
+
+const [selected, setSelected] = useState(null);
+
+const badges = [];
+
+badgeSizes.forEach((size) => {
+ badgeStyles.forEach((style) => {
+ badgeColors.forEach((color) => {
+ badges.push({ size, style, color });
+ });
+ });
+});
+
+return (
+
+
UI Library
+
Button
+
+
+
+ button
+
+
+ button
+
+
+ button
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ button
+
+
+ button
+
+
+ button
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ button
+
+
+ button
+
+
+ button
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ button
+
+
+ button
+
+
+
+
+
+
+ button
+
+
+ button
+
+
+ button
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ button
+
+
+ button
+
+
+ button
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ button
+
+
+ button
+
+
+ button
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Badge
+
+ {badges.map((badge, index) => (
+
+ 1
+
+ ))}
+
+
Chips
+
Single
+
setSelected(selected),
+ }}
+ />
+ Multiple
+ setSelected(selected),
+ multiple: true,
+ }}
+ />
+ Avatar
+
+
+
+
+);
diff --git a/apps/core/widget/components/ui/logo.jsx b/apps/core/widget/components/ui/logo.jsx
new file mode 100644
index 0000000..cafe3f3
--- /dev/null
+++ b/apps/core/widget/components/ui/logo.jsx
@@ -0,0 +1,41 @@
+const { Everything } = VM.require("${config_account}/widget/icons") || {
+ Everything: () => <>>,
+};
+
+const LogoText = styled.div`
+ span {
+ color: var(--color, #0d0d0d);
+ font-size: 18px;
+ font-style: normal;
+ font-weight: 600;
+ line-height: 100%; /* 18px */
+ text-transform: lowercase;
+ margin-left: 12px;
+ }
+
+ circle {
+ fill: var(--color, #0d0d0d);
+ }
+ @media (max-width: 768px) {
+ span {
+ font-size: 15px;
+ margin-left: 10px;
+ }
+
+ svg {
+ width: 20px;
+ height: 20px;
+ }
+ }
+`;
+
+const Logo = () => {
+ return (
+
+
+ everything
+
+ );
+};
+
+return { Logo };
diff --git a/apps/core/widget/components/ui/tag.jsx b/apps/core/widget/components/ui/tag.jsx
new file mode 100644
index 0000000..9633b98
--- /dev/null
+++ b/apps/core/widget/components/ui/tag.jsx
@@ -0,0 +1,24 @@
+const { X } = VM.require("${config_account}/widget/icons") || {
+ X: () => <>>,
+};
+
+const { Badge } = VM.require("${config_account}/widget/components") || {
+ Badge: () => <>>,
+};
+
+const Tag = ({ children, size, variant, color, ...restProps }) => {
+ return (
+
+ {children}
+
+
+ );
+};
+
+return { Tag };
diff --git a/apps/core/widget/icons.jsx b/apps/core/widget/icons.jsx
new file mode 100644
index 0000000..b2ae1eb
--- /dev/null
+++ b/apps/core/widget/icons.jsx
@@ -0,0 +1,53 @@
+const { Bell } = VM.require("${config_account}/widget/icons.bell");
+const { Check } = VM.require("${config_account}/widget/icons.check");
+const { ChevronDown } = VM.require("${config_account}/widget/icons.chevron-down");
+const { ChevronUp } = VM.require("${config_account}/widget/icons.chevron-up");
+const { Code } = VM.require("${config_account}/widget/icons.code");
+const { Download } = VM.require("${config_account}/widget/icons.download");
+const { Everything } = VM.require("${config_account}/widget/icons.everything");
+const { FileCode } = VM.require("${config_account}/widget/icons.file-code");
+const { GitFork } = VM.require("${config_account}/widget/icons.git-fork");
+const { Grip } = VM.require("${config_account}/widget/icons.grip");
+const { History } = VM.require("${config_account}/widget/icons.history");
+const { LayoutTemplate } = VM.require("${config_account}/widget/icons.layout-template");
+const { LogOut } = VM.require("${config_account}/widget/icons.log-out");
+const { Menu } = VM.require("${config_account}/widget/icons.menu");
+const { Moon } = VM.require("${config_account}/widget/icons.moon");
+const { PaintRoller } = VM.require("${config_account}/widget/icons.paint-roller");
+const { PartyPopper } = VM.require("${config_account}/widget/icons.party-popper");
+const { Plus } = VM.require("${config_account}/widget/icons.plus");
+const { QRCode } = VM.require("${config_account}/widget/icons.qr-code");
+const { ShoppingCart } = VM.require("${config_account}/widget/icons.shopping-cart");
+const { Sun } = VM.require("${config_account}/widget/icons.sun");
+const { UserCircle } = VM.require("${config_account}/widget/icons.user-circle");
+const { User } = VM.require("${config_account}/widget/icons.user");
+const { Video } = VM.require("${config_account}/widget/icons.video");
+const { X } = VM.require("${config_account}/widget/icons.x");
+
+return {
+ Bell,
+ Check,
+ ChevronDown,
+ ChevronUp,
+ Code,
+ Download,
+ Everything,
+ FileCode,
+ GitFork,
+ Grip,
+ History,
+ LayoutTemplate,
+ LogOut,
+ Menu,
+ Moon,
+ PaintRoller,
+ PartyPopper,
+ Plus,
+ QRCode,
+ ShoppingCart,
+ Sun,
+ UserCircle,
+ User,
+ Video,
+ X,
+};
diff --git a/apps/core/widget/icons/bell.jsx b/apps/core/widget/icons/bell.jsx
new file mode 100644
index 0000000..a35d906
--- /dev/null
+++ b/apps/core/widget/icons/bell.jsx
@@ -0,0 +1,15 @@
+const Bell = () => {
+ return (
+
+
+
+ );
+};
+
+return { Bell };
diff --git a/apps/core/widget/icons/check.jsx b/apps/core/widget/icons/check.jsx
new file mode 100644
index 0000000..22d8706
--- /dev/null
+++ b/apps/core/widget/icons/check.jsx
@@ -0,0 +1,15 @@
+const Check = () => {
+ return (
+
+
+
+ );
+};
+
+return { Check };
diff --git a/apps/core/widget/icons/chevron-down.jsx b/apps/core/widget/icons/chevron-down.jsx
new file mode 100644
index 0000000..3d99753
--- /dev/null
+++ b/apps/core/widget/icons/chevron-down.jsx
@@ -0,0 +1,15 @@
+const ChevronDown = () => {
+ return (
+
+
+
+ );
+};
+
+return { ChevronDown };
diff --git a/apps/core/widget/icons/chevron-up.jsx b/apps/core/widget/icons/chevron-up.jsx
new file mode 100644
index 0000000..ee6c78f
--- /dev/null
+++ b/apps/core/widget/icons/chevron-up.jsx
@@ -0,0 +1,15 @@
+const ChevronUp = () => {
+ return (
+
+
+
+ );
+};
+
+return { ChevronUp };
diff --git a/apps/core/widget/icons/code.jsx b/apps/core/widget/icons/code.jsx
new file mode 100644
index 0000000..6f691b4
--- /dev/null
+++ b/apps/core/widget/icons/code.jsx
@@ -0,0 +1,15 @@
+const Code = () => {
+ return (
+
+
+
+ );
+};
+
+return { Code };
diff --git a/apps/core/widget/icons/download.jsx b/apps/core/widget/icons/download.jsx
new file mode 100644
index 0000000..3d9a37c
--- /dev/null
+++ b/apps/core/widget/icons/download.jsx
@@ -0,0 +1,15 @@
+const Download = () => {
+ return (
+
+
+
+ );
+};
+
+return { Download };
diff --git a/apps/core/widget/icons/everything.jsx b/apps/core/widget/icons/everything.jsx
new file mode 100644
index 0000000..4ed9d81
--- /dev/null
+++ b/apps/core/widget/icons/everything.jsx
@@ -0,0 +1,9 @@
+const Everything = () => {
+ return (
+
+
+
+ );
+};
+
+return { Everything };
diff --git a/apps/core/widget/icons/file-code.jsx b/apps/core/widget/icons/file-code.jsx
new file mode 100644
index 0000000..82630fa
--- /dev/null
+++ b/apps/core/widget/icons/file-code.jsx
@@ -0,0 +1,15 @@
+const FileCode = () => {
+ return (
+
+
+
+ );
+};
+
+return { FileCode };
diff --git a/apps/core/widget/icons/git-fork.jsx b/apps/core/widget/icons/git-fork.jsx
new file mode 100644
index 0000000..8c85141
--- /dev/null
+++ b/apps/core/widget/icons/git-fork.jsx
@@ -0,0 +1,15 @@
+const GitFork = () => {
+ return (
+
+
+
+ );
+};
+
+return { GitFork };
diff --git a/apps/core/widget/icons/grip.jsx b/apps/core/widget/icons/grip.jsx
new file mode 100644
index 0000000..96086c5
--- /dev/null
+++ b/apps/core/widget/icons/grip.jsx
@@ -0,0 +1,107 @@
+const Grip = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+return { Grip };
diff --git a/apps/core/widget/icons/history.jsx b/apps/core/widget/icons/history.jsx
new file mode 100644
index 0000000..332b1e3
--- /dev/null
+++ b/apps/core/widget/icons/history.jsx
@@ -0,0 +1,15 @@
+const History = () => {
+ return (
+
+
+
+ );
+};
+
+return { History };
diff --git a/apps/core/widget/icons/layout-template.jsx b/apps/core/widget/icons/layout-template.jsx
new file mode 100644
index 0000000..2104df2
--- /dev/null
+++ b/apps/core/widget/icons/layout-template.jsx
@@ -0,0 +1,29 @@
+const LayoutTemplate = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+return { LayoutTemplate };
diff --git a/apps/core/widget/icons/log-out.jsx b/apps/core/widget/icons/log-out.jsx
new file mode 100644
index 0000000..6088729
--- /dev/null
+++ b/apps/core/widget/icons/log-out.jsx
@@ -0,0 +1,22 @@
+const LogOut = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+return { LogOut };
diff --git a/apps/core/widget/icons/menu.jsx b/apps/core/widget/icons/menu.jsx
new file mode 100644
index 0000000..4561459
--- /dev/null
+++ b/apps/core/widget/icons/menu.jsx
@@ -0,0 +1,15 @@
+const Menu = () => {
+ return (
+
+
+
+ );
+};
+
+return { Menu };
diff --git a/apps/core/widget/icons/moon.jsx b/apps/core/widget/icons/moon.jsx
new file mode 100644
index 0000000..717353e
--- /dev/null
+++ b/apps/core/widget/icons/moon.jsx
@@ -0,0 +1,15 @@
+const Moon = () => {
+ return (
+
+
+
+ );
+};
+
+return { Moon };
diff --git a/apps/core/widget/icons/paint-roller.jsx b/apps/core/widget/icons/paint-roller.jsx
new file mode 100644
index 0000000..2d555f8
--- /dev/null
+++ b/apps/core/widget/icons/paint-roller.jsx
@@ -0,0 +1,22 @@
+const PaintRoller = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+return { PaintRoller };
diff --git a/apps/core/widget/icons/party-popper.jsx b/apps/core/widget/icons/party-popper.jsx
new file mode 100644
index 0000000..9d1f922
--- /dev/null
+++ b/apps/core/widget/icons/party-popper.jsx
@@ -0,0 +1,22 @@
+const PartyPopper = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+return { PartyPopper };
diff --git a/apps/core/widget/icons/plus.jsx b/apps/core/widget/icons/plus.jsx
new file mode 100644
index 0000000..06ba3c1
--- /dev/null
+++ b/apps/core/widget/icons/plus.jsx
@@ -0,0 +1,12 @@
+const Plus = () => {
+ return (
+
+
+
+ );
+};
+
+return { Plus };
diff --git a/apps/core/widget/icons/qr-code.jsx b/apps/core/widget/icons/qr-code.jsx
new file mode 100644
index 0000000..801c3a5
--- /dev/null
+++ b/apps/core/widget/icons/qr-code.jsx
@@ -0,0 +1,15 @@
+const QRCode = () => {
+ return (
+
+
+
+ );
+};
+
+return { QRCode };
diff --git a/apps/core/widget/icons/shopping-cart.jsx b/apps/core/widget/icons/shopping-cart.jsx
new file mode 100644
index 0000000..1487b63
--- /dev/null
+++ b/apps/core/widget/icons/shopping-cart.jsx
@@ -0,0 +1,22 @@
+const ShoppingCart = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+return { ShoppingCart };
diff --git a/apps/core/widget/icons/sun.jsx b/apps/core/widget/icons/sun.jsx
new file mode 100644
index 0000000..66fa8eb
--- /dev/null
+++ b/apps/core/widget/icons/sun.jsx
@@ -0,0 +1,22 @@
+const Sun = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+return { Sun };
diff --git a/apps/core/widget/icons/user-circle.jsx b/apps/core/widget/icons/user-circle.jsx
new file mode 100644
index 0000000..e64483e
--- /dev/null
+++ b/apps/core/widget/icons/user-circle.jsx
@@ -0,0 +1,22 @@
+const UserCircle = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+return { UserCircle };
diff --git a/apps/core/widget/icons/user.jsx b/apps/core/widget/icons/user.jsx
new file mode 100644
index 0000000..f720b29
--- /dev/null
+++ b/apps/core/widget/icons/user.jsx
@@ -0,0 +1,21 @@
+const User = ({ width, height, color }) => {
+ return (
+
+
+
+ );
+};
+
+return { User };
diff --git a/apps/core/widget/icons/video.jsx b/apps/core/widget/icons/video.jsx
new file mode 100644
index 0000000..0fbc7e0
--- /dev/null
+++ b/apps/core/widget/icons/video.jsx
@@ -0,0 +1,22 @@
+const Video = () => {
+ return (
+
+
+
+
+ );
+};
+
+return { Video };
diff --git a/apps/core/widget/icons/x.jsx b/apps/core/widget/icons/x.jsx
new file mode 100644
index 0000000..073ccbb
--- /dev/null
+++ b/apps/core/widget/icons/x.jsx
@@ -0,0 +1,12 @@
+const X = () => {
+ return (
+
+
+
+ );
+};
+
+return { X };
diff --git a/apps/every.near/widget/thing.jsx b/apps/core/widget/thing.jsx
similarity index 100%
rename from apps/every.near/widget/thing.jsx
rename to apps/core/widget/thing.jsx
diff --git a/apps/devs.near/bos.config.json b/apps/devs.near/bos.config.json
deleted file mode 100644
index 25f7b18..0000000
--- a/apps/devs.near/bos.config.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "appAccount": "devs.near"
-}
\ No newline at end of file
diff --git a/apps/devs.near/widget/Community.jsx b/apps/devs.near/widget/Community.jsx
deleted file mode 100644
index 3c4798d..0000000
--- a/apps/devs.near/widget/Community.jsx
+++ /dev/null
@@ -1,179 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-
-const creatorId = props.creatorId ?? "hack.near";
-const pageId = props.pageId ?? "community.page";
-
-return (
- <>
-
- >
-);
-ine-block;
- background: #efa9ca;
- border-radius: 20px;
- position: relative;
- padding: 0.1em 0.2em 0;
-
- svg {
- position: absolute;
- bottom: -8px;
- right: -10px;
- width: 24px;
- }
- }
-
- @media (max-width: 900px) {
- font-size: 50px;
-
- span {
- border-radius: 12px;
- svg {
- position: absolute;
- bottom: -6px;
- right: -7px;
- width: 16px;
- }
- }
- }
-`;
-
-const Text = styled.p`
- font-family: "FK Grotesk", sans-serif;
- font-size: ${(p) => p.size ?? "18px"};
- line-height: ${(p) => p.lineHeight ?? "1.5"};
- font-weight: ${(p) => p.weight ?? "400"};
- color: ${(p) => p.color ?? "#000"};
- margin: 0;
-`;
-
-const Flex = styled.div`
- display: flex;
- gap: ${(p) => p.gap};
- align-items: ${(p) => p.alignItems};
- justify-content: ${(p) => p.justifyContent};
- flex-direction: ${(p) => p.direction ?? "row"};
- flex-wrap: ${(p) => p.wrap ?? "nowrap"};
-
- ${(p) =>
- p.mobileStack &&
- `
- @media (max-width: 900px) {
- flex-direction: column;
- gap: var(--section-gap);
- }
- `}
-`;
-
-const Content = styled.div`
- @media (max-width: 1200px) {
- > div:first-child {
- }
- }
-`;
-
-const Container = styled.div`
- display: flex;
- max-width: 1060px;
- margin: 0 auto;
- gap: ${(p) => p.gap ?? "var(--section-gap)"};
- flex-direction: column;
- align-items: ${(p) => (p.center ? "center" : undefined)};
- justify-content: ${(p) => (p.center ? "center" : undefined)};
- text-align: ${(p) => (p.center ? "center" : undefined)};
- padding: var(--section-gap) 23px;
-`;
-
-return (
-
- {!isOwner && (
-
-
-
-
- NDC{" "}
-
-
-
-
- Work Groups
-
-
-
- )}
-
-
- {!isOwner ? (
-
- {!accountId ? (
-
- ) : (
-
- )}
-
- ) : (
-
-
-
- )}
-
-
-
-
- Made Possible by{" "}
-
- NDC
-
-
-
-
-
-
-);
diff --git a/apps/devs.near/widget/Compose.jsx b/apps/devs.near/widget/Compose.jsx
deleted file mode 100644
index 203c52c..0000000
--- a/apps/devs.near/widget/Compose.jsx
+++ /dev/null
@@ -1,99 +0,0 @@
-if (!context.accountId) {
- return "";
-}
-
-const index = props.index || {
- post: JSON.stringify({
- key: "main",
- value: {
- type: "md",
- },
- }),
-};
-
-const composeData = () => {
- if (props.appendHashtags) {
- state.content.text = props.appendHashtags(state.content.text);
- }
- const data = {
- post: {
- main: JSON.stringify(state.content),
- },
- index,
- };
-
- const item = {
- type: "social",
- path: `${context.accountId}/post/main`,
- };
-
- const notifications = state.extractMentionNotifications(
- state.content.text,
- item
- );
-
- if (notifications.length) {
- data.index.notify = JSON.stringify(
- notifications.length > 1 ? notifications : notifications[0]
- );
- }
-
- const hashtags = state.extractHashtags(state.content.text);
-
- if (hashtags.length) {
- data.index.hashtag = JSON.stringify(
- hashtags.map((hashtag) => ({
- key: hashtag,
- value: item,
- }))
- );
- }
-
- return data;
-};
-
-State.init({
- onChange: ({ content }) => {
- State.update({ content });
- },
-});
-
-return (
- <>
-
- {
- State.update({ extractMentionNotifications, extractHashtags });
- },
- composeButton: (onCompose) => (
- {
- onCompose();
- }}
- >
- Post
-
- ),
- }}
- />
-
- {state.content && (
-
- )}
- >
-);
diff --git a/apps/devs.near/widget/ContextMenu.jsx b/apps/devs.near/widget/ContextMenu.jsx
deleted file mode 100644
index f8c426b..0000000
--- a/apps/devs.near/widget/ContextMenu.jsx
+++ /dev/null
@@ -1,66 +0,0 @@
-const Wrapper = styled.div`
- padding: 6px;
- min-width: 200px;
- width: 200px;
- border-radius: 6px;
- box-shadow: 0 3px 15px -3px rgba(13, 20, 33, 0.13);
- display: flex;
- flex-direction: column;
- border: 1px solid #e8e8eb;
- background-color: #fff;
- gap: 1px;
-
- .menu__item {
- padding: 3px;
- display: flex;
- color: #000;
- border-radius: 6px;
- cursor: pointer;
-
- &:hover {
- background-color: #eff2f5;
- }
- }
- .menu__item__icon {
- font-size: 14px;
- border-radius: 5px;
- box-shadow: 0 0 0 1px rgba(201, 201, 204, 0.48);
- background: #fff;
- color: #000;
- height: 26px;
- width: 26px;
- display: flex;
- margin-right: 10px;
- justify-content: center;
- align-items: center;
- }
-`;
-
-function ContextMenu({ Item, passProps, handlers, items }) {
- return (
-
-
-
-
-
-
-
-
- {handlers &&
- Object.keys(handlers).map((key) => {
- return (
- handlers[key](passProps[key])}
- >
- {items[key]()}
-
- );
- })}
-
-
-
- );
-}
-
-return { ContextMenu };
\ No newline at end of file
diff --git a/apps/devs.near/widget/Feed.jsx b/apps/devs.near/widget/Feed.jsx
deleted file mode 100644
index a4db46d..0000000
--- a/apps/devs.near/widget/Feed.jsx
+++ /dev/null
@@ -1,89 +0,0 @@
-const Feed = ({ index, typeWhitelist, Item, Layout, showCompose }) => {
- Item = Item || ((props) => {JSON.stringify(props)}
);
- Layout = Layout || (({ children }) => children);
-
- const renderItem = (a, i) => {
- if (typeWhitelist && !typeWhitelist.includes(a.value.type)) {
- return false;
- }
- return (
-
-
-
- );
- };
-
- const composeIndex = () => {
- const arr = Array.isArray(index) ? index : [index];
-
- const grouped = arr.reduce((acc, i) => {
- if (i.action !== "repost") {
- if (!acc[i.action]) {
- acc[i.action] = [];
- }
- acc[i.action].push({ key: i.key, value: { type: "md" } });
- }
- return acc;
- }, {});
-
- Object.keys(grouped).forEach((action) => {
- if (grouped[action].length === 1) {
- grouped[action] = grouped[action][0];
- }
- grouped[action] = JSON.stringify(grouped[action]);
- });
-
- return grouped;
- };
-
- const appendHashtags = (v) => {
- const arr = Array.isArray(index) ? index : [index];
- const hashtags = arr
- .filter((i) => i.action === "hashtag")
- .map((i) => i.key);
-
- hashtags.forEach((hashtag) => {
- if (v.toLowerCase().includes(`#${hashtag.toLowerCase()}`)) return;
- else v += ` #${hashtag}`;
- });
-
- return v;
- };
-
- return (
- <>
- {showCompose && (
-
- )}
- {Array.isArray(index) ? (
- {children} ,
- }}
- />
- ) : (
- {children} ,
- }}
- />
- )}
- >
- );
-};
-
-return { Feed };
diff --git a/apps/devs.near/widget/GitBos/info.jsx b/apps/devs.near/widget/GitBos/info.jsx
deleted file mode 100644
index e9fc7ee..0000000
--- a/apps/devs.near/widget/GitBos/info.jsx
+++ /dev/null
@@ -1,76 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const creatorId = props.creatorId ?? "devs.near";
-const groupId = props.groupId ?? "builders";
-
-const joined = Social.keys(`${creatorId}/graph/${groupId}/${accountId}/**`);
-
-const requested = Social.keys(`${accountId}/graph/${groupId}/${accountId}/**`);
-const numRequested = requested ? Object.keys(requested || {}).length : null;
-
-const isMember = numRequested > 0;
-
-const handleJoin = () => {
- Social.set({
- graph: { [groupId]: { [accountId]: "" } },
- index: {
- graph: JSON.stringify({
- key: groupId,
- value: {
- accountId,
- },
- }),
- notify: JSON.stringify({
- key: creatorId,
- value: {
- accountId,
- message: "membership request",
- },
- }),
- },
- });
-};
-
-return (
-
-);
diff --git a/apps/devs.near/widget/GitBos/kit.jsx b/apps/devs.near/widget/GitBos/kit.jsx
deleted file mode 100644
index 557d466..0000000
--- a/apps/devs.near/widget/GitBos/kit.jsx
+++ /dev/null
@@ -1,59 +0,0 @@
-const kit = context.accountId
- ? Social.get(`${context.accountId}/settings/near.builders/kit`)
- : undefined;
-
-if (kit === null) {
- return "";
-}
-
-const defaultWidgets = [
- {
- src: "devs.near/widget/GitBos.info",
- },
- {
- src: "devs.near/widget/dev.collab",
- },
-];
-
-const widgets = (kit && JSON.parse(kit)) ?? defaultWidgets;
-
-const Div = styled.div`
- position: relative;
- @media (hover: hover) {
- > .edit-link {
- display: none;
- }
- }
- &:hover {
- > .edit-link {
- display: inline;
- }
- }
-`;
-
-return (
-
-
-
Welcome Builders!
- {context.accountId && (
-
- Customize
-
- )}
-
-
- {widgets.map(
- ({ src, requiresLogin }, i) =>
- (!requiresLogin || context.accountId) && (
-
-
-
- )
- )}
-
-
-);
diff --git a/apps/devs.near/widget/GitBos/kit/editor.jsx b/apps/devs.near/widget/GitBos/kit/editor.jsx
deleted file mode 100644
index a6b31ed..0000000
--- a/apps/devs.near/widget/GitBos/kit/editor.jsx
+++ /dev/null
@@ -1,144 +0,0 @@
-const accountId = context.accountId;
-
-const kit = context.accountId
- ? Social.get(`${context.accountId}/settings/near.builders/kit`)
- : undefined;
-
-if (kit === null) {
- return "";
-}
-
-const defaultWidgets = [
- {
- src: "devs.near/widget/GitBos.info",
- },
- {
- src: "devs.near/widget/dev.collab",
- },
-];
-
-const settingWidgets = kit && JSON.parse(kit);
-
-if (state.widgets === undefined) {
- const widgets = settingWidgets ?? defaultWidgets;
- State.update({ widgets });
-}
-
-const move = (fromIndex, toIndex) => {
- const widget = state.widgets.splice(fromIndex, 1)[0];
- if (toIndex !== undefined) {
- state.widgets.splice(toIndex, 0, widget);
- }
- State.update();
-};
-
-const renderMenu = (src, requireLogin, index) => {
- return (
-
-
{src}
-
move(index, index - 1)}
- >
-
-
-
move(index, index + 1)}
- >
-
-
-
move(index, 0)}
- >
-
-
-
move(index, state.widgets.length - 1)}
- >
-
-
-
move(index, undefined)}
- >
- Remove
-
-
- );
-};
-
-const openButton = ({ widgetPath: src, onHide }) => {
- return (
- {
- state.widgets.splice(0, 0, { src });
- State.update();
- onHide();
- }}
- >
- Add
-
- );
-};
-
-return (
- <>
- GitBos Kit
-
-
-
-
-
- Update
-
- {settingWidgets &&
- JSON.stringify(state.widgets) !== JSON.stringify(settingWidgets) && (
- State.update({ widgets: settingWidgets })}
- >
- Revert
-
- )}
- {JSON.stringify(state.widgets) !== JSON.stringify(defaultWidgets) && (
- State.update({ widgets: defaultWidgets })}
- >
- Reset
-
- )}
-
-
- {state.widgets.map(({ src, requiresLogin }, i) => (
-
- {renderMenu(src, requireLogin, i)}
-
-
-
-
- ))}
- >
-);
diff --git a/apps/devs.near/widget/GithubForkButton.jsx b/apps/devs.near/widget/GithubForkButton.jsx
deleted file mode 100644
index 32857da..0000000
--- a/apps/devs.near/widget/GithubForkButton.jsx
+++ /dev/null
@@ -1,19 +0,0 @@
-const username = props.username ?? "near-everything";
-const repository = props.repository ?? "bos-workspace";
-
-const GithubForkButton = styled.a`
- cursor: pointer;
- text-decoration: none;
-`;
-
-const Button = styled.button``;
-
-return (
-
- Fork this repository on GitHub
-
-);
diff --git a/apps/devs.near/widget/Library.jsx b/apps/devs.near/widget/Library.jsx
deleted file mode 100644
index c164e5b..0000000
--- a/apps/devs.near/widget/Library.jsx
+++ /dev/null
@@ -1,270 +0,0 @@
-/**
- * This is just a direct copy of mob.near/widget/N.Library
- */
-const accountId = context.accountId || "root.near";
-const authorId = "mob.near";
-
-const itemDescription =
- 'The identifier item. It will be used as a unique identifier of the entity that receives the action. It\'s also used as a key of the action in the index.\nThe item should be an object with the following keys: `type`, `path` and optional `blockHeight`.\n- `type`: If the data is stored in the social DB, then the type is likely `"social"`, other types can be defined in the standards.\n- `path`: The path to the item. For a `"social"` type, it\'s absolute path within SocialDB, e.g. `alice.near/post/main`.\n- `blockHeight`: An optional paremeter to indicate the block when the data was stored. Since SocialDB data can be overwritten to save storage, the exact data should be referenced by the block height (e.g. for a given post). But if the latest data should be used, then `blockHeight` should be ommited.\n\nExamples of `item`:\n- `{type: "social", path: "mob.near/widget/N.Library"}`\n- `{type: "social", path: "mob.near/post/main", blockHeight: 81101335}`\n';
-
-const components = [
- {
- title: "Feed",
- // category: "Profile",
- widgetName: "Feed",
- description:
- "",
- // demoProps: { accountId },
- // requiredProps: {
- // accountId: "The account ID of the profile",
- // },
- // optionalProps: {
- // profile: "Object that holds profile information to display",
- // fast: "Render profile picture faster using external cache, default true if the `props.profile` is not provided",
- // hideDescription: "Don't show description, default false",
- // },
- },
- {
- title: "Context Menu",
- // category: "Profile",
- widgetName: "ContextMenu",
- description:
- "",
- // demoProps: { accountId, tooltip: true },
- // requiredProps: {
- // accountId: "The account ID of the profile",
- // },
- // optionalProps: {
- // profile: "Object that holds profile information to display",
- // fast: "Render profile picture faster using external cache, default true if the `props.profile` is not provided",
- // tooltip:
- // "Display overlay tooltip when you hover over the profile, default false",
- // },
- },
- {
- title: "Router",
- // category: "Profile",
- widgetName: "Router",
- description:
- "",
- // demoProps: { accountId, tooltip: true },
- // requiredProps: {
- // accountId: "The account ID of the profile",
- // },
- // optionalProps: {
- // link: "Whether to make profile clickable with a link to the profile page, default true.",
- // hideAccountId: "Don't show account ID, default false",
- // hideName: "Don't show profile name, default false",
- // hideImage: "Don't show profile picture, default false",
- // hideCheckmark: "Don't show premium checkmark, default false",
- // profile: "Object that holds profile information to display",
- // fast: "Render profile picture faster using external cache, default true if the `props.profile` is not provided",
- // title:
- // 'Optional title when you hover over the profile. Default `"${name} ${accountId}"`',
- // tooltip:
- // "Display overlay tooltip or title when you hover over the profile, default false. Will display a custom title if tooltip is given. If tooltip is true, the full tooltip is displayed. Default false",
- // },
- },
-];
-
-const renderProps = (props, optional) => {
- return Object.entries(props || {}).map(([key, desc]) => {
- return (
-
-
-
- {key}
-
-
-
-
-
-
- );
- });
-};
-
-const renderComponent = (c, i) => {
- const widgetSrc = `${authorId}/widget/${c.widgetName}`;
- const embedCode = ` ` ${s}`)
- .join("\n")}}}\n/>\n`;
- const id = c.title.toLowerCase().replaceAll(" ", "-");
- return (
-
-
-
- {c.title}
-
-
{c.description}
-
Preview
-
-
-
-
Component
-
-
Props
-
-
-
- Key
- Description
-
-
-
- {renderProps(c.requiredProps)}
- {renderProps(c.optionalProps, true)}
-
-
-
Example
-
-
- );
-};
-
-const renderMenuItem = (c, i) => {
- const prev = i ? components[i - 1] : null;
- const res = [];
- if (!prev || prev.category !== c.category) {
- res.push(
-
- {c.category}
-
- );
- }
- const id = c.title.toLowerCase().replaceAll(" ", "-");
- res.push(
-
- );
- return res;
-};
-
-const Wrapper = styled.div`
-@media(min-width: 992px) {
- .b-s {
- border-left: 1px solid #eee;
- }
- .b-e {
- border-right: 1px solid #eee;
- }
-}
-.category:not(:first-child) {
- margin-top: 1em;
-}
-.component {
- padding: 0.5em 12px;
- padding-bottom: 0;
- margin-bottom: 3em;
- margin: 0 -12px 3em;
- position: relative;
-
- &:hover {
- background: rgba(0, 0, 0, 0.03);
- }
-
- .anchor {
- position: absolute;
- top: -70px;
- }
-
- table {
- background: white;
- }
-
- label {
- font-size: 20px;
- }
-
- .code {
- display: inline-flex;
- line-height: normal;
- border-radius: 0.3em;
- padding: 0 4px;
- border: 1px solid #ddd;
- background: rgba(0, 0, 0, 0.03);
- font-family: var(--bs-font-monospace);
- }
- .path {
-
- }
- .preview {
- background-color: white;
- padding: 12px;
- border: 1px solid #eee;
- border-radius: 12px;
- pre {
- margin-bottom: 0;
- }
- }
- .props {
- .prop-key {
- font-weight: 600;
- &.optional {
- font-weight: normal;
- }
- }
- .prop-desc {
- p {
- margin-bottom: 0;
- }
- }
- }
- .embed-code {
- position: relative;
-
- .embed-copy {
- position: absolute;
- top: 18px;
- right: 10px;
- }
- }
-}
-`;
-
-return (
-
- Social Components Library
-
- This library contains common social components used by near.social
-
-
-
{components.map(renderMenuItem)}
-
{components.map(renderComponent)}
-
-
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/Livepeer/Creator.jsx b/apps/devs.near/widget/Livepeer/Creator.jsx
deleted file mode 100644
index dde309e..0000000
--- a/apps/devs.near/widget/Livepeer/Creator.jsx
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Livepeer Creator
- *
- * Widget for uploading a video to Livepeer
- * (https://docs.livepeer.org/reference/livepeer-js/asset/useCreateAsset)
- *
- * Props:
- * @prop {File} video - the video file to upload
- * @prop {Object} metadata - the metadata for the video
- * @prop {Function} handleStatus - a callback for status updates
- * @prop {Function} handleProgress - a callback for progress updates
- * @prop {Function} handleError - a callback for error updates
- * @prop {Function} handleAssets - a callback for asset updates
- * @prop {Function} Button - a component to render the button
- * @prop {Boolean} debug - whether to log debug messages
- */
-
-function handleStatus(status) {
- if (props.debug) {
- console.log("status", status);
- }
- if (props.handleStatus) {
- props.handleStatus(status);
- }
-}
-
-function handleProgress(progress) {
- if (props.debug) {
- console.log("progress", progress);
- }
- if (props.handleProgress) {
- props.handleProgress(progress);
- }
-}
-
-function handleAssets(assets) {
- if (props.debug) {
- console.log("assets", assets);
- }
- if (props.handleAssets) {
- props.handleAssets(assets);
- }
-}
-
-function handleError(error) {
- if (props.debug) {
- console.log("error", error);
- }
- if (props.handleError) {
- props.handleError(error);
- }
-}
-
-function Button({ disabled, onClick }) {
- // TODO : Livepeer branded button
- return (
-
- upload to Livepeer
-
- );
-}
-
-return (
-
-);
diff --git a/apps/devs.near/widget/MetadataEditor.jsx b/apps/devs.near/widget/MetadataEditor.jsx
deleted file mode 100644
index 9bc3fa0..0000000
--- a/apps/devs.near/widget/MetadataEditor.jsx
+++ /dev/null
@@ -1,125 +0,0 @@
-const initialMetadata = props.initialMetadata ?? {};
-const onChange = props.onChange;
-const options = props.options;
-
-State.init({
- initialMetadata,
- metadata: initialMetadata,
- reportedMetadata: initialMetadata,
- linktree: initialMetadata.linktree ?? {},
- image: initialMetadata.image,
- backgroundImage: initialMetadata.backgroundImage,
- screenshots: initialMetadata.screenshots ?? {},
-});
-
-const metadata = {
- name: options.name ? state.metadata.name : undefined,
- description: options.name ? state.metadata.description : undefined,
- linktree:
- options.linktree && Object.keys(state.linktree).length > 0
- ? state.linktree
- : undefined,
- image:
- options.image && state.image && Object.keys(state.image).length > 0
- ? state.image
- : undefined,
- backgroundImage:
- options.backgroundImage &&
- state.backgroundImage &&
- Object.keys(state.backgroundImage).length > 0
- ? state.backgroundImage
- : undefined,
- tags: options.tags ? state.metadata.tags : undefined,
- screenshots: options.screenshots ? state.metadata.screenshots : undefined,
-};
-
-if (
- onChange &&
- JSON.stringify(state.reportedMetadata) !== JSON.stringify(metadata)
-) {
- State.update({
- reportedMetadata: metadata,
- });
- onChange(metadata);
-}
-
-return (
- <>
- {options.name && (
-
- {options.name.label ?? "Name"}
-
-
- )}
- {options.image && (
-
- {options.image.label ?? "Image"}
- State.update({ image }),
- }}
- />
-
- )}
- {options.backgroundImage && (
-
- {options.backgroundImage.label ?? "Background image"}
- State.update({ backgroundImage }),
- }}
- />
-
- )}
- {options.description && (
-
- {options.description.label ?? "Description"}
- (supports markdown)
-
- )}
- {options.tags && (
-
-
- {options.tags.label ?? "Give Context with Tags:"}
-
-
{
- state.metadata.tags = tags;
- State.update();
- },
- }}
- />
-
- )}
- {options.linktree &&
- (options.linktree.links ?? []).map((link) => (
-
- {link.label}
-
- {link.prefix}
-
-
-
- ))}
- >
-);
diff --git a/apps/devs.near/widget/Module/ContextMenu.jsx b/apps/devs.near/widget/Module/ContextMenu.jsx
deleted file mode 100644
index 3c0caab..0000000
--- a/apps/devs.near/widget/Module/ContextMenu.jsx
+++ /dev/null
@@ -1,66 +0,0 @@
-const Wrapper = styled.div`
- padding: 6px;
- min-width: 200px;
- width: 200px;
- border-radius: 6px;
- box-shadow: 0 3px 15px -3px rgba(13, 20, 33, 0.13);
- display: flex;
- flex-direction: column;
- border: 1px solid #e8e8eb;
- background-color: #fff;
- gap: 1px;
-
- .menu__item {
- padding: 3px;
- display: flex;
- color: #000;
- border-radius: 6px;
- cursor: pointer;
-
- &:hover {
- background-color: #eff2f5;
- }
- }
- .menu__item__icon {
- font-size: 14px;
- border-radius: 5px;
- box-shadow: 0 0 0 1px rgba(201, 201, 204, 0.48);
- background: #fff;
- color: #000;
- height: 26px;
- width: 26px;
- display: flex;
- margin-right: 10px;
- justify-content: center;
- align-items: center;
- }
-`;
-
-function ContextMenu({ Item, passProps, handlers, items }) {
- return (
-
-
-
-
-
-
-
-
- {handlers &&
- Object.keys(handlers).map((key) => {
- return (
- handlers[key](passProps[key])}
- >
- {items[key]()}
-
- );
- })}
-
-
-
- );
-}
-
-return { ContextMenu };
diff --git a/apps/devs.near/widget/Module/Feed.jsx b/apps/devs.near/widget/Module/Feed.jsx
deleted file mode 100644
index 260c94a..0000000
--- a/apps/devs.near/widget/Module/Feed.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-function Feed({ index, Item, Layout, typeWhitelist }) {
- Item = Item || ((props) => {JSON.stringify(props)}
);
- Layout = Layout || (({ children }) => children);
-
- const renderItem = (item, i) => {
- if (typeWhitelist && !typeWhitelist.includes(item.value.type)) {
- return false;
- }
- return (
-
-
-
- );
- };
-
- if (Array.isArray(index)) {
- return (
- {children} ,
- }}
- />
- );
- } else {
- return (
- {children} ,
- }}
- />
- );
- }
-}
-
-return { Feed };
diff --git a/apps/devs.near/widget/Module/Feed/demo.jsx b/apps/devs.near/widget/Module/Feed/demo.jsx
deleted file mode 100644
index d93e638..0000000
--- a/apps/devs.near/widget/Module/Feed/demo.jsx
+++ /dev/null
@@ -1,131 +0,0 @@
-const propsTable = `
-
-| Prop Name | Type/Values | Default Value | Description |
-|-----------------|-----------------|----------------|----------------------------------------------------|
-| ${"`index`"} | Object/Array | ${"`N/A`"} | The index to query for the feed. Follows props for Social.index. |
-| ${"`Item`"} | Function/ReactNode | {JSON.stringify(props)}
| The Item to render for each feed item, will be passed the full object as props |
-| ${"`Layout`"} | Function/reactNode | ${"`N/A`"} | Optional Layout element for rendering the feed. |
-| ${"`typeWhitelist`"}| Array | ${"['md']"} | Optional whitelist for the item type to allow render. |
-`;
-
-const widgetCode = `
-\`\`\`jsx
-const { Feed } = VM.require("devs.near/widget/Module.Feed");
-
-Feed = Feed || (() => <>>); // make sure you have this or else it can break
-
-return (
- {
- return
- }}
- Layout={Grid}
- />
-);
-\`\`\`
-`;
-
-const { Feed } = VM.require("devs.near/widget/Module.Feed");
-
-Feed = Feed || (() => <>>); // make sure you have this or else it can break
-
-return (
-
-
-
-
-
-
-
- (
- }
- src="mob.near/widget/MainPage.N.Post"
- props={{ accountId: p.accountId, blockHeight: p.blockHeight }}
- />
- )}
- />
-
-
-);
diff --git a/apps/devs.near/widget/Module/Modal.jsx b/apps/devs.near/widget/Module/Modal.jsx
deleted file mode 100644
index 3c35a6c..0000000
--- a/apps/devs.near/widget/Module/Modal.jsx
+++ /dev/null
@@ -1,39 +0,0 @@
-const ModalOverlay = styled.div`
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, 0.7);
- display: flex;
- justify-content: center;
- align-items: center;
-`;
-
-const ModalContent = styled.div`
- width: 80%;
- background-color: #fff;
- padding: 20px;
- border-radius: 8px;
-`;
-
-const CloseButton = styled.button`
- margin-top: 20px;
- display: block;
- margin-left: auto;
-`;
-
-const Modal = ({ isOpen, onClose, children }) => {
- if (!isOpen) return null;
-
- return (
-
-
- {children}
- Close
-
-
- );
-};
-
-return { Modal };
diff --git a/apps/devs.near/widget/MonacoEditor.jsx b/apps/devs.near/widget/MonacoEditor.jsx
deleted file mode 100644
index 4d8ddf8..0000000
--- a/apps/devs.near/widget/MonacoEditor.jsx
+++ /dev/null
@@ -1,22 +0,0 @@
-const path = props.path;
-const defaultValue = props.defaultValue || "";
-const language = props.language || "javascript";
-const onChange = props.onChange || (() => {});
-
-const height = props.height || "100vh";
-
-const Container = styled.div`
- height: ${height};
- width: 100%;
-`;
-
-return (
-
-
-
-);
diff --git a/apps/devs.near/widget/Navigator.jsx b/apps/devs.near/widget/Navigator.jsx
deleted file mode 100644
index 701f4c8..0000000
--- a/apps/devs.near/widget/Navigator.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * TODO: Make super generic header bar with ability to change theming on it.
- */
-
-const RouterLink = props.RouterLink;
-
-return (
-
- {Object.keys(props.routes).map((route) => (
- hey
- ))}
-
-);
diff --git a/apps/devs.near/widget/Notification/Item.jsx b/apps/devs.near/widget/Notification/Item.jsx
deleted file mode 100644
index a12bc2f..0000000
--- a/apps/devs.near/widget/Notification/Item.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-const { value } = props;
-
-const loading =
;
-
-const widgetSrc =
- value.type === "follow" || value.type === "unfollow"
- ? "mob.near/widget/Notification.Item.Follow"
- : value.type === "poke"
- ? "mob.near/widget/Notification.Item.Poke"
- : value.type === "like"
- ? "mob.near/widget/Notification.Item.Like"
- : value.type === "comment"
- ? "mob.near/widget/Notification.Item.Comment"
- : value.type && value.type?.startsWith("devgovgigs/")
- ? "mob.near/widget/Notification.Item.DevGov"
- : value.type === "mention"
- ? "mob.near/widget/Notification.Item.Mention"
- : value.type === "repost"
- ? "mob.near/widget/Notification.Item.Repost"
- : value.type === "chess-game"
- ? "chess-game.near/widget/Notification.Item.ChessGame@98857466"
- : value.type === "request"
- ? "hack.near/widget/Notification.Item.Request"
- : null;
-
-return (
-
- {widgetSrc ? (
-
- ) : (
-
- Unknown notification:{" "}
- {JSON.stringify(value)}
-
- )}
-
-);
diff --git a/apps/devs.near/widget/PR/FilteredIndexFeed.jsx b/apps/devs.near/widget/PR/FilteredIndexFeed.jsx
deleted file mode 100644
index e4d3c18..0000000
--- a/apps/devs.near/widget/PR/FilteredIndexFeed.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-const filter = context.accountId && {
- ignore: Social.getr(`${context.accountId}/graph/hide`),
-};
-
-return (
-
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/PR/IndexFeed.jsx b/apps/devs.near/widget/PR/IndexFeed.jsx
deleted file mode 100644
index 61d978b..0000000
--- a/apps/devs.near/widget/PR/IndexFeed.jsx
+++ /dev/null
@@ -1,192 +0,0 @@
-const index = JSON.parse(JSON.stringify(props.index));
-if (!index) {
- return "props.index is not defined";
-}
-
-const filter = props.filter;
-
-const renderItem =
- props.renderItem ??
- ((item, i) => (
-
- #{item.blockHeight}: {JSON.stringify(item)}
-
- ));
-const cachedRenderItem = (item, i) => {
- const key = JSON.stringify(item);
-
- if (!(key in state.cachedItems)) {
- state.cachedItems[key] = renderItem(item, i);
- State.update();
- }
- return state.cachedItems[key];
-};
-
-index.options = index.options || {};
-const initialRenderLimit =
- props.initialRenderLimit ?? index.options.limit ?? 10;
-const addDisplayCount = props.nextLimit ?? initialRenderLimit;
-
-index.options.limit = Math.min(
- Math.max(initialRenderLimit + addDisplayCount * 2, index.options.limit ?? 0),
- 100
-);
-const reverse = !!props.reverse;
-
-const initialItems = Social.index(index.action, index.key, index.options);
-if (initialItems === null) {
- return "";
-}
-
-const computeFetchFrom = (items, limit) => {
- if (!items || items.length < limit) {
- return false;
- }
- const blockHeight = items[items.length - 1].blockHeight;
- return index.options.order === "desc" ? blockHeight - 1 : blockHeight + 1;
-};
-
-const mergeItems = (newItems) => {
- const items = [
- ...new Set([...newItems, ...state.items].map((i) => JSON.stringify(i))),
- ].map((i) => JSON.parse(i));
- items.sort((a, b) => a.blockHeight - b.blockHeight);
- if (index.options.order === "desc") {
- items.reverse();
- }
- return items;
-};
-
-const jInitialItems = JSON.stringify(initialItems);
-if (state.jInitialItems !== jInitialItems) {
- const jIndex = JSON.stringify(index);
- const nextFetchFrom = computeFetchFrom(initialItems, index.options.limit);
- if (jIndex !== state.jIndex || nextFetchFrom !== state.initialNextFetchFrom) {
- State.update({
- jIndex,
- jInitialItems,
- items: initialItems,
- fetchFrom: false,
- initialNextFetchFrom: nextFetchFrom,
- nextFetchFrom,
- displayCount: initialRenderLimit,
- cachedItems: {},
- });
- } else {
- State.update({
- jInitialItems,
- items: mergeItems(initialItems),
- });
- }
-}
-
-if (state.fetchFrom) {
- const limit = addDisplayCount;
- const newItems = Social.index(
- index.action,
- index.key,
- Object.assign({}, index.options, {
- from: state.fetchFrom,
- subscribe: undefined,
- limit,
- })
- );
- if (newItems !== null) {
- State.update({
- items: mergeItems(newItems),
- fetchFrom: false,
- nextFetchFrom: computeFetchFrom(newItems, limit),
- });
- }
-}
-
-const filteredItems = state.items;
-if (filter) {
- if (filter.ignore) {
- filteredItems = filteredItems.filter(
- (item) => !(item.accountId in filter.ignore)
- );
- }
-}
-
-const maybeFetchMore = () => {
- if (
- filteredItems.length - state.displayCount < addDisplayCount * 2 &&
- !state.fetchFrom &&
- state.nextFetchFrom &&
- state.nextFetchFrom !== state.fetchFrom
- ) {
- State.update({
- fetchFrom: state.nextFetchFrom,
- });
- }
-};
-
-maybeFetchMore();
-
-const makeMoreItems = () => {
- State.update({
- displayCount: state.displayCount + addDisplayCount,
- });
- maybeFetchMore();
-};
-
-const loader = (
-
-
- Loading ...
-
-);
-
-const fetchMore =
- props.manual &&
- !props.hideFetchMore &&
- (state.fetchFrom && filteredItems.length < state.displayCount
- ? loader
- : state.displayCount < filteredItems.length && (
-
- ));
-
-const items = filteredItems ? filteredItems.slice(0, state.displayCount) : [];
-if (reverse) {
- items.reverse();
-}
-
-const renderedItems = items.map(cachedRenderItem);
-const Layout = props.Layout;
-
-return props.manual ? (
- <>
- {reverse && fetchMore}
- {renderedItems}
- {!reverse && fetchMore}
- >
-) : (
-
-
- Loading ...
-
- }
- >
- {props.headerElement}
- {Layout ? {renderedItems} : <>{renderedItems}>}
- {props.footerElement}
-
-);
diff --git a/apps/devs.near/widget/PR/MergedIndexFeed.jsx b/apps/devs.near/widget/PR/MergedIndexFeed.jsx
deleted file mode 100644
index 4e2443b..0000000
--- a/apps/devs.near/widget/PR/MergedIndexFeed.jsx
+++ /dev/null
@@ -1,259 +0,0 @@
-if (!props.index) {
- return "props.index is not defined";
-}
-const indices = JSON.parse(
- JSON.stringify(Array.isArray(props.index) ? props.index : [props.index])
-);
-
-const filter = props.filter;
-
-const renderItem =
- props.renderItem ??
- ((item) => (
-
- #{item.blockHeight}: {JSON.stringify(item)}
-
- ));
-const cachedRenderItem = (item, i) => {
- const key = JSON.stringify(item);
-
- if (!(key in state.cachedItems)) {
- state.cachedItems[key] = renderItem(item, i);
- State.update();
- }
- return state.cachedItems[key];
-};
-
-const initialRenderLimit = props.initialRenderLimit ?? 10;
-const addDisplayCount = props.nextLimit ?? initialRenderLimit;
-const reverse = !!props.reverse;
-
-const computeFetchFrom = (items, limit, desc) => {
- if (!items || items.length < limit) {
- return false;
- }
- const blockHeight = items[items.length - 1].blockHeight;
- return desc ? blockHeight - 1 : blockHeight + 1;
-};
-
-const mergeItems = (iIndex, oldItems, newItems, desc) => {
- const index = indices[iIndex];
- const items = [
- ...new Set(
- [
- ...newItems.map((item) => ({
- ...item,
- action: index.action,
- key: index.key,
- index: iIndex,
- })),
- ...oldItems,
- ].map((i) => JSON.stringify(i))
- ),
- ].map((i) => JSON.parse(i));
- items.sort((a, b) => a.blockHeight - b.blockHeight);
- if (desc) {
- items.reverse();
- }
- return items;
-};
-
-const jIndices = JSON.stringify(indices);
-if (jIndices !== state.jIndices) {
- State.update({
- jIndices,
- feeds: indices.map(() => ({})),
- items: [],
- displayCount: initialRenderLimit,
- cachedItems: {},
- });
-}
-
-let stateChanged = false;
-for (let iIndex = 0; iIndex < indices.length; ++iIndex) {
- const index = indices[iIndex];
- const feed = state.feeds[iIndex];
- let feedChanged = false;
- index.options = index.options || {};
- index.options.limit = Math.min(
- Math.max(initialRenderLimit + addDisplayCount * 2, index.options.limit),
- 100
- );
- const desc = index.options.order === "desc";
-
- const initialItems = Social.index(
- index.action,
- index.key,
- index.options,
- index.cacheOptions
- );
- if (initialItems === null) {
- continue;
- }
-
- const jInitialItems = JSON.stringify(initialItems);
- const nextFetchFrom = computeFetchFrom(
- initialItems,
- index.options.limit,
- desc
- );
- if (feed.jInitialItems !== jInitialItems) {
- feed.jInitialItems = jInitialItems;
- feedChanged = true;
- if (nextFetchFrom !== feed.initialNextFetchFrom) {
- feed.fetchFrom = false;
- feed.items = mergeItems(iIndex, [], initialItems, desc);
- feed.initialNextFetchFrom = nextFetchFrom;
- feed.nextFetchFrom = nextFetchFrom;
- } else {
- feed.items = mergeItems(iIndex, feed.items, initialItems, desc);
- }
- }
-
- feed.usedCount = 0;
-
- if (feedChanged) {
- state.feeds[iIndex] = feed;
- stateChanged = true;
- }
-}
-
-// Construct merged feed and compute usage per feed.
-
-const filteredItems = [];
-while (filteredItems.length < state.displayCount) {
- let bestItem = null;
- for (let iIndex = 0; iIndex < indices.length; ++iIndex) {
- const index = indices[iIndex];
- const feed = state.feeds[iIndex];
- const desc = index.options.order === "desc";
- if (!feed.items) {
- continue;
- }
- const item = feed.items[feed.usedCount];
- if (!item) {
- continue;
- }
- if (
- bestItem === null ||
- (desc
- ? item.blockHeight > bestItem.blockHeight
- : item.blockHeight < bestItem.blockHeight)
- ) {
- bestItem = item;
- }
- }
- if (!bestItem) {
- break;
- }
- state.feeds[bestItem.index].usedCount++;
- if (filter) {
- if (filter.ignore) {
- if (bestItem.accountId in filter.ignore) {
- continue;
- }
- }
- }
- filteredItems.push(bestItem);
-}
-
-// Fetch new items for feeds that don't have enough items.
-for (let iIndex = 0; iIndex < indices.length; ++iIndex) {
- const index = indices[iIndex];
- const feed = state.feeds[iIndex];
- const desc = index.options.order === "desc";
- let feedChanged = false;
-
- if (
- (feed.items.length || 0) - feed.usedCount < addDisplayCount * 2 &&
- !feed.fetchFrom &&
- feed.nextFetchFrom &&
- feed.nextFetchFrom !== feed.fetchFrom
- ) {
- feed.fetchFrom = feed.nextFetchFrom;
- feedChanged = true;
- }
-
- if (feed.fetchFrom) {
- const limit = addDisplayCount;
- const newItems = Social.index(
- index.action,
- index.key,
- Object.assign({}, index.options, {
- from: feed.fetchFrom,
- subscribe: undefined,
- limit,
- })
- );
- if (newItems !== null) {
- feed.items = mergeItems(iIndex, feed.items, newItems, desc);
- feed.fetchFrom = false;
- feed.nextFetchFrom = computeFetchFrom(newItems, limit, desc);
- feedChanged = true;
- }
- }
-
- if (feedChanged) {
- state.feeds[iIndex] = feed;
- stateChanged = true;
- }
-}
-
-if (stateChanged) {
- State.update();
-}
-
-const makeMoreItems = () => {
- State.update({
- displayCount: state.displayCount + addDisplayCount,
- });
-};
-
-const loader = (
-
-
- Loading ...
-
-);
-
-const fetchMore =
- props.manual &&
- (state.feeds.some((f) => !!f.fetchFrom) &&
- filteredItems.length < state.displayCount
- ? loader
- : state.displayCount < filteredItems.length && (
-
- ));
-
-const items = filteredItems ? filteredItems.slice(0, state.displayCount) : [];
-if (reverse) {
- items.reverse();
-}
-
-const renderedItems = items.map(cachedRenderItem);
-const Layout = props.Layout;
-
-return props.manual ? (
- <>
- {reverse && fetchMore}
- {renderedItems}
- {!reverse && fetchMore}
- >
-) : (
-
- {Layout ? {renderedItems} : <>{renderedItems}>}
-
-);
diff --git a/apps/devs.near/widget/ProfileEditor.jsx b/apps/devs.near/widget/ProfileEditor.jsx
deleted file mode 100644
index 88a2791..0000000
--- a/apps/devs.near/widget/ProfileEditor.jsx
+++ /dev/null
@@ -1,90 +0,0 @@
-const accountId = context.accountId;
-
-if (!accountId) {
- return "Please sign in with NEAR wallet to edit your profile";
-}
-
-let profile = Social.getr(`${accountId}/profile`);
-
-if (profile === null) {
- return "Loading";
-}
-
-State.init({
- profile,
-});
-
-return (
-
-
-
-
Edit profile of @{accountId}
-
-
- State.update({ profile }),
- options: {
- name: { label: "Name" },
- gizmo: { label: "Profile widget" },
- image: { label: "Profile picture" },
- backgroundImage: { label: "Background image" },
- description: { label: "About" },
- tags: {
- label: "Tags",
- tagsPattern: "*/profile/tags/*",
- placeholder:
- "rust, engineer, artist, humanguild, nft, learner, founder",
- },
- linktree: {
- links: [
- {
- label: "Twitter",
- prefix: "https://twitter.com/",
- name: "twitter",
- },
- {
- label: "Github",
- prefix: "https://github.com/",
- name: "github",
- },
- {
- label: "Telegram",
- prefix: "https://t.me/",
- name: "telegram",
- },
- {
- label: "Website",
- prefix: "https://",
- name: "website",
- },
- ],
- },
- },
- }}
- />
-
-
-
-
-
-);
diff --git a/apps/devs.near/widget/ProfileWidget.jsx b/apps/devs.near/widget/ProfileWidget.jsx
deleted file mode 100644
index 2140e17..0000000
--- a/apps/devs.near/widget/ProfileWidget.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-if (!accountId) {
- return "No account ID";
-}
-
-const profile = props.profile ?? Social.getr(`${accountId}/profile`);
-
-if (profile === null) {
- return "Loading";
-}
-
-const description = profile.description;
-
-State.init({
- loadWidget: false,
-});
-
-return hello
;
diff --git a/apps/devs.near/widget/Router.jsx b/apps/devs.near/widget/Router.jsx
deleted file mode 100644
index 00be852..0000000
--- a/apps/devs.near/widget/Router.jsx
+++ /dev/null
@@ -1,70 +0,0 @@
-const routes = props.routes;
-if (!routes) {
- routes = [];
-}
-const Navigator = props.Navigator;
-
-State.init({
- CurrentWidget: null,
-});
-
-function init() {
- if (!state.CurrentWidget) {
- // TODO: check from local storage or props
- const initialSrc = Object.values(props.routes)[0].src;
- State.update({ CurrentWidget: initialSrc });
- // () =>
- }
-}
-
-init();
-
-// Function to handle navigation
-function handleNavigate(newRoute, passProps) {
- const currentSrc = props.routes[newRoute]?.src;
- State.update({ CurrentWidget: currentSrc, passProps });
-}
-
-// const activePage = pages.find((p) => p.active);
-
-// const navigate = (v, params) => {
-// State.update({ page: v, project: params?.project });
-// const url = Url.construct("#/devs.near/widget/home", params);
-// Storage.set("url", url);
-// };
-
-function RouterLink({ to, children, passProps }) {
- return (
- handleNavigate(to, passProps)}
- key={"link-to-" + to}
- style={{ cursor: "pointer" }}
- >
- {children}
-
- );
-}
-
-// Render the current widget or a default message if the route is not found
-return (
-
- {/* Navigation buttons -- this should be passed to a Navigator widget */}
-
-
-
- {/** This could already render all of the children, but just put them as display none (lazy loading) */}
- {state.CurrentWidget ? (
-
- ) : (
-
{JSON.stringify(state.CurrentWidget)}
- )}
-
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/SetFlagButton.jsx b/apps/devs.near/widget/SetFlagButton.jsx
deleted file mode 100644
index dafbe27..0000000
--- a/apps/devs.near/widget/SetFlagButton.jsx
+++ /dev/null
@@ -1,49 +0,0 @@
-const Container = styled.div`
- display: flex;
- flex-direction: column;
- gap: 1rem;
- padding: 2rem 1rem;
-`;
-
-const Form = styled.div`
- display: flex;
- flex-direction: column;
- gap: 1rem;
-`;
-
-const InputGrid = styled.div`
- display: grid;
- grid-template-columns: max-content 1fr;
- align-items: center;
- gap: 1rem;
-
- @media (max-width: 600px) {
- grid-template-columns: 1fr;
- }
-`;
-
-if (!props.setFlags) {
- return this component requires a setFlags function ;
-}
-
-return (
-
-
-
-);
diff --git a/apps/devs.near/widget/adapter/github.jsx b/apps/devs.near/widget/adapter/github.jsx
deleted file mode 100644
index d2444ee..0000000
--- a/apps/devs.near/widget/adapter/github.jsx
+++ /dev/null
@@ -1,5 +0,0 @@
-function get({ path }) {
- return fetch(`https://raw.githubusercontent.com/${path}`);
-}
-
-return { get };
\ No newline at end of file
diff --git a/apps/devs.near/widget/adapter/openai.jsx b/apps/devs.near/widget/adapter/openai.jsx
deleted file mode 100644
index c8c8115..0000000
--- a/apps/devs.near/widget/adapter/openai.jsx
+++ /dev/null
@@ -1,284 +0,0 @@
-// Sourced from
-// https://github.com/petersalomonsen/near-openai/blob/main/boswidgets/askchatgpt/main.js
-
-const NETWORK_ID = "mainnet";
-
-// what does near-api-js use these for?
-// and how can people discover other options
-const NODE_URL = "https://rpc.mainnet.near.org";
-const WALLET_URL = `https://wallet.${NETWORK_ID}.near.org`; // what should this be defaulting to?
-const HELPER_URL = `https://helper.${NETWORK_ID}.near.org`;
-const EXPLORER_URL = `https://explorer.${NETWORK_ID}.near.org`; // and this?
-
-const API_URL = "https://near-openai.vercel.app/api/openai";
-
-const code = `
-
-
-
-
-
-
-
-
-
-
-`;
-
-const SECRET_KEY_STORAGE_KEY = "secretKey";
-Storage.privateGet(SECRET_KEY_STORAGE_KEY);
-
-State.init({
- secretKey: null,
- airesponse: "",
- aiquestion: "",
- accountId: "",
- iframeMessage: null,
- usingAccount: false,
-});
-
-function init_iframe() {
- const secretKey = Storage.privateGet(SECRET_KEY_STORAGE_KEY);
-
- State.update({
- secretKey,
- iframeMessage: secretKey
- ? {
- command: "useaccount",
- secretKey: secretKey,
- }
- : {
- command: "createaccount",
- },
- });
-}
-
-function ask_ai() {
- State.update({
- iframeMessage: {
- command: "ask_ai",
- aiquestion: state.aiquestion,
- model: "gpt-4",
- ts: new Date().getTime(),
- },
- progress: true,
- });
- console.log("state updated", state.iframeMessage);
-}
-
-function changeSecretKey(secretKey) {
- State.update({ secretKey });
- Storage.privateSet(SECRET_KEY_STORAGE_KEY, secretKey);
- init_iframe();
-}
-
-function handleMessage(msg) {
- switch (msg.command) {
- case "accountcreated":
- Storage.privateSet(SECRET_KEY_STORAGE_KEY, msg.secretKey);
- State.update({
- accountId: msg.accountId,
- secretKey: msg.secretKey,
- });
- break;
- case "airesponse":
- State.update({ airesponse: msg.airesponse, progress: false });
- break;
- case "usingaccount":
- State.update({ accountId: msg.accountId });
- break;
- case "error":
- console.log("error received in parent", msg.error);
- break;
- case "ready":
- console.log("ready");
- init_iframe();
- break;
- }
-}
-
-const iframe = (
-
-);
-
-const secretKeyToggle = state.showSecretKey ? (
- <>
- State.update({ showSecretKey: false })}>Hide
- changeSecretKey(e.target.value)}
- >
- >
-) : (
- State.update({ showSecretKey: true })}>Show
-);
-
-return (
- <>
-
- NOTE: Each request costs about 0.005 NEAR. Make sure the spending
- account below is funded, and you can also get full access to that account
- by using the secret key. Only you have the key to this account, so don't
- loose it.
-
- {iframe}
-
- {state.progress ? (
-
-
-
- ) : (
- Ask ChatGPT
- )}
-
-
-
-
-
-
-
-
-
-
-
- Spending account ID:
{state.accountId}
-
- Spending account secret key: {secretKeyToggle}
- >
-);
diff --git a/apps/devs.near/widget/adapter/sputnik-dao.jsx b/apps/devs.near/widget/adapter/sputnik-dao.jsx
deleted file mode 100644
index 2008547..0000000
--- a/apps/devs.near/widget/adapter/sputnik-dao.jsx
+++ /dev/null
@@ -1,85 +0,0 @@
-const call = ({ daoId, methodName, args, deposit }) => {
- Near.call([
- {
- contractName: daoId,
- methodName,
- args,
- deposit: deposit,
- gas: "219000000000000",
- },
- ]);
-};
-
-const addProposal = ({ daoId, proposal }) => {
- const policy = Near.view(daoId, "get_policy");
-
- if (policy === null) {
- return "Loading..."; // lol what does this do...
- }
-
- const deposit = policy.proposal_bond;
-
- call({
- daoId,
- methodName: "add_proposal",
- args: {
- proposal,
- },
- deposit,
- });
-};
-
-const createFunctionCallProposal = ({
- daoId,
- receiver_id,
- method_name,
- args,
-}) => {
- const proposal_args = Buffer.from(JSON.stringify(args), "utf-8").toString("base64");
- addProposal({
- daoId,
- proposal: {
- description: `call ${method_name} to ${receiver_id}`,
- kind: {
- FunctionCall: {
- receiver_id,
- actions: [
- {
- method_name,
- args: proposal_args,
- deposit: "100000000000000000000000",
- gas: "219000000000000",
- },
- ],
- },
- },
- },
- });
-};
-
-const create = (v) => {
- createFunctionCallProposal({
- daoId: "build.sputnik-dao.near",
- receiver_id: "social.near",
- method_name: "set",
- args: {
- data: {
- "build.sputnik-dao.near": {
- post: {
- main: JSON.stringify(v),
- },
- index: {
- post: JSON.stringify({
- key: "main",
- value: {
- type: "md",
- },
- }),
- },
- },
- },
- },
- })
-};
-
-return { createFunctionCallProposal, create };
diff --git a/apps/devs.near/widget/app.jsx b/apps/devs.near/widget/app.jsx
deleted file mode 100644
index 13751c8..0000000
--- a/apps/devs.near/widget/app.jsx
+++ /dev/null
@@ -1,258 +0,0 @@
-const Container = styled.div`
- display: flex;
- height: 100vh;
- width: 100%;
-`;
-
-const Panel = styled.div`
- flex: 1;
- border: 1px solid black;
- overflow: hidden;
-`;
-
-const Wrapper = styled.div`
- display: flex;
- align-items: stretch;
- height: 100%;
-`;
-
-const Header = styled.div`
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 10px;
- border-bottom: 1px solid black;
-`;
-
-const Select = styled.select``;
-
-const Option = styled.option``;
-
-const Button = styled.button``;
-
-const Label = styled.label`
- margin-right: 10px;
-`;
-
-const types = [
- {
- value: "devs.near/widget/markdown.edit",
- label: "Markdown",
- },
- { value: "devs.near/widget/code.edit", label: "Code" },
- { value: "devs.near/widget/canvas.edit", label: "Canvas" },
-];
-
-const adapters = [
- {
- value: null,
- label: "Social DB",
- },
- {
- value: "devs.near/widget/adapter.sputnik-dao",
- label: "Sputnik DAO",
- },
-];
-
-// const { Modal } = VM.require("buildhub.near/widget/components.Modal") || {
-// Modal: () => <>hello>,
-// };
-
-function PanelHeader({
- types,
- handleTypeChange,
- handleAdapterChange,
- adapter,
- value,
-}) {
- return (
-
-
- type:
- handleTypeChange(e.target.value)}>
- {types &&
- types.map((it) => {it.label} )}
-
-
-
- {/*
- adapter:
- handleAdapterChange(e.target.value)}>
- {adapters &&
- adapters.map((it) => {it.label} )}
-
-
- adapter.create(v)}>
- Publish
-
-
*/}
-
- );
-}
-
-const [editorValue, setEditorValue] = useState("");
-const [activeTab, setActiveTab] = useState("editor");
-
-const [editorSrc, setEditorSrc] = useState(
- "devs.near/widget/markdown.edit"
-);
-const [viewerSrc, setViewerSrc] = useState(
- "devs.near/widget/markdown.view"
-);
-
-const socialDbAdapter = {
- get: (path, blockHeight) => {
- if (!path) console.log("path not provided") && null;
- if (!blockHeight) blockHeight = "final";
- return Social.get(path, blockHeight);
- },
- create: (v) => {
- const id = "routes";
- const parts = path.split("/");
- Social.set({
- [parts[1]]: {
- [parts[2]]: {
- "": code,
- },
- },
- });
- return Social.set(
- {
- thing: {
- [id]: {
- "": v,
- metadata: {
- type: "app",
- },
- },
- },
- },
- {
- force: "true",
- onCommit: (v) => {
- console.log(v);
- },
- onCancel: (v) => {
- console.log(v);
- },
- }
- );
- },
-};
-
-const [selectedItem, setSelectedItem] = useState("efiz.near/thing/routes");
-const [adapter, setAdapter] = useState(socialDbAdapter);
-
-function handleTypeChange(value) {
- setEditorSrc(value);
-}
-
-function handleViewerSrcChange(value) {
- setViewerSrc(value);
-}
-
-const handleTabClick = (tab) => {
- setActiveTab(tab);
-};
-
-function handleAdapterChange(value) {
- const adapter = value ? VM.require(value) : socialDbAdapter;
- setAdapter(adapter);
-}
-
-function Editor({ value, setEditorValue }) {
- return (
- ,
- }}
- />
- );
-}
-
-function Viewer({ value }) {
- return ;
-}
-
-function Sidebar() {
- return (
- setSelectedItem(v) }}
- />
- );
-}
-
-return (
-
- {/*
-
-
-
- */}
-
-
-
-
-
-);
diff --git a/apps/devs.near/widget/bos/Hashtag/Feed.jsx b/apps/devs.near/widget/bos/Hashtag/Feed.jsx
deleted file mode 100644
index 169d80d..0000000
--- a/apps/devs.near/widget/bos/Hashtag/Feed.jsx
+++ /dev/null
@@ -1 +0,0 @@
-const hashtag = props.hashtag ?? "bos"; return ( );
\ No newline at end of file
diff --git a/apps/devs.near/widget/canvas/edit.jsx b/apps/devs.near/widget/canvas/edit.jsx
deleted file mode 100644
index 499c3fd..0000000
--- a/apps/devs.near/widget/canvas/edit.jsx
+++ /dev/null
@@ -1,23 +0,0 @@
-const { value, onChange, onSubmit, onCancel } = props;
-
-let initialShapes = {};
-
-if (typeof value === "string") {
- // I want to turn my string value into valid tldraw text
-}
-
-function handleSave(v) {
- console.log(v);
-}
-
-return (
-
-);
diff --git a/apps/devs.near/widget/canvas/view.jsx b/apps/devs.near/widget/canvas/view.jsx
deleted file mode 100644
index 35f623c..0000000
--- a/apps/devs.near/widget/canvas/view.jsx
+++ /dev/null
@@ -1,65 +0,0 @@
-const { value } = props;
-
-const [storeEvents, setStoreEvents] = useState([]);
-const [uiEvents, setUiEvents] = useState([]);
-const [viewMode, setViewMode] = useState("ui");
-
-function handleChangeEvent(event) {
- function logChangeEvent(eventName) {
- setStoreEvents((events) => [...events, eventName]);
- }
-
- // Process added records
- for (const record of Object.values(event.changes.added)) {
- logChangeEvent(
- `Added: ${record.typeName} (ID: ${record.id}, X: ${record.x}, Y: ${record.y})`
- );
- }
-
- // Process updated records
- for (const [from, to] of Object.values(event.changes.updated)) {
- logChangeEvent(
- `Updated: ${from.typeName} (ID: ${from.id}, X: ${from.x} -> ${to.x}, Y: ${from.y} -> ${to.y})`
- );
- }
-
- // Process removed records
- for (const record of Object.values(event.changes.removed)) {
- logChangeEvent(
- `Removed: ${record.typeName} (ID: ${record.id}, X: ${record.x}, Y: ${record.y})`
- );
- }
-}
-
-function handleUiEvent(name, data) {
- setUiEvents((events) => [...events, `${name} ${JSON.stringify(data)}`]);
-}
-
-function EventLog({ changeEvents, uiEvents }) {
- let eventsToShow = [];
- if (viewMode === "ui") {
- eventsToShow = uiEvents;
- } else if (viewMode === "change") {
- eventsToShow = changeEvents;
- }
-
- return (
-
-
- {eventsToShow.map((eventName, index) => (
- {eventName}
- ))}
-
-
- );
-}
-
-console.log("props", props);
-
-return (
-
-);
diff --git a/apps/devs.near/widget/code/edit.jsx b/apps/devs.near/widget/code/edit.jsx
deleted file mode 100644
index 5ed6ab0..0000000
--- a/apps/devs.near/widget/code/edit.jsx
+++ /dev/null
@@ -1,51 +0,0 @@
-const { value, onChange, onSubmit, onCancel } = props;
-
-const Container = styled.div`
- display: flex;
- flex-direction: column;
- height: 100%;
- width: 100%;
-`;
-
-const Header = styled.div`
- width: 100%;
- background-color: #f0f0f0;
-`;
-
-const EditorContainer = styled.div`
- flex-grow: 1;
- width: 100%;
-`;
-
-const Footer = styled.div`
- height: 120px;
- width: 100%;
- background-color: #f0f0f0;
-`;
-
-const defaultValue = value;
-const language = "json";
-const [path, setPath] = useState(props.path || "");
-
-const [code, setCode] = useState(defaultValue);
-
-useEffect(() => {
- onChange && onChange(code);
-}, [code]);
-
-return (
-
-
-
-
-
-);
diff --git a/apps/devs.near/widget/code/view.jsx b/apps/devs.near/widget/code/view.jsx
deleted file mode 100644
index 738da9b..0000000
--- a/apps/devs.near/widget/code/view.jsx
+++ /dev/null
@@ -1,3 +0,0 @@
-const { value } = props;
-
-return ;
diff --git a/apps/devs.near/widget/community/Banner.jsx b/apps/devs.near/widget/community/Banner.jsx
deleted file mode 100644
index 7f3e863..0000000
--- a/apps/devs.near/widget/community/Banner.jsx
+++ /dev/null
@@ -1,69 +0,0 @@
-const Banner = styled.div`
- {
- height: 62px;
- background: #181818;
- padding: 16px 20px;
-
- img {
- height: 30px;
- }
-
- margin-bottom: 25px;
- }
-`;
-
-return (
- <>
-
-
-
-
-
-
- >
-);
diff --git a/apps/devs.near/widget/community/Featured.jsx b/apps/devs.near/widget/community/Featured.jsx
deleted file mode 100644
index 6b33707..0000000
--- a/apps/devs.near/widget/community/Featured.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-const Hover = styled.div`
- &:hover {
- box-shadow: 0px 1px 3px rgba(16, 24, 40, 0.1),
- 0px 1px 2px rgba(16, 24, 40, 0.06);
- }
-`;
-
-return (
-
-
-
- {props.title}
- {props.desc}
-
-
-);
diff --git a/apps/devs.near/widget/community/Groups.jsx b/apps/devs.near/widget/community/Groups.jsx
deleted file mode 100644
index c12b3d6..0000000
--- a/apps/devs.near/widget/community/Groups.jsx
+++ /dev/null
@@ -1,121 +0,0 @@
-const Cover = styled.img`
- border-radius: 8px;
- width: 150px;
- object-fit: cover;
-`;
-
-const ActionButton = styled.a`
- border-radius: 5px;
- width: auto;
- text-transform: uppercase;
- padding: 8px 14px;
- background: #888;
- color: #fff;
- cursor: pointer;
- font-weight: 600;
- :hover {
- opacity: 0.8;
- text-decoration: none;
- background: #333;
- color: #fff;
- }
-`;
-
-const Card = styled.div`
- border-radius: 8px;
- color: #0c0c0c;
- align-items: center;
- justify-content: center;
- max-width: 210px;
- padding: 25px 32px;
- display: flex;
- flex-direction: column;
-`;
-
-const CardList = styled.div`
- display: grid;
- justify-items: center;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- grid-template-rows: repeat(200px, 1fr);
- gap: 0.5rem;
-`;
-
-const GroupCard = (props) => {
- const { title, coverSrc, actionButtons } = props;
-
- return (
-
-
-
-
- {actionButtons.map((button, index) => (
-
handleButtonClick(button.url)}
- href={button.url}
- target="_blank"
- rel="noopener noreferrer"
- >
- {button.label}
-
- ))}
-
-
- );
-};
-
-const Images = [
- {
- title: "DeFi",
- url: "https://ipfs.near.social/ipfs/bafkreifikdi444catqds54ulo3kwujvetmng7pwmr2tmg7hadtxmfguyeu",
- },
- {
- title: "NFTs",
- url: "https://ipfs.near.social/ipfs/bafkreib56aciji2mgnwhqt3nkmutxqfednxqllgzvd5gm6d4mcjbumnxzm",
- },
- {
- title: "Gaming",
- url: "https://ipfs.near.social/ipfs/bafkreifzp5dafotrrzitwrp2op6shyavpad4nx6rxl2wk2xf343a6vtgqa",
- },
- {
- title: "Amplify",
- url: "https://ipfs.near.social/ipfs/bafkreigqamafvyfqcwsp4gl4nyh4wof7ldrz7oloj5fb22lqbu77fz7pda",
- },
-];
-
-const Links = [
- { title: "DeFi", url: "https://t.me/+50ySHiGjLn04M2Rh" },
- { title: "NFTs", url: "https://t.me/+i3GC2WYx5b5hMThh" },
- { title: "Gaming", url: "https://t.me/+QM6OtCRhcUdiYjhh" },
- { title: "Amplify", url: "https://t.me/+KCCfcYe-IKI2ZjEx" },
-];
-
-return (
-
-
- {Images.map((image, i) => (
-
- ))}
-
-
-);
diff --git a/apps/devs.near/widget/community/Hashtag/Feed.jsx b/apps/devs.near/widget/community/Hashtag/Feed.jsx
deleted file mode 100644
index f1e0e1c..0000000
--- a/apps/devs.near/widget/community/Hashtag/Feed.jsx
+++ /dev/null
@@ -1 +0,0 @@
-const hashtag = props.hashtag ?? "community"; return ( );
\ No newline at end of file
diff --git a/apps/devs.near/widget/community/Header.jsx b/apps/devs.near/widget/community/Header.jsx
deleted file mode 100644
index 8de4eed..0000000
--- a/apps/devs.near/widget/community/Header.jsx
+++ /dev/null
@@ -1,118 +0,0 @@
-const Header = styled.div`
- {
- height: 204px;
- overflow: hidden;
- background: #f3f3f3;
- padding: 10px 0;
- margin-top: -25px;
- margin-bottom: 25px;
- padding-left: 32px;
- }
-`;
-
-const NavUnderline = styled.ul`
- a {
- color: #3252a6;
- text-decoration: none;
- }
-
- a.active {
- font-weight: bold;
- border-bottom: 2px solid #0c7283;
- }
-`;
-
-const BreadcrumbLink = styled.a`
- {
- color: #3252a6;
- text-decoration: none;
- }
-`;
-const BreadcrumbBold = styled.b`
- {
- color: #3252a6;
- }
-`;
-
-return (
- <>
-
-
-
-
- DevHub
-
-
- {props.title}
-
-
-
-
-
-
-
{props.title}
-
{props.desc}
-
-
-
-
- >
-);
diff --git a/apps/devs.near/widget/community/Layout.jsx b/apps/devs.near/widget/community/Layout.jsx
deleted file mode 100644
index 81e4975..0000000
--- a/apps/devs.near/widget/community/Layout.jsx
+++ /dev/null
@@ -1,52 +0,0 @@
-const label = props.label ?? "regional";
-
-const communities = {
- regional: {
- icon: "https://ipfs.near.social/ipfs/bafkreiajwq6ep3n7veddozji2djv5vviyisabhycbweslvpwhsoyuzcwi4",
- cover:
- "https://ipfs.near.social/ipfs/bafkreihgxg5kwts2juldaeasveyuddkm6tcabmrat2aaq5u6uyljtyt7lu",
- title: "Regional",
- },
- defi: {
- icon: "https://ipfs.near.social/ipfs/bafkreidpitdafcnhkp4uyomacypdgqvxr35jtfnbxa5s6crby7qjk2nv5a",
- cover:
- "https://ipfs.near.social/ipfs/bafkreicg4svzfz5nvllomsahndgm7u62za4sib4mmbygxzhpcl4htqwr4a",
- title: "DeFi",
- },
- nft: {
- icon: "https://ipfs.near.social/ipfs/bafkreie2eaj5czmpfe6pe53kojzcspgozebdsonffwvbxtpuipnwahybvi",
- cover:
- "https://ipfs.near.social/ipfs/bafkreiehzr7z2fhoqqmkt3z667wubccbch6sqtsnvd6msodyzpnf72cszy",
- title: "NFTs",
- },
- gaming: {
- icon: "https://ipfs.near.social/ipfs/bafkreiepgdnu7soc6xgbyd4adicbf3eyxiiwqawn6tguaix6aklfpir634",
- cover:
- "https://ipfs.near.social/ipfs/bafkreiaowjqxds24fwcliyriintjd4ucciprii2rdxjmxgi7f5dmzuscey",
- title: "Gaming",
- },
-};
-
-const Content = styled.div`
- {
- padding: 0 32px;
- }
-`;
-
-const community = communities[label];
-
-return (
- <>
-
-
- {props.children}
- >
-);
diff --git a/apps/devs.near/widget/community/Overview.jsx b/apps/devs.near/widget/community/Overview.jsx
deleted file mode 100644
index 8050c39..0000000
--- a/apps/devs.near/widget/community/Overview.jsx
+++ /dev/null
@@ -1,70 +0,0 @@
-const label = props.label ?? "regional";
-
-const communities = {
- regional: {
- overviewId: 397,
- icon: "https://ipfs.near.social/ipfs/bafkreiajwq6ep3n7veddozji2djv5vviyisabhycbweslvpwhsoyuzcwi4",
- cover:
- "https://ipfs.near.social/ipfs/bafkreihgxg5kwts2juldaeasveyuddkm6tcabmrat2aaq5u6uyljtyt7lu",
- title: "Regional",
- },
- defi: {
- overviewId: 412,
- icon: "https://ipfs.near.social/ipfs/bafkreidpitdafcnhkp4uyomacypdgqvxr35jtfnbxa5s6crby7qjk2nv5a",
- cover:
- "https://ipfs.near.social/ipfs/bafkreicg4svzfz5nvllomsahndgm7u62za4sib4mmbygxzhpcl4htqwr4a",
- title: "DeFi",
- },
- nft: {
- overviewId: 416,
- icon: "https://ipfs.near.social/ipfs/bafkreie2eaj5czmpfe6pe53kojzcspgozebdsonffwvbxtpuipnwahybvi",
- cover:
- "https://ipfs.near.social/ipfs/bafkreiehzr7z2fhoqqmkt3z667wubccbch6sqtsnvd6msodyzpnf72cszy",
- title: "NFTs",
- },
- gaming: {
- overviewId: 414,
- icon: "https://ipfs.near.social/ipfs/bafkreiepgdnu7soc6xgbyd4adicbf3eyxiiwqawn6tguaix6aklfpir634",
- cover:
- "https://ipfs.near.social/ipfs/bafkreiaowjqxds24fwcliyriintjd4ucciprii2rdxjmxgi7f5dmzuscey",
- title: "Gaming",
- },
-};
-
-const community = communities[props.label];
-
-const onMention = (accountId) => (
-
-
-
-);
-
-const Overview = (
-
-
-
-);
-
-return (
- <>
-
- >
-);
diff --git a/apps/devs.near/widget/community/Page.jsx b/apps/devs.near/widget/community/Page.jsx
deleted file mode 100644
index 71b2379..0000000
--- a/apps/devs.near/widget/community/Page.jsx
+++ /dev/null
@@ -1,85 +0,0 @@
-const communities = {
- regional: {
- overviewId: 397,
- icon: "https://ipfs.near.social/ipfs/bafkreiajwq6ep3n7veddozji2djv5vviyisabhycbweslvpwhsoyuzcwi4",
- cover:
- "https://ipfs.near.social/ipfs/bafkreihgxg5kwts2juldaeasveyuddkm6tcabmrat2aaq5u6uyljtyt7lu",
- title: "Regional",
- },
- defi: {
- overviewId: 412,
- icon: "https://ipfs.near.social/ipfs/bafkreidpitdafcnhkp4uyomacypdgqvxr35jtfnbxa5s6crby7qjk2nv5a",
- cover:
- "https://ipfs.near.social/ipfs/bafkreicg4svzfz5nvllomsahndgm7u62za4sib4mmbygxzhpcl4htqwr4a",
- title: "DeFi",
- },
- nft: {
- overviewId: 416,
- icon: "https://ipfs.near.social/ipfs/bafkreie2eaj5czmpfe6pe53kojzcspgozebdsonffwvbxtpuipnwahybvi",
- cover:
- "https://ipfs.near.social/ipfs/bafkreiehzr7z2fhoqqmkt3z667wubccbch6sqtsnvd6msodyzpnf72cszy",
- title: "NFTs",
- },
- gaming: {
- overviewId: 414,
- icon: "https://ipfs.near.social/ipfs/bafkreiepgdnu7soc6xgbyd4adicbf3eyxiiwqawn6tguaix6aklfpir634",
- cover:
- "https://ipfs.near.social/ipfs/bafkreiaowjqxds24fwcliyriintjd4ucciprii2rdxjmxgi7f5dmzuscey",
- title: "Gaming",
- },
-};
-
-const Gradient = styled.div`
- {
- width: 100%;
- margin-top: -25px;
- margin-bottom: 25px;
- height: 250px;
- text-align: center;
- background: #000;
-
- font-family: Arial, sans-serif;
- }
-
- .subtitle-above {
- font-size: 18px;
- letter-spacing: 1px;
- font-family: Courier, monospace;
- }
-
- .subtitle-below {
- font-size: 16px;
- font-family: Courier, monospace;
-
- }
-
- .slogan {
- font-weight: 600;
- font-size: 60px;
- font-family: Courier, monospace;
-
- }
-`;
-
-return (
-
-
-
- NEAR Work Groups
-
-
- Share ideas, connect with people, and get involved!
-
-
-
Featured Communities
-
- {Object.entries(communities).map(([label, community]) => {
- return (
-
-
-
- );
- })}
-
-
-);
diff --git a/apps/devs.near/widget/community/Rank.jsx b/apps/devs.near/widget/community/Rank.jsx
deleted file mode 100644
index 4698fce..0000000
--- a/apps/devs.near/widget/community/Rank.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-const accountId = props.accountId ?? "academy.near";
-const accountFollowerCount = [];
-
-let accounts = Social.keys(`${accountId}/graph/follow/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
-});
-
-if (accounts === null) {
- return "Loading...";
-}
-
-accounts = Object.entries(accounts[accountId].graph.follow || {});
-accounts.sort((a, b) => b[1] - a[1]);
-
-for (let i = 0; i < accounts.length; ++i) {
- let accountId = accounts[i][0];
- let followers = Social.keys(`*/graph/follow/${accountId}`, "final", {
- return_type: "BlockHeight",
- values_only: true,
- });
- if (followers) {
- accountFollowerCount.push({
- accountId: accountId,
- count: Object.keys(followers).length,
- });
- }
-}
-const accountFollowerSort = accountFollowerCount.sort(
- (a, b) => b.count - a.count
-);
-const numAccounts = accountFollowerSort.length;
-accountFollowerSort = accountFollowerSort.slice(0, limit);
-console.log(accountFollowerSort);
-
-return (
- <>
- Communities
- {accountFollowerSort.map((rank, index) => {
- let accountId = rank.accountId;
- return (
-
-
-
-
-
-
- Rank:
-
- {index + 1}
-
-
-
- Followers:{" "}
-
- {rank.count}
-
-
-
-
-
-
-
- );
- })}
- >
-);
diff --git a/apps/devs.near/widget/community/cta.jsx b/apps/devs.near/widget/community/cta.jsx
deleted file mode 100644
index e2529d4..0000000
--- a/apps/devs.near/widget/community/cta.jsx
+++ /dev/null
@@ -1,113 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const daoId = props.daoId ?? "build.sputnik-dao.near";
-
-let isBuilder = false;
-let widgets = Social.get(`${accountId}/widget/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
-});
-let widgetCount = 0;
-if (widgets) {
- widgetCount = Object.keys(widgets).length;
-}
-if (widgetCount > 0) {
- isBuilder = true;
-}
-
-const Text = styled.p`
- font-family: "FK Grotesk", sans-serif;
- font-size: ${(p) => p.size ?? "18px"};
- line-height: ${(p) => p.lineHeight ?? "1.5"};
- font-weight: ${(p) => p.weight ?? "400"};
- color: ${(p) => p.color ?? "#000"};
- margin-botton: 8px;
-`;
-
-const FlexContainer = styled.div`
- display: flex;
- gap: 8px;
- align-items: center;
- flex-direction: row;
- justify-content: center;
- flex-wrap: wrap;
-
- @media (max-width: 998px) {
- flex-direction: column;
- gap: var(--section-gap);
- }
-`;
-
-const Flex = styled.div`
- display: flex;
- gap: 8px;
- align-items: center;
- flex-direction: column;
- flex-wrap: "nowrap";
-
- @media (max-width: 998px) {
- flex-direction: column;
- gap: var(--section-gap);
- }
-`;
-
-const Container = styled.div`
- display: flex;
- max-width: 1080px;
- margin: 0 auto;
- gap: var(--section-gap);
- flex-direction: column;
- align-items: center;
- justify-content: center;
- text-align: center;
- padding: var(--section-gap) 24px;
-`;
-
-return (
-
- {isBuilder ? (
-
-
- Your Adventure Has Begun
-
-
-
-
-
-
-
- ) : (
-
-
- Begin a New Adventure
-
-
-
-
-
-
-
- )}
-
-);
diff --git a/apps/devs.near/widget/community/view.jsx b/apps/devs.near/widget/community/view.jsx
deleted file mode 100644
index e607bb8..0000000
--- a/apps/devs.near/widget/community/view.jsx
+++ /dev/null
@@ -1,236 +0,0 @@
-const data = props.data;
-
-State.init({
- selectedTab: data.featuredTab || 0,
-});
-
-const Wrapper = styled.div`
- --section-gap: 23px;
- padding-top: 42px;
-
- @media (max-width: 1155px) {
- .line-rounded-corners {
- display: none !important;
- }
- }
-
- @media (max-width: 998px) {
- padding-top: 0;
- }
-`;
-
-const H1 = styled.h1`
- font-family: "FK Grotesk", sans-serif;
- font-style: normal;
- font-weight: 500;
- font-size: 90px;
- line-height: 1;
- text-align: center;
- letter-spacing: -0.03em;
- color: #000;
- margin: 0;
- max-width: 700px;
-
- span {
- display: inline-block;
- background: ${data.title.highlightColor};
- border-radius: 20px;
- position: relative;
- padding: 0.1em 0.2em 0;
-
- svg {
- position: absolute;
- bottom: -8px;
- right: -10px;
- width: 24px;
- }
- }
-
- @media (max-width: 900px) {
- font-size: 50px;
-
- span {
- border-radius: 12px;
- svg {
- position: absolute;
- bottom: -6px;
- right: -7px;
- width: 16px;
- }
- }
- }
-`;
-
-const Text = styled.p`
- font-family: "FK Grotesk", sans-serif;
- font-size: ${(p) => p.size ?? "18px"};
- line-height: ${(p) => p.lineHeight ?? "1.5"};
- font-weight: ${(p) => p.weight ?? "400"};
- color: ${(p) => p.color ?? "#000"};
- margin-botton: 8px;
-`;
-
-const Flex = styled.div`
- display: flex;
- gap: 8px;
- align-items: center;
- flex-direction: column;
- flex-wrap: "nowrap";
-
- @media (max-width: 998px) {
- flex-direction: column;
- gap: var(--section-gap);
- }
-`;
-
-const Container = styled.div`
- display: flex;
- max-width: 1080px;
- margin: 0 auto;
- gap: var(--section-gap);
- flex-direction: column;
- align-items: center;
- justify-content: center;
- text-align: center;
- padding: var(--section-gap) 24px;
-`;
-
-const Tabs = styled.div`
- display: flex;
- height: 48px;
- border-bottom: 1px solid #eceef0;
- margin-bottom: 4px;
- overflow: auto;
- scroll-behavior: smooth;
- justify-content: center;
-
- @media (max-width: 1200px) {
- background: #f8f9fa;
- border-top: 1px solid #eceef0;
- margin: 0 -12px 48px;
-
- > * {
- flex: 1;
- }
- }
-`;
-
-const TabsButton = styled.a`
- display: inline-flex;
- align-items: center;
- justify-content: center;
- height: 100%;
- font-weight: 600;
- font-size: 23px;
- padding: 0 12px;
- position: relative;
- color: ${(p) => (p.selected ? "#11181C" : "#687076")};
- background: none;
- border: none;
- outline: none;
- text-align: center;
- text-decoration: none !important;
-
- &:hover {
- color: #11181c;
- cursor: pointer;
- }
-
- &::after {
- content: "";
- display: ${(p) => (p.selected ? "block" : "none")};
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- height: 3px;
- background: #59e692;
- }
-`;
-
-const handleTabClick = (tab) => {
- State.update({
- selectedTab: tab,
- });
-};
-
-function Content() {
- return (
-
- );
-}
-
-return (
-
-
-
-
- {data.title.highlightPosition === "left" ? (
- <>
-
- {data.title.highlighted}{" "}
-
-
-
-
- {data.title.default}
- >
- ) : (
- <>
- {data.title.default}{" "}
-
- {data.title.highlighted}
-
-
-
-
- >
- )}
-
-
- {data.description}
-
-
-
-
-
-
- {data.views?.map((it, index) => {
- return (
- State.update({ selectedTab: index })}
- selected={state.selectedTab === index}
- >
- {it.name}
-
- );
- })}
-
-
-
-
-
-
- Made Possible by Collaboration
-
-
-
-
-);
diff --git a/apps/devs.near/widget/component/card.jsx b/apps/devs.near/widget/component/card.jsx
deleted file mode 100644
index 51e9423..0000000
--- a/apps/devs.near/widget/component/card.jsx
+++ /dev/null
@@ -1,221 +0,0 @@
-const [accountId, widget, widgetName] = props.src.split("/");
-const metadata = Social.get(
- `${accountId}/widget/${widgetName}/metadata/**`,
- "final"
-);
-const tags = Object.keys(metadata.tags || {});
-const detailsUrl = `#/near/widget/ComponentDetailsPage?src=${accountId}/widget/${widgetName}`;
-const appUrl = `#/${accountId}/widget/${widgetName}`;
-const accountUrl = `#/near/widget/ProfilePage?accountId=${accountId}`;
-
-const Card = styled.div`
- position: relative;
- width: 100%;
- border-radius: 12px;
- background: #fff;
- border: 1px solid #eceef0;
- box-shadow: 0px 1px 3px rgba(16, 24, 40, 0.1),
- 0px 1px 2px rgba(16, 24, 40, 0.06);
- overflow: hidden;
-`;
-
-const CardBody = styled.div`
- padding: 16px;
- display: flex;
- gap: 16px;
- align-items: center;
-
- > * {
- min-width: 0;
- }
-`;
-
-const CardContent = styled.div`
- width: 100%;
-`;
-
-const CardFooter = styled.div`
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 16px;
- padding: 16px;
- border-top: 1px solid #eceef0;
-`;
-
-const StarButton = styled.div`
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 16px;
- padding: 16px;
-`;
-
-const CardTag = styled.p`
- margin: 0;
- font-size: 9px;
- line-height: 14px;
- background: #eceef0;
- color: #687076;
- font-weight: 400;
- white-space: nowrap;
- position: absolute;
- top: 0;
- right: 0;
- border-bottom-left-radius: 3px;
- padding: 0 4px;
-
- i {
- margin-right: 3px;
- }
-`;
-
-const TextLink = styled.a`
- display: block;
- margin: 0;
- font-size: 14px;
- line-height: 18px;
- color: ${(p) => (p.bold ? "#11181C !important" : "#687076 !important")};
- font-weight: ${(p) => (p.bold ? "600" : "400")};
- font-size: ${(p) => (p.small ? "12px" : "14px")};
- overflow: ${(p) => (p.ellipsis ? "hidden" : "visible")};
- text-overflow: ${(p) => (p.ellipsis ? "ellipsis" : "unset")};
- white-space: nowrap;
- outline: none;
-
- &:focus,
- &:hover {
- text-decoration: underline;
- }
-`;
-
-const Text = styled.p`
- margin: 0;
- font-size: 14px;
- line-height: 20px;
- color: ${(p) => (p.bold ? "#11181C" : "#687076")};
- font-weight: ${(p) => (p.bold ? "600" : "400")};
- font-size: ${(p) => (p.small ? "12px" : "14px")};
- overflow: ${(p) => (p.ellipsis ? "hidden" : "")};
- text-overflow: ${(p) => (p.ellipsis ? "ellipsis" : "")};
- white-space: nowrap;
-
- i {
- margin-right: 3px;
- }
-`;
-
-const Thumbnail = styled.a`
- display: block;
- width: 60px;
- height: 60px;
- flex-shrink: 0;
- border: 1px solid #eceef0;
- border-radius: 8px;
- overflow: hidden;
- outline: none;
- transition: border-color 200ms;
-
- &:focus,
- &:hover {
- border-color: #d0d5dd;
- }
-
- img {
- object-fit: cover;
- width: 100%;
- height: 100%;
- }
-`;
-
-const TagsWrapper = styled.div`
- position: relative;
- margin-top: 4px;
-`;
-
-const ButtonLink = styled.a`
- padding: 8px;
- height: 32px;
- border: 1px solid #d7dbdf;
- border-radius: 100px;
- font-weight: 600;
- font-size: 12px;
- line-height: 15px;
- text-align: center;
- cursor: pointer;
- color: ${(p) => (p.primary ? "#006ADC" : "#11181C")} !important;
- background: #fbfcfd;
- white-space: nowrap;
-
- &:hover,
- &:focus {
- background: #ecedee;
- text-decoration: none;
- outline: none;
- }
-`;
-
-return (
-
- {
-
- {" "}
- {" "}
- ago
-
- }
-
-
-
-
-
-
-
-
- {metadata.name || widgetName}
-
-
-
- @{accountId}
-
-
- {tags.length > 0 && (
-
-
-
- )}
-
-
-
-
-
-
-
- View Details
-
- Open
-
-
-
-);
diff --git a/apps/devs.near/widget/components.jsx b/apps/devs.near/widget/components.jsx
deleted file mode 100644
index 8c2665d..0000000
--- a/apps/devs.near/widget/components.jsx
+++ /dev/null
@@ -1,301 +0,0 @@
-const limitPerPage = 21;
-let components = [];
-let totalApps = 0;
-let totalComponents = 0;
-const componentsUrl = "#/near/widget/ComponentsPage";
-const searchRequiredTag = state.selectedTab === "apps" ? "app" : null;
-const searchPlaceholder =
- state.selectedTab === "apps" ? "Search Apps" : "Search Components";
-
-State.init({
- currentPage: 0,
- selectedTab: props.tab || "all",
-});
-
-if (props.tab && props.tab !== state.selectedTab) {
- State.update({
- selectedTab: props.tab,
- });
-}
-
-const tagsData = Social.get("*/widget/*/metadata/tags/*", "final");
-
-const data = Social.keys("*/widget/*", "final", {
- return_type: "BlockHeight",
-});
-
-if (data) {
- const result = [];
-
- Object.keys(data).forEach((accountId) => {
- return Object.keys(data[accountId].widget).forEach((widgetName) => {
- totalComponents++;
-
- if (state.selectedTab === "apps") {
- const hasAppTag =
- tagsData[accountId].widget[widgetName]?.metadata?.tags["app"] === "";
- if (!hasAppTag) return;
- totalApps++;
- }
-
- result.push({
- accountId,
- widgetName,
- blockHeight: data[accountId].widget[widgetName],
- });
- });
- });
-
- result.sort((a, b) => b.blockHeight - a.blockHeight);
- components = result.slice(0, state.currentPage * limitPerPage + limitPerPage);
-}
-
-function onSearchChange({ result, term }) {
- if (term.trim()) {
- State.update({ searchResults: result || [] });
- } else {
- State.update({ searchResults: null });
- }
-}
-
-const items = state.searchResults || components;
-
-const Wrapper = styled.div`
- display: flex;
- flex-direction: column;
- gap: 48px;
- padding-bottom: 48px;
- padding-top: 48px;
-`;
-
-const Header = styled.div`
- display: flex;
- flex-direction: column;
- gap: 12px;
-`;
-
-const Search = styled.div`
- width: 246px;
-
- @media (max-width: 500px) {
- width: 100%;
- }
-`;
-
-const H1 = styled.h1`
- font-weight: 600;
- font-size: 32px;
- line-height: 39px;
- color: #11181c;
- margin: 0;
-`;
-
-const H2 = styled.h2`
- font-weight: 400;
- font-size: 20px;
- line-height: 24px;
- color: #687076;
- margin: 0;
-`;
-
-const Text = styled.p`
- margin: 0;
- line-height: 1.5rem;
- color: ${(p) => (p.bold ? "#11181C" : "#687076")} !important;
- font-weight: ${(p) => (p.bold ? "600" : "400")};
- font-size: ${(p) => (p.small ? "12px" : "14px")};
- overflow: ${(p) => (p.ellipsis ? "hidden" : "")};
- text-overflow: ${(p) => (p.ellipsis ? "ellipsis" : "")};
- white-space: ${(p) => (p.ellipsis ? "nowrap" : "")};
- overflow-wrap: anywhere;
-
- b {
- font-weight: 600;
- color: #11181c;
- }
-
- &[href] {
- display: inline-flex;
- gap: 0.25rem;
-
- &:hover,
- &:focus {
- text-decoration: underline;
- }
- }
-`;
-
-const Items = styled.div`
- display: grid;
- grid-template-columns: repeat(3, minmax(0, 1fr));
- gap: 24px;
-
- @media (max-width: 1200px) {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
-
- @media (max-width: 800px) {
- grid-template-columns: minmax(0, 1fr);
- }
-`;
-
-const Item = styled.div``;
-
-const Button = styled.button`
- display: block;
- width: 100%;
- padding: 8px;
- height: 32px;
- background: #fbfcfd;
- border: 1px solid #d7dbdf;
- border-radius: 50px;
- font-weight: 600;
- font-size: 12px;
- line-height: 15px;
- text-align: center;
- cursor: pointer;
- color: #11181c !important;
- margin: 0;
-
- &:hover,
- &:focus {
- background: #ecedee;
- text-decoration: none;
- outline: none;
- }
-
- span {
- color: #687076 !important;
- }
-`;
-
-const Tabs = styled.div`
- display: flex;
- height: 48px;
- border-bottom: 1px solid #eceef0;
- margin-bottom: -24px;
- overflow: auto;
- scroll-behavior: smooth;
-
- @media (max-width: 1200px) {
- background: #f8f9fa;
- border-top: 1px solid #eceef0;
- margin-left: -12px;
- margin-right: -12px;
-
- > * {
- flex: 1;
- }
- }
-`;
-
-const TabsButton = styled.a`
- display: inline-flex;
- align-items: center;
- justify-content: center;
- height: 100%;
- font-weight: 600;
- font-size: 12px;
- padding: 0 12px;
- position: relative;
- color: ${(p) => (p.selected ? "#11181C" : "#687076")};
- background: none;
- border: none;
- outline: none;
- text-align: center;
- text-decoration: none !important;
-
- &:hover {
- color: #11181c;
- }
-
- &::after {
- content: "";
- display: ${(p) => (p.selected ? "block" : "none")};
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- height: 3px;
- background: #59e692;
- }
-`;
-
-return (
-
-
- {state.selectedTab === "apps" && (
- <>
- {totalApps} Apps
- Discover the latest apps from the NEAR community.
- >
- )}
-
- {state.selectedTab !== "apps" && (
- <>
- {totalComponents} Components
- Discover the latest components from the NEAR community.
- >
- )}
-
-
-
-
-
-
- {!state.searchResults && (
-
-
- All
-
-
-
- Apps
-
-
- )}
-
- {state.searchResults?.length === 0 && (
- No components matched your search.
- )}
-
- {items.length > 0 && (
-
- {items.map((component, i) => (
- -
-
-
- ))}
-
- )}
-
- {!state.searchResults && (
- State.update({ currentPage: state.currentPage + 1 })}
- >
- Load More
-
- )}
-
-);
diff --git a/apps/devs.near/widget/create/posts.jsx b/apps/devs.near/widget/create/posts.jsx
deleted file mode 100644
index 8740c58..0000000
--- a/apps/devs.near/widget/create/posts.jsx
+++ /dev/null
@@ -1,487 +0,0 @@
-const accountId = context.accountId;
-
-if (!accountId) {
- return "";
-}
-
-const domains = props.domains;
-
-State.init({
- image: {},
- text: "",
- showPreview: false,
-});
-
-const profile = Social.getr(`${context.accountId}/profile`);
-const autocompleteEnabled = true;
-
-const content = {
- type: "md",
- image: state.image.cid ? { ipfs_cid: state.image.cid } : undefined,
- text: state.text,
-};
-
-function extractMentions(text) {
- const mentionRegex =
- /@((?:(?:[a-z\d]+[-_])*[a-z\d]+\.)*(?:[a-z\d]+[-_])*[a-z\d]+)/gi;
- mentionRegex.lastIndex = 0;
- const accountIds = new Set();
- for (const match of text.matchAll(mentionRegex)) {
- if (
- !/[\w`]/.test(match.input.charAt(match.index - 1)) &&
- !/[/\w`]/.test(match.input.charAt(match.index + match[0].length)) &&
- match[1].length >= 2 &&
- match[1].length <= 64
- ) {
- accountIds.add(match[1].toLowerCase());
- }
- }
- return [...accountIds];
-}
-
-function extractTagNotifications(text, item) {
- return extractMentions(text || "")
- .filter((accountId) => accountId !== context.accountId)
- .map((accountId) => ({
- key: accountId,
- value: {
- type: "mention",
- item,
- },
- }));
-}
-
-const extractHashtags = (text) => {
- const hashtagRegex = /#(\w+)/gi;
- hashtagRegex.lastIndex = 0;
- const hashtags = new Set();
- for (const match of text.matchAll(hashtagRegex)) {
- if (
- !/[\w`]/.test(match.input.charAt(match.index - 1)) &&
- !/[/\w`]/.test(match.input.charAt(match.index + match[0].length))
- ) {
- hashtags.add(match[1].toLowerCase());
- }
- }
- return [...hashtags];
-};
-
-function composeData() {
- const data = {
- post: {
- main: JSON.stringify(content),
- },
- index: {},
- };
-
- const hashtags = extractHashtags(content.text);
- /**
- * If domains have been provided, then we create an index under that "domain"
- * Otherwise, we post to the catch-all "post" domain
- */
- if (state.choose && state.choose.length > 0) {
- state.choose.map((it) => {
- data.index[it] = JSON.stringify({
- key: "main",
- value: {
- type: "md",
- },
- });
- if (hashtags.length) {
- data.index.hashtag = JSON.stringify(
- hashtags.map((hashtag) => ({
- key: hashtag,
- value: {
- type: "social",
- path: `${context.accountId}/${it}/main`,
- },
- }))
- );
- }
- });
- } else {
- data.index.post = JSON.stringify({
- key: "main",
- value: {
- type: "md",
- },
- });
- if (hashtags.length) {
- data.index.hashtag = JSON.stringify(
- hashtags.map((hashtag) => ({
- key: hashtag,
- value: {
- type: "social",
- path: `${context.accountId}/post/main`,
- },
- }))
- );
- }
- }
-
- const notifications = extractTagNotifications(state.text, {
- type: "social",
- path: `${context.accountId}/post/main`,
- });
-
- if (notifications.length) {
- data.index.notify = JSON.stringify(
- notifications.length > 1 ? notifications : notifications[0]
- );
- }
-
- return data;
-}
-
-function onCommit() {
- State.update({
- image: {},
- text: "",
- });
-}
-
-function textareaInputHandler(value) {
- const showAccountAutocomplete = /@[\w][^\s]*$/.test(value);
- State.update({ text: value, showAccountAutocomplete });
-}
-
-function autoCompleteAccountId(id) {
- let text = state.text.replace(/[\s]{0,1}@[^\s]*$/, "");
- text = `${text} @${id}`.trim() + " ";
- State.update({ text, showAccountAutocomplete: false });
-}
-
-const Wrapper = styled.div`
- --padding: 24px;
- position: relative;
-
- @media (max-width: 1200px) {
- --padding: 12px;
- }
-`;
-
-const Avatar = styled.div`
- width: 40px;
- height: 40px;
- pointer-events: none;
- position: absolute;
- top: var(--padding);
- left: var(--padding);
-
- img {
- object-fit: cover;
- border-radius: 40px;
- width: 100%;
- height: 100%;
- }
-
- @media (max-width: 992px) {
- display: none;
- }
-`;
-
-const Textarea = styled.div`
- display: grid;
- vertical-align: top;
- align-items: center;
- position: relative;
- align-items: stretch;
-
- &::after,
- textarea {
- width: 100%;
- min-width: 1em;
- height: unset;
- min-height: 164px;
- font: inherit;
- padding: var(--padding) var(--padding) calc(40px + (var(--padding) * 2))
- calc(40px + (var(--padding) * 2));
- margin: 0;
- resize: none;
- background: none;
- appearance: none;
- border: none;
- grid-area: 1 / 1;
- overflow: hidden;
- outline: none;
-
- @media (max-width: 1200px) {
- min-height: 124px;
- }
-
- @media (max-width: 992px) {
- padding-left: var(--padding);
- }
- }
-
- &::after {
- content: attr(data-value) " ";
- visibility: hidden;
- white-space: pre-wrap;
- }
-
- textarea {
- transition: all 200ms;
-
- &::placeholder {
- opacity: 1;
- color: #687076;
- }
-
- &:empty + p {
- display: block;
- }
-
- &:focus {
- box-shadow: inset 0 0 30px rgba(0, 0, 0, 0.05);
- }
- }
-`;
-
-const TextareaDescription = styled.p`
- position: absolute;
- top: calc(var(--padding) + 24px);
- left: calc(42px + (var(--padding) * 2));
- right: var(--padding);
- font-size: 10px;
- line-height: 18px;
- font-weight: 400;
- color: #687076;
- pointer-events: none;
- display: none;
-
- a {
- color: #000;
- outline: none;
- font-weight: 600;
- pointer-events: auto;
-
- &:hover,
- &:focus {
- color: #000;
- text-decoration: underline;
- }
- }
-
- @media (max-width: 992px) {
- left: var(--padding);
- }
-`;
-
-const Actions = styled.div`
- display: inline-flex;
- gap: 12px;
- position: absolute;
- bottom: var(--padding);
- right: var(--padding);
-
- .commit-post-button,
- .preview-post-button {
- background: #59e692;
- color: #09342e;
- border-radius: 40px;
- height: 40px;
- padding: 0 35px;
- font-weight: 600;
- font-size: 14px;
- border: none;
- cursor: pointer;
- transition: background 200ms, opacity 200ms;
-
- &:hover,
- &:focus {
- background: rgb(112 242 164);
- outline: none;
- }
-
- &:disabled {
- opacity: 0.5;
- pointer-events: none;
- }
- }
-
- .preview-post-button {
- color: #11181c;
- background: #f1f3f5;
- padding: 0;
- width: 40px;
-
- &:hover,
- &:focus {
- background: #d7dbde;
- outline: none;
- }
- }
-
- .upload-image-button {
- display: flex;
- align-items: center;
- justify-content: center;
- background: #f1f3f5;
- color: #11181c;
- border-radius: 40px;
- height: 40px;
- min-width: 40px;
- font-size: 0;
- border: none;
- cursor: pointer;
- transition: background 200ms, opacity 200ms;
-
- &::before {
- font-size: 16px;
- }
-
- &:hover,
- &:focus {
- background: #d7dbde;
- outline: none;
- }
-
- &:disabled {
- opacity: 0.5;
- pointer-events: none;
- }
-
- span {
- margin-left: 12px;
- }
- }
-
- .d-inline-block {
- display: flex !important;
- gap: 12px;
- margin: 0 !important;
-
- .overflow-hidden {
- width: 40px !important;
- height: 40px !important;
- }
- }
-`;
-
-const PreviewWrapper = styled.div`
- position: relative;
- padding: var(--padding);
- padding-bottom: calc(40px + (var(--padding) * 2));
-`;
-
-const AutoComplete = styled.div`
- position: absolute;
- z-index: 5;
- bottom: 0;
- left: 0;
- right: 0;
-
- > div > div {
- padding: calc(var(--padding) / 2);
- }
-`;
-
-return (
-
- {state.showPreview ? (
-
-
-
- ) : (
- <>
-
-
-
-
-
-);
diff --git a/apps/devs.near/widget/dao/connect.jsx b/apps/devs.near/widget/dao/connect.jsx
deleted file mode 100644
index cb3ffae..0000000
--- a/apps/devs.near/widget/dao/connect.jsx
+++ /dev/null
@@ -1,97 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const daoId = props.daoId ?? "multi.sputnik-dao.near";
-
-const policy = Near.view(daoId, "get_policy");
-
-if (policy === null) {
- return "";
-}
-
-const deposit = policy.proposal_bond;
-
-const followEdge = Social.keys(
- `${accountId}/graph/follow/${daoId}`,
- undefined,
- {
- values_only: true,
- }
-);
-
-const inverseEdge = Social.keys(
- `${daoId}/graph/follow/${accountId}`,
- undefined,
- {
- values_only: true,
- }
-);
-
-const loading = followEdge === null || inverseEdge === null;
-const isFollowing = Object.keys(followEdge || {}).length > 0;
-const isInverse = Object.keys(inverseEdge || {}).length > 0;
-
-const type = follow ? "unfollow" : "follow";
-
-const follow_args = JSON.stringify({
- data: {
- [daoId]: {
- graph: {
- follow: {
- [accountId]: "",
- },
- },
- index: {
- graph: {
- key: follow,
- value: {
- type: follow,
- accountId: [accountId],
- },
- },
- notify: {
- key: [accountId],
- value: {
- type: follow,
- },
- },
- },
- },
- },
-});
-
-const proposal_args = Buffer.from(follow_args, "utf-8").toString("base64");
-
-const handleProposal = () => {
- Near.call([
- {
- contractName: daoId,
- methodName: "add_proposal",
- args: {
- proposal: {
- description: "connection request",
- kind: {
- FunctionCall: {
- receiver_id: "social.near",
- actions: [
- {
- method_name: "set",
- args: proposal_args,
- deposit: "80000000000000000000000",
- gas: "219000000000000",
- },
- ],
- },
- },
- },
- },
- deposit: deposit,
- gas: "219000000000000",
- },
- ]);
-};
-
-return (
-
- {isFollowing && }
- {isFollowing ? "Member" : isInverse ? "Join" : "Connect"}
-
-);
diff --git a/apps/devs.near/widget/dbos.jsx b/apps/devs.near/widget/dbos.jsx
deleted file mode 100644
index 0bc1dde..0000000
--- a/apps/devs.near/widget/dbos.jsx
+++ /dev/null
@@ -1,130 +0,0 @@
-const curatorId = props.accountId ?? context.accountId ?? "hack.near";
-const curationId = props.curationId ?? "dbos";
-const curationType = props.curationType ?? "projects";
-
-const path = `${curatorId}/curation/${curationId}/${curationType}`;
-const init = Social.get(path, "optimistic", {
- subscribe: true,
-});
-
-State.init({
- curatorId,
- curationId,
- curationType,
- things: JSON.parse(init) ?? [],
- newThing: "",
-});
-
-const isCurator = state.curatorId === context.accountId;
-
-function addThing(newThing) {
- state.things.push(newThing);
-
- State.update({
- things: state.things,
- });
-}
-
-function removeThing(thingKey) {
- const updatedThings = state.things.filter((thing) => thing !== thingKey);
-
- State.update({
- things: updatedThings,
- });
-}
-
-const handleSave = () => {
- const data = {
- curation: {
- [state.curationId]: {
- [state.curationType]: state.things,
- },
- },
- };
-
- Social.set(data, {
- onCommit: () => {},
- onCancel: () => {},
- });
-};
-
-const items = things ? JSON.parse(things) : [];
-
-return (
-
-
Curation
-
{state.curationId}
-
State.update({ curationId: e.target.value })}
- />
-
- Who: {state.curatorId}
-
-
State.update({ curatorId: e.target.value })}
- />
-
- What: {state.curationType}
-
-
State.update({ curatorType: e.target.value })}
- />
-
-
- {isCurator ? (
-
update list
- ) : (
-
propose changes
- )}
-
State.update({ newThing: e.target.value })}
- />
-
-
addThing(state.newThing)}
- >
- add
-
- {Object.keys(state.things).length > 0 && (
-
- {JSON.stringify(things) !== JSON.stringify(state.things) && (
-
- save
-
- )}
-
- )}
-
-
-
- {state.things.length ? (
-
- {state.things.map((thing, i) => {
- const [creatorId, type, thingId] = thing.split("/");
- return (
-
-
{thing}
-
-
removeThing(thing)}
- >
- remove
-
-
- );
- })}
-
- ) : (
-
- nothing found
-
- )}
-
-
-);
diff --git a/apps/devs.near/widget/dev/Rank.jsx b/apps/devs.near/widget/dev/Rank.jsx
deleted file mode 100644
index 6ffdfec..0000000
--- a/apps/devs.near/widget/dev/Rank.jsx
+++ /dev/null
@@ -1,85 +0,0 @@
-const ownerId = props.ownerId ?? "devs.near";
-const accountWidgetCount = [];
-
-let accounts = Social.keys(`${ownerId}/graph/follow/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
-});
-
-if (accounts === null) {
- return "Loading...";
-}
-
-accounts = Object.entries(accounts[ownerId].graph.follow || {});
-accounts.sort((a, b) => b[1] - a[1]);
-
-for (let i = 0; i < accounts.length; ++i) {
- let accountId = accounts[i][0];
- let widgets = Social.get(`${accountId}/widget/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
- });
- let widgetCount = 0;
- if (widgets) {
- widgetCount = Object.keys(widgets).length;
- }
- accountWidgetCount.push({
- accountId: accountId,
- count: widgetCount,
- });
-}
-
-const accountWidgetSort = accountWidgetCount.sort((a, b) => b.count - a.count);
-const numAccounts = accountWidgetSort.length;
-accountWidgetSort = accountWidgetSort.slice(0, limit);
-console.log(accountWidgetSort);
-
-const totalWidgetCount = accountWidgetCount.reduce(
- (sum, account) => sum + account.count,
- 0
-);
-
-return (
- <>
- Builders
- Total Widgets: {totalWidgetCount}
{" "}
- {accountWidgetCount.map((rank, index) => {
- let accountId = rank.accountId;
- return (
-
-
-
-
-
-
- Rank:
-
- {index + 1}
-
-
-
- Widgets:{" "}
-
- {rank.count}
-
-
-
-
-
-
-
- );
- })}
- >
-);
diff --git a/apps/devs.near/widget/dev/collab.jsx b/apps/devs.near/widget/dev/collab.jsx
deleted file mode 100644
index 2db6659..0000000
--- a/apps/devs.near/widget/dev/collab.jsx
+++ /dev/null
@@ -1,74 +0,0 @@
-const accountId = "devs.near";
-
-let following = Social.keys(`${accountId}/graph/follow/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
-});
-
-if (following === null) {
- return "Loading";
-}
-
-following = Object.entries(following[accountId].graph.follow || {});
-following.sort((a, b) => b[1] - a[1]);
-
-return (
-
-
Connect
-
- State.update({ profiles: result }),
- }}
- />
-
- {state.profiles && state.profiles.length > 0 && (
-
- {state.profiles.map(({ accountId }, i) => (
-
- ))}
-
-
- )}
- {following.map(([accountId], i) => (
-
-
-
- ))}
-
-);
diff --git a/apps/devs.near/widget/dev/community.jsx b/apps/devs.near/widget/dev/community.jsx
deleted file mode 100644
index e427cc0..0000000
--- a/apps/devs.near/widget/dev/community.jsx
+++ /dev/null
@@ -1,239 +0,0 @@
-const ownerId = props.ownerId ?? "devs.near";
-const accountId = props.accountId ?? context.accountId;
-const daoId = props.daoId ?? "build.sputnik-dao.near";
-const role = props.role ?? "community";
-
-let isBuilder = false;
-let widgets = Social.get(`${accountId}/widget/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
-});
-let widgetCount = 0;
-if (widgets) {
- widgetCount = Object.keys(widgets).length;
-}
-if (widgetCount > 0) {
- isBuilder = true;
-}
-
-const handleJoin = () => {
- const gas = 200000000000000;
- const deposit = 100000000000000000000000;
- Near.call([
- {
- contractName: daoId,
- methodName: "add_proposal",
- args: {
- proposal: {
- description: "potential member",
- kind: {
- AddMemberToRole: {
- member_id: accountId,
- role: role,
- },
- },
- },
- },
- gas: gas,
- deposit: deposit,
- },
- ]);
-};
-
-const Wrapper = styled.div`
- --section-gap: 23px;
- padding-top: 42px;
-
- @media (max-width: 1155px) {
- .line-rounded-corners {
- display: none !important;
- }
- }
-
- @media (max-width: 998px) {
- padding-top: 0;
- }
-`;
-
-const H1 = styled.h1`
- font-family: "FK Grotesk", sans-serif;
- font-style: normal;
- font-weight: 500;
- font-size: 90px;
- line-height: 1;
- text-align: center;
- letter-spacing: -0.03em;
- color: #000;
- margin: 0;
- max-width: 700px;
-
- span {
- display: inline-block;
- background: #6ce89f;
- border-radius: 20px;
- position: relative;
- padding: 0.1em 0.2em 0;
-
- svg {
- position: absolute;
- bottom: -8px;
- right: -10px;
- width: 24px;
- }
- }
-
- @media (max-width: 900px) {
- font-size: 50px;
-
- span {
- border-radius: 12px;
- svg {
- position: absolute;
- bottom: -6px;
- right: -7px;
- width: 16px;
- }
- }
- }
-`;
-
-const Text = styled.p`
- font-family: "FK Grotesk", sans-serif;
- font-size: ${(p) => p.size ?? "18px"};
- line-height: ${(p) => p.lineHeight ?? "1.5"};
- font-weight: ${(p) => p.weight ?? "400"};
- color: ${(p) => p.color ?? "#000"};
- margin-botton: 8px;
-`;
-
-const Flex = styled.div`
- display: flex;
- gap: 8px;
- align-items: center;
- flex-direction: column;
- flex-wrap: "nowrap";
-
- @media (max-width: 998px) {
- flex-direction: column;
- gap: var(--section-gap);
- }
-`;
-
-const FlexContainer = styled.div`
- display: flex;
- gap: 8px;
- align-items: center;
- flex-direction: row;
- justify-content: center;
- flex-wrap: wrap;
-
- @media (max-width: 998px) {
- flex-direction: column;
- gap: var(--section-gap);
- }
-`;
-
-const Container = styled.div`
- display: flex;
- max-width: 1080px;
- margin: 0 auto;
- gap: var(--section-gap);
- flex-direction: column;
- align-items: center;
- justify-content: center;
- text-align: center;
- padding: var(--section-gap) 24px;
-`;
-
-return (
-
-
-
-
-
- BOS{" "}
-
-
-
-
- Builders
-
-
-
- Did you know? The
-
- blockchain operating system
-
- (BOS) makes it fun and easy to create anything! Join groups,
- discover projects, and collaborate out loud. Everyone is building a
- more open web that is greater than the sum of its components.
-
-
-
- {isBuilder ? (
-
-
- Your Adventure Has Begun
-
-
-
-
-
-
-
- ) : (
-
-
- Begin a New Adventure
-
-
-
-
-
-
-
- )}
-
-
-
-
-
-
-
-
- Made Possible by Collaboration
-
-
-
-
-);
diff --git a/apps/devs.near/widget/dev/config.jsx b/apps/devs.near/widget/dev/config.jsx
deleted file mode 100644
index 8780b8e..0000000
--- a/apps/devs.near/widget/dev/config.jsx
+++ /dev/null
@@ -1,287 +0,0 @@
-const path =
- props.path || `${props.accountId || context.accountId}/settings/**`;
-const blockHeight = props.blockHeight || "final";
-
-if (accountId === null) {
- return Please connect a NEAR account...
;
-}
-
-const settings = Social.get(path, blockHeight);
-
-if (!settings) {
- return Loading...
;
-}
-
-const FormContainer = styled.div`
- width: 500px;
- margin: 0 auto;
-`;
-
-const SectionTitle = styled.h2`
- font-size: 24px;
- margin-top: 20px;
-`;
-
-const SectionContainer = styled.div`
- border: 1px solid #ccc;
- padding: 10px;
- margin-bottom: 20px;
-`;
-
-const FormGroup = styled.div`
- margin-bottom: 10px;
-`;
-
-const Label = styled.label`
- display: block;
- margin-bottom: 5px;
- font-size: 18px;
-`;
-
-const InputContainer = styled.div`
- display: flex;
- align-items: center;
-`;
-
-const Input = styled.input`
- width: 100%;
- padding: 8px;
-`;
-
-const Button = styled.button`
- margin-left: 5px;
-`;
-
-State.init({
- formData: settings,
- modifiedInputs: {},
-});
-
-function composeData(section) {
- const modifiedData = Object.entries(state.modifiedInputs).reduce(
- (result, [key, value]) => {
- const [currentSection, currentKey] = key.split("/");
- if (currentSection === section && value) {
- const [_, index] = currentKey.split("/");
- const parsedIndex = parseInt(index, 10);
- if (Number.isInteger(parsedIndex)) {
- if (!result[currentSection]) {
- result[currentSection] = {};
- }
- if (!result[currentSection][currentKey]) {
- result[currentSection][currentKey] = [];
- }
- result[currentSection][currentKey][parsedIndex] =
- state.formData[currentSection][currentKey][parsedIndex];
- } else {
- if (!result[currentSection]) {
- result[currentSection] = {};
- }
- result[currentSection][currentKey] =
- state.formData[currentSection][currentKey];
- }
- }
- return result;
- },
- {}
- );
- return modifiedData;
-}
-
-const handleInputChange = (section, key, index, value) => {
- const updatedData = { ...state.formData };
- const modifiedInputs = { ...state.modifiedInputs };
-
- if (Array.isArray(JSON.parse(updatedData[section][key]))) {
- try {
- const inputs = JSON.parse(updatedData[section][key]);
- const originalValue = JSON.parse(settings[section][key]);
-
- inputs[index].src = value;
- updatedData[section][key] = JSON.stringify(inputs);
-
- modifiedInputs[`${section}/${key}/${index}`] =
- inputs[index].src !== originalValue[index].src;
-
- State.update({ formData: updatedData, modifiedInputs });
- } catch (error) {
- console.log(
- `Error updating input value for ${section}/${key}/${index}:`,
- error
- );
- }
- } else {
- const originalValue = settings[section][key];
- updatedData[section][key] = value;
-
- modifiedInputs[`${section}/${key}/0`] =
- updatedData[section][key] !== originalValue;
-
- State.update({ formData: updatedData, modifiedInputs });
- }
-};
-const moveInputUp = (section, key, index) => {
- const updatedData = { ...state.formData };
- const modifiedInputs = { ...state.modifiedInputs };
-
- try {
- const inputs = JSON.parse(updatedData[section][key]);
-
- if (index > 0) {
- const temp = inputs[index];
- inputs[index] = inputs[index - 1];
- inputs[index - 1] = temp;
-
- const currentModifiedKey = `${section}/${key}/${index}`;
- const previousModifiedKey = `${section}/${key}/${index - 1}`;
-
- // Check if the current input value matches the original value
- const originalValue = JSON.parse(settings[section][key]);
- const isCurrentInputModified =
- inputs[index].src !== originalValue[index].src;
- const isPreviousInputModified =
- inputs[index - 1].src !== originalValue[index - 1].src;
-
- modifiedInputs[currentModifiedKey] = isCurrentInputModified;
- modifiedInputs[previousModifiedKey] = isPreviousInputModified;
-
- // Remove modified flag if the inputs match the original values
- if (!isCurrentInputModified) {
- delete modifiedInputs[currentModifiedKey];
- }
- if (!isPreviousInputModified) {
- delete modifiedInputs[previousModifiedKey];
- }
-
- updatedData[section][key] = JSON.stringify(inputs);
-
- State.update({ formData: updatedData, modifiedInputs });
- }
- } catch (error) {
- console.log(`Error moving input up for ${section}/${key}/${index}:`, error);
- }
-};
-
-const moveInputDown = (section, key, index) => {
- const updatedData = { ...state.formData };
- const modifiedInputs = { ...state.modifiedInputs };
-
- try {
- const inputs = JSON.parse(updatedData[section][key]);
-
- if (index < inputs.length - 1) {
- const temp = inputs[index];
- inputs[index] = inputs[index + 1];
- inputs[index + 1] = temp;
-
- const currentModifiedKey = `${section}/${key}/${index}`;
- const nextModifiedKey = `${section}/${key}/${index + 1}`;
-
- // Check if the current input value matches the original value
- const originalValue = JSON.parse(settings[section][key]);
- const isCurrentInputModified =
- inputs[index].src !== originalValue[index].src;
- const isNextInputModified =
- inputs[index + 1].src !== originalValue[index + 1].src;
-
- modifiedInputs[currentModifiedKey] = isCurrentInputModified;
- modifiedInputs[nextModifiedKey] = isNextInputModified;
-
- // Remove modified flag if the inputs match the original values
- if (!isCurrentInputModified) {
- delete modifiedInputs[currentModifiedKey];
- }
- if (!isNextInputModified) {
- delete modifiedInputs[nextModifiedKey];
- }
-
- updatedData[section][key] = JSON.stringify(inputs);
-
- State.update({ formData: updatedData, modifiedInputs });
- }
- } catch (error) {
- console.log(
- `Error moving input down for ${section}/${key}/${index}:`,
- error
- );
- }
-};
-
-return (
-
- settings
- {Object.entries(state.formData).map(([section, values]) => (
-
- {section}
- {Object.entries(values).map(([key, input]) => {
- let parsedInput = JSON.parse(input);
- if (parsedInput === null) {
- parsedInput = input;
- }
- return (
-
- {key}
- {Array.isArray(parsedInput) ? (
- parsedInput.map((item, index) => {
- return (
-
-
- handleInputChange(section, key, index, e.target.value)
- }
- />
- moveInputUp(section, key, index)}
- disabled={index === 0}
- >
- ↑
-
- moveInputDown(section, key, index)}
- disabled={index === parsedInput.length - 1}
- >
- ↓
-
-
- );
- })
- ) : (
-
-
- handleInputChange(section, key, 0, e.target.value)
- }
- />
-
- )}
-
- );
- })}
- composeData(section)}
- disabled={!Object.keys(composeData(section)).length}
- className="styless"
- >
- save
-
-
- ))}
-
-);
diff --git a/apps/devs.near/widget/dev/feed.jsx b/apps/devs.near/widget/dev/feed.jsx
deleted file mode 100644
index 9fd165a..0000000
--- a/apps/devs.near/widget/dev/feed.jsx
+++ /dev/null
@@ -1,134 +0,0 @@
-const accountId = props.accountId;
-const tag = props.tag;
-
-const makeLink = (accountId, tag) => {
- const args = [];
- if (accountId) {
- args.push(`accountId=${accountId}`);
- }
- if (tag) {
- args.push(`tag=${tag}`);
- }
- return `#/mob.near/widget/LastWidgets${args.length > 0 ? "?" : ""}${args.join(
- "&"
- )}`;
-};
-
-const render = (content) => {
- return (
-
-
Latest Widgets
- {(accountId || tag) && (
-
- )}
- {content}
-
- );
-};
-
-let keys = `${accountId ?? "*"}/widget/*`;
-
-if (tag) {
- const taggedWidgets = Social.keys(
- `${accountId ?? "*"}/widget/*/metadata/tags/${tag}`,
- "final"
- );
-
- if (taggedWidgets === null) {
- return render("Loading tags...");
- }
-
- keys = Object.entries(taggedWidgets)
- .map((kv) => Object.keys(kv[1].widget).map((w) => `${kv[0]}/widget/${w}`))
- .flat();
-
- if (!keys.length) {
- return render(`No widgets found by tag #${tag}`);
- }
-}
-
-const data = Social.keys(keys, "final", {
- return_type: "BlockHeight",
-});
-
-if (data === null) {
- return render("Loading...");
-}
-
-const processData = (data) => {
- const accounts = Object.entries(data);
-
- const allItems = accounts
- .map((account) => {
- const accountId = account[0];
- return Object.entries(account[1].widget).map((kv) => ({
- accountId,
- widgetName: kv[0],
- blockHeight: kv[1],
- }));
- })
- .flat();
-
- allItems.sort((a, b) => b.blockHeight - a.blockHeight);
- return allItems;
-};
-
-const renderTag = (tag, tagBadge) => (
- {tagBadge}
-);
-
-const renderItem = (a) => {
- return (
-
-
-
- );
-};
-
-console.log(data);
-
-if (JSON.stringify(data) !== JSON.stringify(state.data || {})) {
- State.update({
- data,
- allItems: processData(data),
- });
-}
-
-return render(
-
-);
diff --git a/apps/devs.near/widget/dev/info.jsx b/apps/devs.near/widget/dev/info.jsx
deleted file mode 100644
index 21d9494..0000000
--- a/apps/devs.near/widget/dev/info.jsx
+++ /dev/null
@@ -1,93 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const daoId = props.daoId ?? "build.sputnik-dao.near";
-const role = props.role ?? "community";
-
-let isBuilder = false;
-let widgets = Social.get(`${accountId}/widget/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
-});
-let widgetCount = 0;
-if (widgets) {
- widgetCount = Object.keys(widgets).length;
-}
-if (widgetCount > 0) {
- isBuilder = true;
-}
-
-const policy = Near.view(daoId, "get_policy");
-
-if (policy === null) {
- return "";
-}
-
-const groups = policy.roles
- .filter((role) => role.name === "community")
- .map((role) => {
- const group = role.kind.Group;
-
- return group;
- });
-
-const isMember = groups.map((group) => {
- return !group
- ? false
- : group.filter((address) => address === accountId).length > 0;
-})?.[0];
-
-return (
-
-);
diff --git a/apps/devs.near/widget/dev/library.jsx b/apps/devs.near/widget/dev/library.jsx
deleted file mode 100644
index e42cbdb..0000000
--- a/apps/devs.near/widget/dev/library.jsx
+++ /dev/null
@@ -1,284 +0,0 @@
-const ownerId = "hack.near";
-const curatedComps = [
- {
- category: "Learn",
- id: "concepts",
- icon: "bi-mortarboard-fill",
- components: [
- {
- accountId: "hack.near",
- widgetName: "edu.library",
- },
- ],
- },
- {
- category: "Quickstart",
- icon: "bi-rocket-takeoff-fill",
- id: "quickstart",
- components: [
- {
- accountId: "gagdiez.near",
- widgetName: "Greeter",
- },
- ],
- },
- {
- category: "Discover",
- icon: "bi-stars",
- id: "social",
- components: [
- {
- accountId: "mob.near",
- widgetName: "Explorer",
- },
- {
- accountId: "efiz.near",
- widgetName: "Tree",
- },
- {
- accountId: "every.near",
- widgetName: "browser",
- },
- ],
- },
- {
- category: "Examples",
- id: "examples",
- icon: "bi-map-fill",
- components: [
- {
- accountId: "gagdiez.near",
- widgetName: "HelloNear",
- },
- {
- accountId: "ostolex.near",
- widgetName: "DiceWidgetDemo",
- },
- {
- accountId: "dorgon108.near",
- widgetName: "TypeAheadExample",
- },
- {
- accountId: "mob.near",
- widgetName: "MarkdownEditorIframe",
- },
- ],
- },
- {
- category: "Tools",
- id: "tools",
- icon: "bi-tools",
- components: [
- { accountId: "hack.near", widgetName: "docs.cli" },
- { accountId: "mob.near", widgetName: "Explorer" },
- { accountId: "dataplatform.near", widgetName: "QueryApi.App" },
- { accountId: "bozon.near", widgetName: "WidgetHistory" },
- { accountId: "hack.near", widgetName: "GitBos" },
- { accountId: "azbang.near", widgetName: "CallbackEditor" },
- ],
- },
- {
- category: "Standards",
- id: "standards",
- icon: "bi-rulers",
- components: [
- {
- accountId: "mob.near",
- widgetName: "MetadataEditor",
- },
- {
- accountId: "efiz.near",
- widgetName: "every.post",
- },
- {
- accountId: "efiz.near",
- widgetName: "every.post.view",
- },
- {
- accountId: "near",
- widgetName: "FollowButton",
- },
- {
- accountId: "mob.near",
- widgetName: "Welcome.RHS.Editor",
- },
- {
- accountId: "mob.near",
- widgetName: "WidgetSource",
- },
- {
- accountId: "mob.near",
- widgetName: "IndexFeed",
- },
- {
- accountId: "mob.near",
- widgetName: "Image",
- },
- {
- accountId: "manzanal.near",
- widgetName: "Badge",
- },
- ],
- },
-];
-const filterTag = props.commonComponentTag ?? "edu";
-const debug = props.debug ?? false;
-
-const searchComponents = () => {
- return (
-
-
- {
- State.update({ apps: result });
- },
- }}
- />
-
- {state.apps && (
-
- {state.apps.map((app, i) => (
-
-
State.update({ apps: null }),
- extraButtons: ({ widgetPath }) => (
-
- Source
-
- ),
- }}
- />
-
- ))}
-
- )}
-
- );
-};
-
-const renderCategory = (categoryId) => {
- if (!categoryId || categoryId === "") return <>>;
- const item = curatedComps.find((i) => i.id == categoryId);
- return (
-
-
- {item.category}
-
-
-
-
- {item.components.map((comp, i) => (
-
-
-
- ))}
-
-
-
- );
-};
-State.init({
- tab: "home",
- id: "",
-});
-
-const renderHome = () => {
- return (
- <>
- {searchComponents()}
-
-
-
Resources
-
- {curatedComps && (
-
- {curatedComps.map((cat, i) => renderCategory(cat.id))}
-
- )}
-
-
- >
- );
-};
-
-const onSelect = (selection) => {
- State.update({ tab: selection.tab, id: selection.id ? selection.id : "" });
-};
-
-const renderContent = {
- home: renderHome(),
- searchComponents: searchComponents(),
- category: renderCategory(state.id),
-}[state.tab];
-
-return (
- <>
-
-
- ({
- category: i.category,
- icon: i.icon,
- id: i.id,
- })),
- }}
- />
-
-
-
-
-
-
- Everyone can build the blockchain operating system together!
-
- {renderContent}
-
-
- >
-);
diff --git a/apps/devs.near/widget/dev/main.jsx b/apps/devs.near/widget/dev/main.jsx
deleted file mode 100644
index c1bd9e1..0000000
--- a/apps/devs.near/widget/dev/main.jsx
+++ /dev/null
@@ -1,62 +0,0 @@
-const hashtag = props.hashtag ?? "dev";
-
-const defaultWidgets = [
- {
- src: "devs.near/widget/dev.menu",
- },
- {
- src: "devs.near/widget/dev.search",
- },
- {
- src: "devs.near/widget/explore.posts",
- },
-];
-
-const widgets = (main && JSON.parse(main)) ?? defaultWidgets;
-
-const Div = styled.div`
- position: relative;
- @media (hover: hover) {
- > .edit-link {
- display: none;
- }
- }
- &:hover {
- > .edit-link {
- display: inline;
- }
- }
-`;
-
-return (
-
-
-
- {widgets.map(
- ({ src, requiresLogin }, i) =>
- (!requiresLogin || context.accountId) && (
-
-
-
- )
- )}
-
-
-);
diff --git a/apps/devs.near/widget/dev/main/config.jsx b/apps/devs.near/widget/dev/main/config.jsx
deleted file mode 100644
index b745ff0..0000000
--- a/apps/devs.near/widget/dev/main/config.jsx
+++ /dev/null
@@ -1,147 +0,0 @@
-const accountId = context.accountId;
-
-const main = context.accountId
- ? Social.get(`${context.accountId}/settings/dev/main`)
- : undefined;
-
-if (main === null) {
- return "";
-}
-
-const defaultWidgets = [
- {
- src: "devs.near/widget/dev.menu",
- },
- {
- src: "devs.near/widget/dev.search",
- },
- {
- src: "devs.near/widget/explore.posts",
- },
-];
-
-const settingWidgets = main && JSON.parse(main);
-
-if (state.widgets === undefined) {
- const widgets = settingWidgets ?? defaultWidgets;
- State.update({ widgets });
-}
-
-const move = (fromIndex, toIndex) => {
- const widget = state.widgets.splice(fromIndex, 1)[0];
- if (toIndex !== undefined) {
- state.widgets.splice(toIndex, 0, widget);
- }
- State.update();
-};
-
-const renderPage = (src, requireLogin, index) => {
- return (
-
-
{src}
-
move(index, index - 1)}
- >
-
-
-
move(index, index + 1)}
- >
-
-
-
move(index, 0)}
- >
-
-
-
move(index, state.widgets.length - 1)}
- >
-
-
-
move(index, undefined)}
- >
- Remove
-
-
- );
-};
-
-const openButton = ({ widgetPath: src, onHide }) => {
- return (
- {
- state.widgets.splice(0, 0, { src });
- State.update();
- onHide();
- }}
- >
- Add
-
- );
-};
-
-return (
- <>
- Main Page Editor
-
-
-
-
-
- Save Changes
-
- {settingWidgets &&
- JSON.stringify(state.widgets) !== JSON.stringify(settingWidgets) && (
- State.update({ widgets: settingWidgets })}
- >
- Revert Changes
-
- )}
- {JSON.stringify(state.widgets) !== JSON.stringify(defaultWidgets) && (
- State.update({ widgets: defaultWidgets })}
- >
- Reset to Default
-
- )}
-
-
- {state.widgets.map(({ src, requiresLogin }, i) => (
-
- {renderPage(src, requireLogin, i)}
-
-
-
-
- ))}
- >
-);
diff --git a/apps/devs.near/widget/dev/menu.jsx b/apps/devs.near/widget/dev/menu.jsx
deleted file mode 100644
index 81c10d4..0000000
--- a/apps/devs.near/widget/dev/menu.jsx
+++ /dev/null
@@ -1,49 +0,0 @@
-return (
-
-);
diff --git a/apps/devs.near/widget/dev/posts.jsx b/apps/devs.near/widget/dev/posts.jsx
deleted file mode 100644
index 4935d9a..0000000
--- a/apps/devs.near/widget/dev/posts.jsx
+++ /dev/null
@@ -1,54 +0,0 @@
-const accountId = context.accountId;
-const daoId = "build.sputnik-dao.near";
-const groupId = props.groupId ?? "community";
-
-const policy = Near.view(daoId, "get_policy");
-
-if (policy === null) {
- return "";
-}
-
-const groups = policy.roles
- .filter((role) => role.name === groupId)
- .map((role) => {
- const group = role.kind.Group;
-
- return group;
- });
-
-const isMember = groups.map((group) => {
- return !group
- ? false
- : group.filter((address) => address === accountId).length > 0;
-})?.[1];
-
-const hashtags = [
- { name: "dev", required: true },
- { name: "bos", required: true },
-];
-return (
- <>
- {group}
-
-
- >
-);
diff --git a/apps/devs.near/widget/dev/profile.jsx b/apps/devs.near/widget/dev/profile.jsx
deleted file mode 100644
index 8737428..0000000
--- a/apps/devs.near/widget/dev/profile.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-const accountId = props.accountId ?? context.accountId ?? "devs.near";
-
-const profile = props.profile ?? Social.getr(`${accountId}/profile`);
-
-const name = profile.name;
-const description = profile.description;
-const tags = Object.keys(profile.tags ?? {});
-
-return (
-
-
-
-
- {name} {" "}
-
- @{accountId}
-
-
-
- {tags.length > 0 && (
- <>
- {tags.map((tag, i) => (
-
- #{tag}
-
- ))}
- >
- )}
-
-
-
-);
diff --git a/apps/devs.near/widget/dev/search.jsx b/apps/devs.near/widget/dev/search.jsx
deleted file mode 100644
index 5665d17..0000000
--- a/apps/devs.near/widget/dev/search.jsx
+++ /dev/null
@@ -1,49 +0,0 @@
-return (
-
-
apps
-
- {
- State.update({ apps: result });
- },
- }}
- />
-
- {state.apps && (
-
- {state.apps.map((app, i) => (
-
-
State.update({ apps: null }),
- extraButtons: ({ widgetPath }) => (
-
- Source
-
- ),
- }}
- />
-
- ))}
-
- )}
-
-
-
-);
diff --git a/apps/devs.near/widget/dev/side.jsx b/apps/devs.near/widget/dev/side.jsx
deleted file mode 100644
index 8732446..0000000
--- a/apps/devs.near/widget/dev/side.jsx
+++ /dev/null
@@ -1,62 +0,0 @@
-const side = context.accountId
- ? Social.get(`${context.accountId}/settings/dev/side`)
- : undefined;
-
-if (side === null) {
- return "";
-}
-
-const defaultWidgets = [
- {
- src: "devs.near/widget/dev.info",
- },
- {
- src: "devs.near/widget/dev.profile",
- },
- {
- src: "devs.near/widget/dev.collab",
- },
-];
-
-const widgets = (side && JSON.parse(side)) ?? defaultWidgets;
-
-const Div = styled.div`
- position: relative;
- @media (hover: hover) {
- > .edit-link {
- display: none;
- }
- }
- &:hover {
- > .edit-link {
- display: inline;
- }
- }
-`;
-
-return (
-
-
-
- {widgets.map(
- ({ src, requiresLogin }, i) =>
- (!requiresLogin || context.accountId) && (
-
-
-
- )
- )}
-
-
-);
diff --git a/apps/devs.near/widget/dev/side/config.jsx b/apps/devs.near/widget/dev/side/config.jsx
deleted file mode 100644
index 5202a36..0000000
--- a/apps/devs.near/widget/dev/side/config.jsx
+++ /dev/null
@@ -1,147 +0,0 @@
-const accountId = context.accountId;
-
-const side = context.accountId
- ? Social.get(`${context.accountId}/settings/dev/side`)
- : undefined;
-
-if (side === null) {
- return "";
-}
-
-const defaultWidgets = [
- {
- src: "devs.near/widget/dev.info",
- },
- {
- src: "devs.near/widget/dev.profile",
- },
- {
- src: "devs.near/widget/dev.collab",
- },
-];
-
-const settingWidgets = side && JSON.parse(side);
-
-if (state.widgets === undefined) {
- const widgets = settingWidgets ?? defaultWidgets;
- State.update({ widgets });
-}
-
-const move = (fromIndex, toIndex) => {
- const widget = state.widgets.splice(fromIndex, 1)[0];
- if (toIndex !== undefined) {
- state.widgets.splice(toIndex, 0, widget);
- }
- State.update();
-};
-
-const renderMenu = (src, requireLogin, index) => {
- return (
-
-
{src}
-
move(index, index - 1)}
- >
-
-
-
move(index, index + 1)}
- >
-
-
-
move(index, 0)}
- >
-
-
-
move(index, state.widgets.length - 1)}
- >
-
-
-
move(index, undefined)}
- >
- Remove
-
-
- );
-};
-
-const openButton = ({ widgetPath: src, onHide }) => {
- return (
- {
- state.widgets.splice(0, 0, { src });
- State.update();
- onHide();
- }}
- >
- Add
-
- );
-};
-
-return (
- <>
- Dev Sidebar Editor
-
-
-
-
-
- Save Changes
-
- {settingWidgets &&
- JSON.stringify(state.widgets) !== JSON.stringify(settingWidgets) && (
- State.update({ widgets: settingWidgets })}
- >
- Revert
-
- )}
- {JSON.stringify(state.widgets) !== JSON.stringify(defaultWidgets) && (
- State.update({ widgets: defaultWidgets })}
- >
- Reset
-
- )}
-
-
- {state.widgets.map(({ src, requiresLogin }, i) => (
-
- {renderMenu(src, requireLogin, i)}
-
-
-
-
- ))}
- >
-);
diff --git a/apps/devs.near/widget/dev/social.jsx b/apps/devs.near/widget/dev/social.jsx
deleted file mode 100644
index e0d64da..0000000
--- a/apps/devs.near/widget/dev/social.jsx
+++ /dev/null
@@ -1,63 +0,0 @@
-const hashtags = [
- { name: "dev", required: true },
- { name: "bos", required: true },
-];
-
-return (
-
-);
-
- Content
-
-
-
-
-
-
-
- >
-);
diff --git a/apps/devs.near/widget/dev/tabs.jsx b/apps/devs.near/widget/dev/tabs.jsx
deleted file mode 100644
index 4b1c940..0000000
--- a/apps/devs.near/widget/dev/tabs.jsx
+++ /dev/null
@@ -1,138 +0,0 @@
-State.init({
- selectedTab: props.tab || "leaderboard",
-});
-
-const accountId = props.accountId ?? context.accountId;
-const daoId = props.daoId ?? "build.sputnik-dao.near";
-
-if (props.tab && props.tab !== state.selectedTab) {
- State.update({
- selectedTab: props.tab,
- });
-}
-
-const accountUrl = `devs.near/widget/dev.community`;
-
-const Wrapper = styled.div`
- padding-bottom: 48px;
-`;
-
-const Title = styled.h1`
- font-weight: 600;
- font-size: ${(p) => p.size || "25px"};
- line-height: 1.2em;
- color: #11181c;
- margin: ${(p) => (p.margin ? "0 0 24px" : "0")};
- overflow-wrap: anywhere;
-`;
-
-const Tabs = styled.div`
- display: flex;
- height: 48px;
- border-bottom: 1px solid #eceef0;
- margin-bottom: 72px;
- overflow: auto;
- scroll-behavior: smooth;
- justify-content: center;
-
- @media (max-width: 1200px) {
- background: #f8f9fa;
- border-top: 1px solid #eceef0;
- margin: 0 -12px 48px;
-
- > * {
- flex: 1;
- }
- }
-`;
-
-const TabsButton = styled.a`
- display: inline-flex;
- align-items: center;
- justify-content: center;
- height: 100%;
- font-weight: 600;
- font-size: 23px;
- padding: 0 12px;
- position: relative;
- color: ${(p) => (p.selected ? "#11181C" : "#687076")};
- background: none;
- border: none;
- outline: none;
- text-align: center;
- text-decoration: none !important;
-
- &:hover {
- color: #11181c;
- cursor: pointer;
- }
-
- &::after {
- content: "";
- display: ${(p) => (p.selected ? "block" : "none")};
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- height: 3px;
- background: #59e692;
- }
-`;
-
-const handleTabClick = (tab) => {
- State.update({
- selectedTab: tab,
- });
-};
-
-return (
-
-
- handleTabClick("leaderboard")}
- selected={state.selectedTab === "leaderboard"}
- >
- Leaderboard
-
-
- handleTabClick("questions")}
- selected={state.selectedTab === "questions"}
- >
- Questions
-
-
- handleTabClick("members")}
- selected={state.selectedTab === "members"}
- >
- Members
-
-
- handleTabClick("tasks")}
- selected={state.selectedTab === "tasks"}
- >
- Tasks
-
-
-
- {state.selectedTab === "leaderboard" && (
- <>
-
- >
- )}
-
- {state.selectedTab === "questions" && (
-
- )}
-
- {state.selectedTab === "members" && (
-
- )}
-
- {state.selectedTab === "tasks" && (
-
- )}
-
-);
diff --git a/apps/devs.near/widget/devs/Rank.jsx b/apps/devs.near/widget/devs/Rank.jsx
deleted file mode 100644
index de0a474..0000000
--- a/apps/devs.near/widget/devs/Rank.jsx
+++ /dev/null
@@ -1,69 +0,0 @@
-const accountWidgetCount = [];
-const data = Social.keys("*/profile", "final");
-if (!data) {
- return "Loading...";
-}
-let accounts = Object.entries(data);
-const limit = 888;
-
-for (let i = 0; i < accounts.length; ++i) {
- let accountId = accounts[i][0];
- let widgets = Social.get(`${accountId}/widget/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
- });
- if (widgets) {
- accountWidgetCount.push({
- accountId: accountId,
- count: Object.keys(widgets).length,
- });
- }
-}
-const accountWidgetSort = accountWidgetCount.sort((a, b) => b.count - a.count);
-const numAccounts = accountWidgetSort.length;
-accountWidgetSort = accountWidgetSort.slice(0, limit);
-console.log(accountWidgetSort);
-
-return (
- <>
- Top Widget Builders
- {accountWidgetSort.map((rank, index) => {
- let accountId = rank.accountId;
- return (
-
-
-
-
-
-
- Rank:
-
- {index + 1}
-
-
-
- Widgets:{" "}
-
- {rank.count}
-
-
-
-
-
-
-
- );
- })}
- >
-);
diff --git a/apps/devs.near/widget/docs/view.jsx b/apps/devs.near/widget/docs/view.jsx
deleted file mode 100644
index 5fd3a76..0000000
--- a/apps/devs.near/widget/docs/view.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-const content = fetch(
- `https://raw.githubusercontent.com/${
- props.path ??
- "near-everything/bos-workspace/teleport/docs/teleport/README.md"
- }`
-);
-if (content === null) return "";
-
-return (
-
-
-
-);
diff --git a/apps/devs.near/widget/every/feed/view.jsx b/apps/devs.near/widget/every/feed/view.jsx
deleted file mode 100644
index bc470bb..0000000
--- a/apps/devs.near/widget/every/feed/view.jsx
+++ /dev/null
@@ -1,52 +0,0 @@
-const data = props.data;
-const typeWhitelist = JSON.stringify(data.typeWhitelist);
-const key = data.key;
-const domain = data.domain;
-const hashtagFilter = JSON.stringify(data.hashtagFilter);
-const daoId = data.daoId;
-
-// Since we know the typeWhitelist, we could prefetch widgets
-// and maybe write out a switch case?
-//
-// Or match with the name pattern? every.thing
-
-if (
- typeWhitelist === JSON.stringify(["md", "social", "every.near/type/markdown"])
-) {
- return (
- <>
-
- {daoId}
-
- >
- );
-} else {
- return (
- <>
-
-
- >
- );
-}
diff --git a/apps/devs.near/widget/every/group.jsx b/apps/devs.near/widget/every/group.jsx
deleted file mode 100644
index 2364507..0000000
--- a/apps/devs.near/widget/every/group.jsx
+++ /dev/null
@@ -1,228 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const groupId = props.groupId ?? "f8ad9d1a76259lmdpjnd74e69162a0a014";
-const creatorId = props.creatorId ?? "hack.near";
-
-const widgets = {
- group: "devs.near/widget/group.card",
- create: "devs.near/widget/group.create",
- edit: "devs.near/widget/group.edit",
-};
-
-// We get all of the groups that have been indexed
-const groups = Social.index("every", "group", { limit: 10 });
-
-// TODO: We can put an infinite scroll for groups
-// And then we could do a Social.get([...groups]) constructed from each index
-
-if (!groups) {
- return "";
-}
-
-// we check if they are a member ? Do we need this here?
-// Ohhhh you join everyone
-const isMember = Social.keys(
- `${accountId}/graph/${groupId}/${accountId}`,
- undefined,
- {
- values_only: true,
- }
-);
-
-const type = join ? "leave" : "join";
-
-const handleJoin = () => {
- Social.set({
- graph: { [groupId]: { [accountId]: "" } },
- index: {
- graph: JSON.stringify({
- key: groupId,
- value: {
- type,
- accountId,
- },
- }),
- notify: JSON.stringify({
- key: creatorId, // in that case, who should the creator be?
- value: {
- type,
- accountId,
- message: "everyone is growing!",
- },
- }),
- },
- });
-};
-
-const Container = styled.div`
- padding: 23px 0;
- margin: 0;
-
- .top-right {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- }
-
- .bell-icon {
- font-size: 23px;
- color: #fff;
- margin-left: 5px;
- text-decoration: none;
- transition: color 0.3s ease-in-out;
- }
-
- .bell-icon:hover {
- color: #fff;
- }
-
- .bell-icon .bi-bell {
- display: inline;
- }
-
- .bell-icon .bi-bell-fill {
- display: none;
- }
-
- .bell-icon:hover .bi-bell {
- display: none;
- }
-
- .bell-icon:hover .bi-bell-fill {
- display: inline;
- }
-`;
-
-const Header = styled.div`
- background: black;
-
- .large-text {
- font-size: 19px;
- font-weight: 555;
- }
-`;
-
-const Navbar = styled.div`
- margin-left: 20px;
- @media only screen and (max-width: 1061px) {
- margin: 10px 0 0 0;
- }
-`;
-
-const Center = styled.div`
- display: flex;
- justify-content: space-between;
- gap: 20px;
- align-items: flex-start;
-`;
-
-const GroupCard = styled.div`
- flex-basis: calc(33.33% - 20px);
- margin: 0;
-`;
-
-const Grid = styled.div`
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-gap: 10px;
-
- @media (hover: none) {
- grid-template-columns: repeat(1, 1fr);
- }
-`;
-
-const { Feed } = VM.require("efiz.near/widget/Module.Feed");
-Feed = Feed || (() => <>>);
-
-return (
- <>
-
-
-
-
-
-
-
- {/* What's the purpose of this? */}
- {true ? (
- State.update({ showModal: true })}
- className="btn btn-success"
- >
- create
-
- ) : (
-
- start
-
- )}
-
-
-
- Discover Groups
-
- {
- return
- }}
- Layout={Grid}
- />
-
-
-
- {state.showModal && (
- State.update({ showModal: false }),
- }}
- />
- )}
- {state.showModalEdit && (
- State.update({ showModalEdit: false }),
- }}
- />
- )}
- >
-);
diff --git a/apps/devs.near/widget/everything/sdk.jsx b/apps/devs.near/widget/everything/sdk.jsx
deleted file mode 100644
index 5dac94d..0000000
--- a/apps/devs.near/widget/everything/sdk.jsx
+++ /dev/null
@@ -1,239 +0,0 @@
-const isPrimitiveType = (type) =>
- ["string", "number", "boolean", "date", "md"].includes(type);
-
-const isComplexType = (type) =>
- Array.isArray(type)
- ? "typesArray" // I don't know if we still need to handle this
- : type === "array"
- ? "array"
- : typeof type === "object"
- ? "object"
- : typeof type === "string" && !isPrimitiveType(type)
- ? "custom"
- : null;
-
-const getDefaultForPrimitive = (type, defaultValue) => {
- if (defaultValue !== undefined) {
- return defaultValue;
- }
- switch (type) {
- case "string":
- return "";
- case "number":
- return null; // should this be 0?
- case "boolean":
- return null; // do we want this to be false?
- case "date":
- return null; // do we want this to be today?
- case "md":
- return null;
- }
-};
-
-const typeToEmptyData = (typeDef) => {
- const obj = {};
-
- Object.keys(typeDef.properties).forEach((key) => {
- const fieldSchema = typeDef.properties[key];
- const type = fieldSchema.type;
-
- if (isPrimitiveType(type)) {
- obj[key] = getDefaultForPrimitive(type, fieldSchema.defaultValue);
- } else if (isComplexType(type) === "array") {
- obj[key] = fieldSchema.defaultValue ? [...fieldSchema.defaultValue] : [];
- } else if (isComplexType(type) === "object") {
- obj[key] = typeToEmptyData({ properties: type.properties });
- } else {
- console.log("edge case not handled for type: " + type);
- obj[key] = fieldSchema.defaultValue ?? null;
- }
- });
-
- return obj;
-};
-
-function checkProps(props, typeDef, prefix) {
- if (!prefix) {
- prefix = "";
- }
- const missingProps = [];
-
- for (const [key, value] of Object.entries(typeDef.properties)) {
- const fullKey = prefix ? `${prefix}.${key}` : key;
-
- if (!props.hasOwnProperty(key)) {
- missingProps.push(`${fullKey}`);
- continue;
- }
-
- const propValue = props[key];
-
- if (value.type === "object" && value.properties) {
- missingProps.push(...checkProps(propValue, value, fullKey));
- }
-
- if (value.validation && value.validation.required && propValue == null) {
- missingProps.push(`${fullKey} (required)`);
- }
- }
-
- return missingProps;
-}
-
-function MissingPropsWarning({ props, typeDef, WarningElement }) {
- const missingProps = checkProps(props, typeDef);
- return (
- missingProps.length > 0 && (
- <>
- {WarningElement ? (
-
- ) : (
-
-
-
Attention!
-
-
-
- {`There ${missingProps.length === 1 ? "is" : "are"} ${
- missingProps.length
- } missing or invalid prop${
- missingProps.length === 1 ? "" : "s"
- }:`}
-
-
- {missingProps.map((prop) => (
-
- {prop}
-
- ))}
-
-
-
- )}
- >
- )
- );
-}
-
-/*__@import:everything/utils/UUID__*/
-
-function filterByType(data, targetType) {
- return Object.keys(data || {}).reduce((result, key) => {
- if (data[key].metadata?.type === targetType) {
- result[key] = data[key];
- }
- return result;
- }, {});
-}
-
-function deepMerge(obj1, obj2) {
- return Object.keys({ ...obj1, ...obj2 }).reduce((acc, key) => {
- if (
- obj1[key] &&
- obj2[key] &&
- typeof obj1[key] === "object" &&
- typeof obj2[key] === "object"
- ) {
- acc[key] = deepMerge(obj1[key], obj2[key]);
- } else {
- acc[key] = obj2[key] !== undefined ? obj2[key] : obj1[key];
- }
- return acc;
- }, {});
-}
-
-/**
- * Gets all things of a given type, optionally filtered by accounts and blockHeight
- * @param {string} type - type of thing to filter by
- * @param {Array} [accounts] - Optional list of accounts to filter by
- * @param {string|number} blockHeight - Optional blockHeight to use; defaults to "final"
- * @returns {object} - all things of the given type
- */
-function getAllThings(type, accounts, blockHeight) {
- let paths;
- if (!blockHeight) {
- blockHeight = "final";
- }
-
- if (Array.isArray(accounts) && accounts.length) {
- // We could change this to get all metadata, metadata includes type
- // and then we have all we need in order to show on screens. Anything else can be fetched separately.
- paths = accounts.map((account) => `${account}/thing/*/metadata/*`);
- } else {
- paths = ["*/thing/*/metadata/*"];
- }
- const things = Social.get(paths, blockHeight);
- return filterByType(things, type) ?? {};
-}
-
-/**
- * Gets the thing matching id, optionally filtered by accounts and blockHeight
- * @param {string} id - thing id
- * @param {Array} [accountIds] - Optional list of accounts to filter by. If not provided, defaults to any account.
- * @param {string|number} blockHeight - Optional blockHeight to use; defaults to "final"
- * @returns {object|null} - the thing, multiple things if matches id across accounts, or null if not found
- */
-function getThing(id, accountIds, blockHeight) {
- let paths;
- if (!blockHeight) {
- blockHeight = "final";
- }
-
- if (Array.isArray(accountIds) && accountIds.length) {
- paths = accountIds.map((accountId) => `${accountId}/thing/${id}/**`);
- } else {
- paths = [`*/thing/${id}/**`];
- }
-
- const thing = Social.get(paths, blockHeight) || {};
-
- return thing;
-}
-
-function deleteThing(id) {
- Social.set({
- thing: {
- [id]: null,
- },
- });
-}
-
-/**
- * Creates a thing with the given type, data, and metadata
- * Subsequently calls onCommit or onCancel
- * @param {string} type - type of thing to create
- * @param {object} data - data to store
- * @param {object} metadata - metadata to store
- */
-function createThing(type, data, metadata) {
- // Temporary small id
- const id = UUID.generate("xxxxxxx");
- return {
- [id]: {
- // I think there may be some value in stringify-ing the data and storing in empty key, but I'm not sure
- // Maybe it's for published data? Data that has no relations?
- // It's more space efficient for the social contract if we limit the number of keys
- "": JSON.stringify(data),
- data, // so I'm just gonna do both for right now :)
- metadata: { ...metadata, type },
- },
- };
-}
-
-return {
- filterByType,
- getThing,
- getAllThings,
- deepMerge,
- deleteThing,
- createThing,
- isPrimitiveType,
- isComplexType,
- getDefaultForPrimative,
- typeToEmptyData,
- checkProps,
- MissingPropsWarning,
-};
diff --git a/apps/devs.near/widget/explore/posts.jsx b/apps/devs.near/widget/explore/posts.jsx
deleted file mode 100644
index 0013bac..0000000
--- a/apps/devs.near/widget/explore/posts.jsx
+++ /dev/null
@@ -1,191 +0,0 @@
-State.init({
- selectedTab: Storage.privateGet("selectedTab") || "all",
-});
-
-const domains = ["dev", "gov", "edu", "art", "fun"];
-
-const hashtags = ["near", "bos"];
-
-const previousSelectedTab = Storage.privateGet("selectedTab");
-
-if (previousSelectedTab && previousSelectedTab !== state.selectedTab) {
- State.update({
- selectedTab: previousSelectedTab,
- });
-}
-
-let accounts = undefined;
-
-if (state.selectedTab === "following" && context.accountId) {
- const graph = Social.keys(`${context.accountId}/graph/follow/*`, "final");
- if (graph !== null) {
- accounts = Object.keys(graph[context.accountId].graph.follow || {});
- accounts.push(context.accountId);
- } else {
- accounts = [];
- }
-} else {
- accounts = undefined;
-}
-
-function selectTab(selectedTab) {
- Storage.privateSet("selectedTab", selectedTab);
- State.update({ selectedTab });
-}
-
-const H2 = styled.h2`
- font-size: 19px;
- line-height: 22px;
- color: #11181c;
- margin: 0 0 24px;
- padding: 0 24px;
-
- @media (max-width: 1200px) {
- display: none;
- }
-`;
-
-const Content = styled.div`
- @media (max-width: 1200px) {
- > div:first-child {
- border-top: none;
- }
- }
-`;
-
-const ComposeWrapper = styled.div`
- border-top: 1px solid #eceef0;
-`;
-
-const FilterWrapper = styled.div`
- border-top: 1px solid #eceef0;
- padding: 24px 24px 0;
- display: flex;
- flex-direction: row;
- justify-content: space-between;
-
- @media (max-width: 1200px) {
- padding: 12px;
- }
-`;
-
-const PillSelect = styled.div`
- display: inline-flex;
- align-items: center;
-
- @media (max-width: 600px) {
- width: 100%;
-
- button {
- flex: 1;
- }
- }
-`;
-
-const PillSelectButton = styled.button`
- display: block;
- position: relative;
- border: 1px solid #e6e8eb;
- border-right: none;
- padding: 3px 24px;
- border-radius: 0;
- font-size: 12px;
- line-height: 18px;
- color: ${(p) => (p.selected ? "#fff" : "#687076")};
- background: ${(p) => (p.selected ? "#006ADC !important" : "#FBFCFD")};
- font-weight: 600;
- transition: all 200ms;
-
- &:hover {
- background: #ecedee;
- text-decoration: none;
- }
-
- &:focus {
- outline: none;
- border-color: #006adc !important;
- box-shadow: 0 0 0 1px #006adc;
- z-index: 5;
- }
-
- &:first-child {
- border-radius: 6px 0 0 6px;
- }
- &:last-child {
- border-radius: 0 6px 6px 0;
- border-right: 1px solid #e6e8eb;
- }
-`;
-
-const FeedWrapper = styled.div`
- .post {
- padding-left: 24px;
- padding-right: 24px;
-
- @media (max-width: 1200px) {
- padding-left: 12px;
- padding-right: 12px;
- }
- }
-`;
-
-return (
- <>
-
- create
- {context.accountId && (
- <>
-
-
-
- explore
-
-
-
- selectTab("all")}
- selected={state.selectedTab === "all"}
- >
- all
-
-
- selectTab("following")}
- selected={state.selectedTab === "following"}
- >
- following
-
-
-
- {
- State.update({ hashtags: value });
- }}
- placeholder="hashtag filter"
- />
- {
- State.update({ choose: value });
- }}
- placeholder="domain filter"
- />
-
-
- >
- )}
-
-
-
-
-
- >
-);
diff --git a/apps/devs.near/widget/group.jsx b/apps/devs.near/widget/group.jsx
deleted file mode 100644
index 24f4cf2..0000000
--- a/apps/devs.near/widget/group.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-const groupId = props.groupId ?? "526fb256e74eelmf0nw3n5909bc189c13d";
-const creatorId = props.creatorId ?? "*";
-
-const group =
- props.group ?? Social.get(`${creatorId}/*/${groupId}/**`, "final");
-
-if (!group) {
- return "";
-}
-
-const Container = styled.div`
- background: #fbfbfb;
- padding: 23px;
-`;
-
-return (
-
-
-
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/group/card.jsx b/apps/devs.near/widget/group/card.jsx
deleted file mode 100644
index 30d7079..0000000
--- a/apps/devs.near/widget/group/card.jsx
+++ /dev/null
@@ -1,148 +0,0 @@
-const creatorId = props.creatorId;
-const groupId = props.groupId;
-
-const groupInfo = Social.get(
- `${creatorId}/thing/${groupId}/metadata/**`,
- "final"
-);
-
-if (!groupInfo) {
- return "group details not found";
-}
-
-const canJoin = props.canJoin ?? true;
-
-const Card = styled.div`
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: 16px;
- width: 100%;
- border-radius: 12px;
- background: #fff;
- border: 1px solid #eceef0;
- box-shadow:
- 0px 1px 3px rgba(16, 24, 40, 0.1),
- 0px 1px 2px rgba(16, 24, 40, 0.06);
- overflow: hidden;
- padding: 16px;
-`;
-
-const Bell = styled.div`
- .bell {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- }
-
- .bell-icon {
- font-size: 23px;
- color: #000;
- margin-left: 5px;
- text-decoration: none;
- transition: color 0.3s ease-in-out;
- }
-
- .bell-icon:hover {
- color: #000;
- }
-
- .bell-icon .bi-bell {
- display: inline;
- }
-
- .bell-icon .bi-bell-fill {
- display: none;
- }
-
- .bell-icon:hover .bi-bell {
- display: none;
- }
-
- .bell-icon:hover .bi-bell-fill {
- display: inline;
- }
-`;
-
-const CardLeft = styled.div`
- display: flex;
- gap: 16px;
- align-items: center;
- width: 100%;
- min-width: 0;
-
- > div {
- display: flex;
- flex-direction: column;
- width: 100%;
- min-width: 0;
- }
-`;
-
-const TextLink = styled.a`
- display: block;
- margin: 0;
- font-size: 14px;
- line-height: 18px;
- color: ${(p) => (p.bold ? "#11181C !important" : "#687076 !important")};
- font-weight: ${(p) => (p.bold ? "600" : "400")};
- font-size: ${(p) => (p.small ? "12px" : "14px")};
- overflow: ${(p) => (p.ellipsis ? "hidden" : "visible")};
- text-overflow: ${(p) => (p.ellipsis ? "ellipsis" : "unset")};
- white-space: nowrap;
- outline: none;
-
- &:focus,
- &:hover {
- text-decoration: underline;
- }
-`;
-
-const TagsWrapper = styled.div`
- padding-top: 4px;
-`;
-
-return (
-
-
-
-
-
-
-
-
-
- {canJoin && context.accountId && (
- <>
- {groupKey === context.accountId && (
-
- edit
-
- )}
-
- >
- )}
-
-);
diff --git a/apps/devs.near/widget/group/create.jsx b/apps/devs.near/widget/group/create.jsx
deleted file mode 100644
index 77be826..0000000
--- a/apps/devs.near/widget/group/create.jsx
+++ /dev/null
@@ -1,310 +0,0 @@
-const creatorId = props.creatorId ?? context.accountId;
-
-const { handleClose } = props;
-
-function generateUID() {
- return (
- Math.random().toString(16).slice(2) +
- Date.now().toString(36) +
- Math.random().toString(16).slice(2)
- );
-}
-
-const groupId = props.groupId ?? generateUID();
-
-State.init({
- group,
- members: { [creatorId]: "" },
- newMember: "",
- isDao: false,
-});
-
-function addMember(newMember) {
- State.update({
- members: { ...state.members, [newMember]: "" },
- });
-}
-
-function removeMember(memberKey) {
- const updatedMembers = { ...state.members };
- delete updatedMembers[memberKey];
-
- State.update({
- members: updatedMembers,
- });
-}
-
-function isNearAddress(address) {
- if (typeof address !== "string") {
- return false;
- }
- if (!address.endsWith(".near")) {
- return false;
- }
- const parts = address.split(".");
- if (parts.length !== 2) {
- return false;
- }
- if (parts[0].length < 2 || parts[0].length > 32) {
- return false;
- }
- if (!/^[a-z0-9_-]+$/i.test(parts[0])) {
- return false;
- }
- return true;
-}
-
-const memberId = props.memberId ?? state.newMember;
-
-const isValid = isNearAddress(memberId);
-
-const CardStyled = styled.div`
- width: 100%;
- height: 100%;
- background: #f8f8f9;
- gap: 10px;
- padding: 25px;
- margin: 0 auto;
- border-radius: 10px;
- overflow-y: scroll;
-`;
-
-const CardForm = styled.div`
- display: flex;
- flex-direction: column;
- width: 100%;
- height: auto;
-`;
-
-const H1 = styled.h1`
- margin-bottom: 10px;
- font-style: normal;
- font-weight: 555;
- font-size: 23px;
-`;
-
-const Submitcontainer = styled.div`
- display: flex;
- justify-content: flex-end;
- align-items: center;
- gap: 8px;
- margin-bottom: 16px;
- @media only screen and (max-width: 480px) {
- margin-top: 10px;
- }
-`;
-
-const Modal = styled.div`
- position: fixed;
- z-index: 1;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- display: flex;
- justify-content: center;
- align-items: center;
- background: rgba(0, 0, 0, 0.7);
-`;
-
-const ComponentWrapper = styled.div`
- display: flex;
- width: 80%;
- height: 80%;
- flex-direction: column;
- align-items: flex-start;
- border-radius: 10px;
- background: #fff;
- border: 1px solid transparent;
- margin: 140px auto auto auto;
- @media only screen and (max-width: 480px) {
- width: 90%;
- }
-`;
-
-const Hr = styled.div`
- height: 1px;
- margin: 15px 0;
- width: 100%;
- background: rgba(208, 214, 217, 0.4);
-`;
-
-const Section = styled.div`
- margin: 12px 0;
-`;
-
-const handleCreate = () => {
- const data = {
- thing: {
- [groupId]: {
- "": JSON.stringify(state.group),
- metadata: {
- ...state.group,
- type: {
- group: {
- src: "every.near/type/group",
- blockHeight: "final",
- },
- },
- },
- },
- },
- graph: {
- [groupId]: {
- ...state.members,
- },
- },
- index: {
- every: JSON.stringify({
- key: "group",
- value: {
- id: groupId,
- },
- }),
- graph: JSON.stringify(
- Object.keys(state.members).map((account) => ({
- key: groupId,
- value: {
- type: "add",
- accountId: account,
- },
- }))
- ),
- },
- };
- const notify = Object.keys(state.members).filter(
- (it) => it !== context.accountId
- );
- if (notify.length > 0) {
- data.index.notify = JSON.stringify(
- notify.map((account) => ({
- key: account,
- value: {
- type: "add",
- },
- }))
- );
- }
- Social.set(data);
-};
-
-return (
-
-
-
-
-
-
-
New Group
-
-
- exit
-
-
- save
-
-
-
-
-
-
-
Details
-
- State.update({ group }),
- options: {
- name: { label: "Name" },
- image: { label: "Logo" },
- backgroundImage: { label: "Background" },
- description: { label: "About" },
- tags: {
- label: "Tags",
- tagsPattern: `*/${groupId}/tags/*`,
- placeholder:
- "art, gov, edu, dev, com, nft, ai, social",
- },
- linktree: {
- links: [
- {
- label: "Twitter",
- prefix: "https://twitter.com/",
- name: "twitter",
- },
- {
- label: "Github",
- prefix: "https://github.com/",
- name: "github",
- },
- {
- label: "Telegram",
- prefix: "https://t.me/",
- name: "telegram",
- },
- {
- label: "Website",
- prefix: "https://",
- name: "website",
- },
- ],
- },
- },
- }}
- />
-
-
-
-
Members
-
- Account ID
-
- State.update({ newMember: e.target.value })
- }
- />
-
- addMember(state.newMember)}
- >
- add
-
-
-
-
-
-
Preview
- {Object.keys(state.members).map((a) => {
- return (
-
-
-
-
-
removeMember(a)}
- >
- remove
-
-
- );
- })}
-
-
-
-
-
-
-
-
-);
diff --git a/apps/devs.near/widget/group/edit.jsx b/apps/devs.near/widget/group/edit.jsx
deleted file mode 100644
index 45adfbf..0000000
--- a/apps/devs.near/widget/group/edit.jsx
+++ /dev/null
@@ -1,228 +0,0 @@
-const { handleClose } = props;
-
-const creatorId = props.creatorId ?? context.accountId;
-
-if (!creatorId) {
- return "Please connect your NEAR account :)";
-}
-
-const groupId = props.groupId ?? "526fb256e74eelmf0nw3n5909bc189c13d";
-
-const groupData =
- props.group ?? Social.get(`${creatorId}/thing/${groupId}/**`, "final");
-
-if (!groupData) {
- return "";
-}
-
-const groupKey = Object.keys(groupData)[0];
-
-const initMembers =
- props.members ?? Social.get(`${creatorId}/graph/${groupId}/**`, "final");
-
-if (!initMembers) {
- return "";
-}
-
-State.init({
- group: groupData,
- members: initMembers,
- newMember: "",
- isDao: false,
-});
-
-function addMember(newMember) {
- State.update({
- members: { ...state.members, [newMember]: "" },
- });
-}
-
-function removeMember(memberKey) {
- const updatedMembers = { ...state.members };
- delete updatedMembers[memberKey];
-
- State.update({
- members: updatedMembers,
- });
-}
-
-function isNearAddress(address) {
- if (typeof address !== "string") {
- return false;
- }
- if (!address.endsWith(".near")) {
- return false;
- }
- const parts = address.split(".");
- if (parts.length !== 2) {
- return false;
- }
- if (parts[0].length < 2 || parts[0].length > 32) {
- return false;
- }
- if (!/^[a-z0-9_-]+$/i.test(parts[0])) {
- return false;
- }
- return true;
-}
-
-const memberId = props.memberId ?? state.newMember;
-
-const isValid = isNearAddress(memberId);
-
-const handleSave = () => {
- Social.set({
- thing: {
- [groupId]: {
- "": JSON.stringify(state.group),
- metadata: {
- ...state.group,
- type: {
- group: {
- src: "every.near/type/group",
- blockHeight: "final",
- },
- },
- },
- },
- },
-
- graph: {
- [groupId]: {
- ...state.members,
- },
- },
- index: {
- every: JSON.stringify({
- key: "group",
- value: {
- id: groupId,
- },
- }),
- graph: JSON.stringify(
- Object.keys(state.members).map((account) => ({
- key: groupId,
- value: {
- type: "add",
- accountId: account,
- },
- }))
- ),
- notify: JSON.stringify(
- Object.keys(state.members)
- .filter((it) => initMembers.includes(it))
- .map((account) => ({
- key: account,
- value: {
- type: "add",
- },
- }))
- ),
- },
- });
-};
-
-return (
- <>
- {JSON.stringify(group)}
- {groupData && (
-
-
-
Details
-
-
- State.update({ group }),
- options: {
- name: {
- label: "Name",
- placeholder: `${group[groupKey].thing[groupId].metadata.name}`,
- },
- image: { label: "Logo" },
- description: { label: "About" },
- tags: {
- label: "Tags",
- tagsPattern: `*/${groupId}/tags/*`,
- placeholder: "art, gov, edu, dev, com, nft, ai, social",
- },
- linktree: {
- links: [
- {
- label: "Twitter",
- prefix: "https://twitter.com/",
- name: "twitter",
- },
- {
- label: "Github",
- prefix: "https://github.com/",
- name: "github",
- },
- {
- label: "Telegram",
- prefix: "https://t.me/",
- name: "telegram",
- },
- {
- label: "Website",
- prefix: "https://",
- name: "website",
- },
- ],
- },
- },
- }}
- />
-
-
-
-
Members
-
- Account ID
-
State.update({ newMember: e.target.value })}
- />
-
- addMember(state.newMember)}
- >
- add
-
-
- save
-
-
-
-
- {Object.keys(state.members).map((a) => {
- return (
-
-
-
-
-
removeMember(a)}
- >
- remove
-
-
- );
- })}
-
-
-
- )}
- >
-);
diff --git a/apps/devs.near/widget/group/image.jsx b/apps/devs.near/widget/group/image.jsx
deleted file mode 100644
index 7c375a5..0000000
--- a/apps/devs.near/widget/group/image.jsx
+++ /dev/null
@@ -1,45 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const groupId = props.groupId ?? "526fb256e74eelmf0nw3n5909bc189c13d";
-
-const className = props.className ?? "group-image d-inline-block";
-const style = props.style ?? { width: "3em", height: "3em" };
-const imageStyle = props.imageStyle ?? { objectFit: "cover" };
-const imageClassName = props.imageClassName ?? "rounded w-100 h-100";
-const thumbnail = props.thumbnail ?? "thumbnail";
-
-const group = props.group;
-
-const name = group.name || "No-name group";
-const image = group.image;
-const title = props.title ?? `${name} @${accountId}`;
-const tooltip =
- props.tooltip && (props.tooltip === true ? title : props.tooltip);
-const fallbackUrl =
- "https://ipfs.near.social/ipfs/bafkreibmiy4ozblcgv3fm3gc6q62s55em33vconbavfd2ekkuliznaq3zm";
-
-const inner = (
-
-
-
-);
-
-return props.tooltip ? (
- <>
-
- >
-) : (
- inner
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/group/index.jsx b/apps/devs.near/widget/group/index.jsx
deleted file mode 100644
index a15cd55..0000000
--- a/apps/devs.near/widget/group/index.jsx
+++ /dev/null
@@ -1,109 +0,0 @@
-const groupId = props.groupId ?? "526fb256e74eelmf0nw3n5909bc189c13d";
-
-const updates = Social.index("graph", `${groupId}`, {
- limit: 10,
- order: "desc",
- subscribe: true,
-});
-
-const index = {
- action: "graph",
- key: groupId,
- options: {
- limit: 10,
- order: "desc",
- },
-};
-
-const ItemWrapper = styled.div`
- margin-bottom: 12px;
-`;
-
-State.init({
- showDetails: false,
-});
-
-const renderItem = (item) => {
- function NotificationButton({ item }) {
- switch (item.value.type) {
- case "add": {
- return (
-
- {context.accountId === item.value.accountId && ( // Context check?
-
- )}
-
- );
- }
- case "join": {
- return (
-
- {item.accountId !== context.accountId && (
-
- )}
-
- );
- }
- case "create": {
- return (
-
-
-
- );
- }
- }
- }
-
- return (
-
-
-
-
-
-
-
-
- {item.value.type === "add" && `added`}
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-return (
-
-
-
-);
diff --git a/apps/devs.near/widget/group/info.jsx b/apps/devs.near/widget/group/info.jsx
deleted file mode 100644
index 117ace5..0000000
--- a/apps/devs.near/widget/group/info.jsx
+++ /dev/null
@@ -1,38 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const groupId = props.groupId ?? "526fb256e74eelmf0nw3n5909bc189c13d";
-const creatorId = props.creatorId ?? "devs.near";
-
-const groupData =
- props.groupData ?? Social.get(`${accountId}/thing/${groupId}/metadata/**`);
-
-const groupName = groupData["name"];
-const image = group.image;
-
-return (
-
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/group/inline.jsx b/apps/devs.near/widget/group/inline.jsx
deleted file mode 100644
index 15f3b20..0000000
--- a/apps/devs.near/widget/group/inline.jsx
+++ /dev/null
@@ -1,61 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const groupId = props.groupId ?? "526fb256e74eelmf0nw3n5909bc189c13d";
-
-const group =
- props.group ?? Social.get(`${accountId}/thing/${groupId}/metadata/**`);
-
-const name = group.name;
-const description = group.description;
-const tags = Object.keys(group.tags ?? {});
-
-const Tag = styled.a`
- color: black;
- text-decoration: none;
-
- &:hover {
- color: blue;
- text-decoration: none;
- }
-`;
-
-
-return (
-
-
-
-
-
- {group.name}
-
-
-
- {tags.length > 0 && (
- <>
- {tags.map((tag, i) => (
-
-
- #{tag}
-
-
- ))}
- >
- )}
-
-
-
-);
diff --git a/apps/devs.near/widget/group/join.jsx b/apps/devs.near/widget/group/join.jsx
deleted file mode 100644
index d24325a..0000000
--- a/apps/devs.near/widget/group/join.jsx
+++ /dev/null
@@ -1,67 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const groupId = props.groupId ?? "f8ad9d1a76259lmdpjnd74e69162a0a014";
-const creatorId = props.creatorId ?? "hack.near";
-
-if (!props.accountId && !context.accountId) {
- return "";
-}
-
-const joinEdge = Social.keys(
- `${context.accountId}/graph/${groupId}/${context.accountId}`,
- undefined,
- {
- values_only: true,
- }
-);
-
-const memberEdge = Social.keys(
- `${creatorId}/graph/${groupId}/${context.accountId}`,
- undefined,
- {
- values_only: true,
- }
-);
-
-const loading = joinEdge === null || memberEdge === null;
-const join = joinEdge && Object.keys(joinEdge).length;
-const inverse = memberEdge && Object.keys(memberEdge).length;
-
-const type = join ? "leave" : "join";
-
-const handleJoin = () => {
- Social.set({
- graph: { [groupId]: { [accountId]: join ? null : "" } },
- index: {
- graph: JSON.stringify({
- key: groupId,
- value: {
- type,
- accountId,
- },
- }),
- notify: JSON.stringify([
- {
- key: creatorId,
- value: {
- type,
- accountId,
- },
- },
- ]),
- },
- });
-};
-
-return (
- <>
-
- {loading ? "loading" : join ? "leave" : member ? "accept" : "join"}
-
- >
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/group/members.jsx b/apps/devs.near/widget/group/members.jsx
deleted file mode 100644
index e36ed0b..0000000
--- a/apps/devs.near/widget/group/members.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-const groupId = props.groupId ?? "6fd36ddf4884flm20pbe91e7b208b88d16";
-const creatorId = props.creatorId ?? "*";
-
-let members = Social.keys(`${creatorId}/graph/${groupId}/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
-});
-
-if (!members) {
- return "Loading...";
-}
-
-const groupKey = Object.keys(members)[0];
-
-members = Object.entries(members[groupKey]?.graph[groupId] || {});
-members.sort((a, b) => b[1] - a[1]);
-return (
- <>
- {members.map(([accountId], i) => (
-
- ))}
- >
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/group/overlay.jsx b/apps/devs.near/widget/group/overlay.jsx
deleted file mode 100644
index cbecd65..0000000
--- a/apps/devs.near/widget/group/overlay.jsx
+++ /dev/null
@@ -1,57 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const groupId = props.groupId ?? "526fb256e74eelmf0nw3n5909bc189c13d";
-if (!groupId) {
- return "";
-}
-
-const description = Social.get(
- `${accountId}/thing/${groupId}/metadata/description`
-);
-
-const Description = styled.div`
- max-height: 8rem;
- position: relative;
- overflow: hidden;
- h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {
- font-size: 1.2rem;
- margin: 0
- }
- p {
- margin: 0
- }
- :after {
- content : "";
- position : absolute;
- z-index : 1;
- top : 4rem;
- left : 0;
- pointer-events : none;
- background-image : linear-gradient(to bottom,
- rgba(255,255,255, 0),
- rgba(255,255,255, 1) 90%);
- width : 100%;
- height : 4rem;
- }
-`;
-
-return (
-
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/group/overlay/trigger.jsx b/apps/devs.near/widget/group/overlay/trigger.jsx
deleted file mode 100644
index 1134ed2..0000000
--- a/apps/devs.near/widget/group/overlay/trigger.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-return (
-
- ),
- ...props,
- }}
- />
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/group/page.jsx b/apps/devs.near/widget/group/page.jsx
deleted file mode 100644
index 80907da..0000000
--- a/apps/devs.near/widget/group/page.jsx
+++ /dev/null
@@ -1,231 +0,0 @@
-const creatorId = props.creatorId;
-const groupId = props.groupId;
-
-const groupInfo = Social.get(`${creatorId}/thing/${groupId}/**`, "final");
-
-if (!groupInfo) {
- return "group details not found";
-}
-const groupData = JSON.parse(groupInfo[""]);
-
-const NavUnderline = styled.ul`
- border-bottom: 1px #eceef0 solid;
-
- a {
- color: #687076;
- text-decoration: none;
- }
-
- a.active {
- font-weight: bold;
- color: #0c7283;
- border-bottom: 4px solid #0c7283;
- }
-`;
-/* END_INCLUDE: "core/lib/gui/navigation" */
-
-const Button = styled.button`
- height: 40px;
- font-size: 14px;
- border-color: #e3e3e0;
- background-color: #ffffff;
-`;
-
-const Banner = styled.div`
- max-width: 100%;
- min-height: 240px;
- height: 240px;
-`;
-
-const Content = styled.div`
- display: flex;
- flex-direction: column;
- flex: 1;
-`;
-
-const { Feed } = VM.require("efiz.near/widget/Module.Feed");
-Feed = Feed || (() => <>>);
-
-const tabs = [
- {
- defaultActive: true,
- title: "Activity",
- iconClass: "bi bi-house-door",
- module: () => (
- <>
-
- (
- }
- src="mob.near/widget/MainPage.N.Post"
- props={{ accountId: p.accountId, blockHeight: p.blockHeight }}
- />
- )}
- />
- >
- ),
- },
- {
- iconClass: "bi bi-house-door",
- title: "Members",
- module: () => (
- <>
- These are mutual members across all graphs
-
- >
- ),
- },
- {
- iconClass: "bi bi-house-door",
- title: "Graphs",
- module: () => (
- <>
-
- These are the users that have created their versions of this group.
-
-
- >
- ),
- },
- {
- iconClass: "bi bi-gear",
- title: "Settings",
- module: () => (
-
- ),
- },
- ...(groupData.tabs || []),
-];
-
-State.init({
- selectedTab: tabs[0],
-});
-
-const { metadata } = groupInfo;
-const { name, description, image, backgroundImage } = metadata;
-
-function Module({ module }) {
- if (typeof module === "function") {
- return module();
- } else {
- return ;
- }
-}
-
-return (
-
-
-
-
-
-
-
-
-
-
-
-
- {name}
- {description}
-
-
-
-
- State.update({ selectedTab: tabs[3] })}
- >
- Configure Community
-
- Join
-
-
-
-
- {tabs.map(({ iconClass, title }, index) =>
- title ? (
-
- State.update({ selectedTab: tabs[index] })}
- >
-
- {title}
-
-
- ) : null
- )}
-
-
-
-
-
-);
diff --git a/apps/devs.near/widget/group/settings.jsx b/apps/devs.near/widget/group/settings.jsx
deleted file mode 100644
index e8ca3ca..0000000
--- a/apps/devs.near/widget/group/settings.jsx
+++ /dev/null
@@ -1,80 +0,0 @@
-const { groupData, groupId } = props;
-const initialTabs = groupData.tabs || [];
-State.init({
- tabs: initialTabs,
- src: "",
- blockHeight: "",
- iconClass: "",
- title: "",
- hasChanges: false,
-});
-
-const handleAddTab = () => {
- const newTab = {
- iconClass: iconClass,
- title: title,
- module: {
- src: src,
- blockHeight: blockHeight,
- },
- };
- State.update({ tabs: [...tabs, newTab], hasChanges: true });
-};
-
-const handleRemoveTab = (index) => {
- const newTabs = [...tabs];
- newTabs.splice(index, 1);
- State.update({ tabs: newTabs, hasChanges: true });
-};
-
-const handleSave = () => {
- Social.set({
- thing: {
- [groupId]: {
- "": JSON.stringify({ ...groupData, tabs }),
- },
- },
- });
- setHasChanges(false);
-};
-
-return (
-
-);
diff --git a/apps/devs.near/widget/group/stats.jsx b/apps/devs.near/widget/group/stats.jsx
deleted file mode 100644
index 76d2859..0000000
--- a/apps/devs.near/widget/group/stats.jsx
+++ /dev/null
@@ -1,55 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const groupId = props.groupId ?? "526fb256e74eelmf0nw3n5909bc189c13d";
-const creatorId = props.creatorId ?? "devs.near";
-
-if (!accountId) {
- return "";
-}
-
-const contributors = Social.keys(`${creatorId}/graph/${groupId}/*`, "final", {
- return_type: "BlockHeight",
- values_only: true,
-});
-
-const community = Social.keys(`*/graph/${groupId}/${accountId}`, "final", {
- return_type: "BlockHeight",
- values_only: true,
-});
-
-const numContributors = contributors
- ? Object.keys(contributors[accountId].graph[groupId] || {}).length
- : null;
-const numCommunity = community ? Object.keys(community || {}).length : null;
-
-return (
-
-);
\ No newline at end of file
diff --git a/apps/devs.near/widget/hyperfile.jsx b/apps/devs.near/widget/hyperfile.jsx
deleted file mode 100644
index d18a792..0000000
--- a/apps/devs.near/widget/hyperfile.jsx
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * Modal can be moved to its own module
- */
-const ModalBackdrop = styled.div`
- position: fixed;
- top: 0;
- left: 0;
- width: 100vw;
- height: 100vh;
- background-color: rgba(0, 0, 0, 0.5);
- display: flex;
- justify-content: center;
- align-items: center;
- z-index: 1001;
-`;
-
-const ModalBox = styled.div`
- background-color: white;
- min-width: 400px;
- max-width: 600px;
- padding: 20px;
- border-radius: 8px;
- box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
- z-index: 1003;
-`;
-
-const ModalHeader = styled.div`
- display: flex;
- justify-content: end;
- align-items: center;
-`;
-
-const CloseButton = styled.button`
- background: #f44336;
- color: white;
- border: none;
- border-radius: 5px;
- padding: 10px 15px;
- cursor: pointer;
- float: right;
-`;
-
-const ModalContent = styled.div`
- display: flex;
- flex-direction: column;
- min-width: 300px;
- padding: 10px;
-`;
-
-function Modal({ onClose, children }) {
- return (
-
-
-
- Close
-
- {children}
-
-
- );
-}
-
-const [isModalOpen, setModalOpen] = useState(props.isModalOpen);
-
-const toggleModal = (pluginId) => {
- setModalOpen(!isModalOpen);
-};
-
-const Button = styled.button`
- // this could take in theme
- padding: 10px 20px;
-`;
-
-const { path, data, type } = props;
-
-const parts = path.split("/");
-const creatorId = parts[0];
-
-return (
- <>
- {
- State.update({
- ...state,
- filtersOpen: open,
- });
- },
- toggle: (
- toggleModal()}>
- <>
-
- save
- >
-
- ),
- content: (
-
-
-
-
-
- ),
- }}
- />
- >
-);
diff --git a/apps/devs.near/widget/hyperfile/create.jsx b/apps/devs.near/widget/hyperfile/create.jsx
deleted file mode 100644
index a9e2950..0000000
--- a/apps/devs.near/widget/hyperfile/create.jsx
+++ /dev/null
@@ -1,292 +0,0 @@
-const Wrapper = styled.div`
- max-width: 400px;
- margin: 0 auto;
-`;
-
-const TabContent = styled.div`
- margin-top: 1rem;
-`;
-
-const Form = styled.div`
- display: flex;
- flex-direction: column;
- gap: 4px;
- width: 100%;
-`;
-
-const Label = styled.label`
- font-weight: bold;
-`;
-
-const Input = styled.input`
- padding: 5px;
-`;
-
-const Select = styled.select`
- padding: 8px;
-`;
-
-const FormGroup = styled.div`
- display: flex;
- flex-direction: column;
-`;
-
-const adapters = [
- // these can come from the user (or app) settings
- // {
- // title: "Local Storage",
- // value: "everycanvas.near/widget/adapter.local_storage",
- // saveRef: false
- // },
- // {
- // title: "SocialDB",
- // value: "everycanvas.near/widget/adapter.social",
- // },
- {
- title: "Social DB",
- value: null,
- },
- {
- title: "IPFS",
- value: "everycanvas.near/widget/adapter.ipfs",
- },
- {
- title: "Sputnik DAO",
- value: "devs.near/widget/adapter.sputnik-dao",
- },
- // {
- // title: "GitHub",
- // value: "hack.near/widget/adapter.github",
- // },
- // {
- // title: "Obsidian",
- // value: "hack.near/widget/adapter.obsidian",
- // },
- // {
- // title: "Tldraw",
- // value: "hack.near/widget/adapter.tldraw",
- // },
-];
-
-const defaultAdapter = adapters[0];
-
-const { creatorId } = props;
-
-const [json, setJson] = useState(props.data ?? "");
-const [source, setSource] = useState(props.source ?? "");
-const [adapter, setAdapter] = useState(defaultAdapter.value ?? "");
-const [reference, setReference] = useState(undefined);
-const [filename, setFilename] = useState(props.filename ?? "");
-const [activeTab, setActiveTab] = useState("data");
-const [name, setName] = useState(props.name ?? "");
-const [description, setDescription] = useState(props.description ?? "");
-const [path, setPath] = useState(props.path ?? "");
-const [type, setType] = useState(props.type ?? "");
-
-const socialDbAdapter = {
- get: (path, blockHeight) => {
- if (!path) console.log("path not provided") && null;
- if (!blockHeight) blockHeight = "final";
- return Social.get(path, blockHeight);
- },
- create: (v) => {
- const parts = path.split("/");
- return Social.set(
- {
- [parts[1]]: {
- [parts[2]]: {
- "": v,
- metadata: {
- type: type,
- },
- },
- },
- },
- {
- force: "true",
- onCommit: (v) => {
- console.log(v);
- },
- onCancel: (v) => {
- console.log(v);
- },
- }
- );
- },
-};
-
-function generateUID() {
- return (
- Math.random().toString(16).slice(2) +
- Date.now().toString(36) +
- Math.random().toString(16).slice(2)
- );
-}
-
-const handleCreate = () => {
- const isCreator = context.accountId === creatorId;
-
- // load in the state.adapter (modules for IPFS, Arweave, Ceramic, Verida, On Machina... )
- const { create } = adapter ? VM.require(adapter) : socialDbAdapter;
- console.log("creating with", adapter);
- // const { create } = VM.require(adapter) || (() => {});
- if (create) {
- // store the data somewhere, based on the adapter
- create(json)
- // .then((reference) => {
- // // now we have a reference to the data
- // // we need to name it... are we the original creator or are we forking? We don't want to overwrite any of the users custom (or maybe we do!)
- // const thingId = filename ?? generateUID();
-
- // const hyperfile = {
- // [props.type]: {
- // // which we store in the social contract
- // [thingId]: {
- // "": JSON.stringify({
- // fileformat: `${props.type}.${source}`,
- // source: source,
- // adapter: adapter,
- // reference: reference,
- // }),
- // metadata: {
- // name: name,
- // description: description,
- // type: props.type,
- // },
- // },
- // },
- // };
-
- // if (creatorId !== context.accountId) {
- // // handle request merge
- // hyperfile.index = {
- // notify: JSON.stringify({
- // key: creatorId,
- // value: {
- // type: "request",
- // data: {
- // type: "merge",
- // upstream: `${creatorId}/${props.type}/${props.filename}`,
- // origin: `${context.accountId}/${props.type}/${thingId}`,
- // },
- // },
- // }),
- // };
- // hyperfile[props.type][thingId].metadata = {
- // ...hyperfile[props.type][thingId].metadata,
- // upstream: `${creatorId}/${props.type}/${props.filename}`,
- // };
- // // I want to make a request to merge
- // // set upstream and downstream
- // }
-
- // // sometimes we're not logged in, so it doesn't do anything!
- // Social.set(hyperfile, { force: true });
- // });
- }
-};
-
-return (
-
- {context.accountId === creatorId ? "create" : "request merge"}
-
-
-
- {activeTab === "data" && (
-
-
- path
- setPath(e.target.value)}
- />
-
-
- type
- setType(e.target.value)}
- />
-
-
- source
- onChangeSource(e.target.value)}
- disabled={props.source} // disable if source is passed in
- />
-
- {/* */}
- setJson(e.target.value)}
- />
-
- adapter
- setAdapter(e.target.value)}
- >
- {adapters.map((o) => (
- {o.title}
- ))}
-
-
-
- )}
-
-
- {activeTab === "metadata" && (
-
-
- name
- setName(e.target.value)}
- />
-
-
- description
- setDescription(e.target.value)}
- />
-
-
- )}
-
-
-
- Create
-
-
-
-);
diff --git a/apps/devs.near/widget/markdown/edit.jsx b/apps/devs.near/widget/markdown/edit.jsx
deleted file mode 100644
index 993fbb5..0000000
--- a/apps/devs.near/widget/markdown/edit.jsx
+++ /dev/null
@@ -1,25 +0,0 @@
-const { value, onChange, onSubmit, onCancel } = props;
-
-return (
-
-);
diff --git a/apps/devs.near/widget/markdown/view.jsx b/apps/devs.near/widget/markdown/view.jsx
deleted file mode 100644
index 26e602a..0000000
--- a/apps/devs.near/widget/markdown/view.jsx
+++ /dev/null
@@ -1,56 +0,0 @@
-const Wrapper = styled.div`
- p {
- white-space: pre-line; // This ensures text breaks to new line
-
- span {
- white-space: normal; // and this ensures profile links look normal
- }
- }
-
- blockquote {
- margin: 1em 0;
- padding-left: 1.5em;
- border-left: 4px solid #ccc;
- color: #666;
- font-style: italic;
- font-size: inherit;
- }
-
- pre {
- background-color: #f4f4f4;
- border: 1px solid #ddd;
- border-radius: 4px;
- padding: 1em;
- overflow-x: auto;
- font-family: "Courier New", Courier, monospace;
- }
-`;
-
-const Embedded = styled.span`
- white-space: normal;
-
- p {
- white-space: normal;
- }
-`;
-
-const renderMention =
- props.renderMention ??
- ((accountId) => (
-
-
-
- ));
-
-return (
-
-
-
-);
diff --git a/apps/devs.near/widget/post/feed.jsx b/apps/devs.near/widget/post/feed.jsx
deleted file mode 100644
index 521e03c..0000000
--- a/apps/devs.near/widget/post/feed.jsx
+++ /dev/null
@@ -1,127 +0,0 @@
-const { Feed } = VM.require("devs.near/widget/Module.Feed");
-const { ContextMenu } = VM.require("efiz.near/widget/Module.ContextMenu");
-
-ContextMenu = ContextMenu || (() => <>>); // make sure you have this or else it can break
-Feed = Feed || (() => <>>);
-
-return (
-
-
- Every Post
-
-
- {
- const item = {
- path: `${p.accountId}/post/main`,
- blockHeight: p.blockHeight,
- type: "social",
- };
-
- return (
- (
- }
- src="mob.near/widget/MainPage.N.Post" // Fork and edit this
- props={{
- accountId: p.accountId,
- blockHeight: p.blockHeight,
- }}
- />
- )}
- passProps={{
- // PROPS THAT WILL BE PASSED TO FUNCTION
- show: {
- item,
- },
- }}
- handlers={{
- // FUNCTION DEFINITIONS
- show: ({ item }) => {
- const data = {
- index: {},
- };
- const notifications = ["james.near"].map((accountId) => ({
- key: accountId,
- value: {
- type: "mention",
- item,
- },
- }));
-
- if (notifications.length) {
- Social.set({
- notify: JSON.stringify(
- notifications.length > 1
- ? notifications
- : notifications[0]
- ),
- });
- }
- },
- }}
- items={{
- // MENU ITEM TO RENDER, WILL CALL FUNCTION WHEN CLICKED
- show: () => (
- <>
-
- Forward
- >
- ),
- }}
- />
- );
- }}
- />
-
-);
diff --git a/apps/devs.near/widget/profile/page.jsx b/apps/devs.near/widget/profile/page.jsx
deleted file mode 100644
index 52786e3..0000000
--- a/apps/devs.near/widget/profile/page.jsx
+++ /dev/null
@@ -1,30 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-if (!accountId) {
- return "No account ID";
-}
-
-const profile = props.profile ?? Social.getr(`${accountId}/profile`);
-
-if (profile === null) {
- return "Loading";
-}
-
-return (
-
-);
diff --git a/apps/devs.near/widget/provider.jsx b/apps/devs.near/widget/provider.jsx
deleted file mode 100644
index 7e9f802..0000000
--- a/apps/devs.near/widget/provider.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-const { path, blockHeight, editorValue, setEditorValue, Children } = props;
-
-let data = "";
-if (path) {
- data = Social.get(path, blockHeight);
-
- if (!data) {
- return Loading...
;
- }
-}
-
-function handleEditorChange(value) {
- setEditorValue(value);
-}
-
-return ;
diff --git a/apps/devs.near/widget/sidebar.jsx b/apps/devs.near/widget/sidebar.jsx
deleted file mode 100644
index 52b550e..0000000
--- a/apps/devs.near/widget/sidebar.jsx
+++ /dev/null
@@ -1,58 +0,0 @@
-const { handleItemClick } = props;
-
-const Container = styled.div`
- height: 100%;
- overflow-y: auto;
-`;
-
-const StyledItem = styled.div`
- display: flex;
- border-radius: 8px;
- background-color: var(--base100);
- padding: 10px;
- width: 100%;
- margin: 5px 0;
- cursor: pointer;
- &:hover {
- background-color: var(--base50);
- }
-`;
-
-const ImageWrapper = styled.div`
- border-radius: 50%;
- overflow: hidden;
- width: 40px;
- height: 40px;
- margin-right: 10px;
-`;
-
-const Image = styled.img`
- width: 100%;
- height: 100%;
-`;
-
-const Name = styled.div`
- flex: 1;
- align-self: center;
-`;
-
-const items = Social.keys(`${context.accountId}/widget/*`, "final");
-
-if (!items) {
- return No items found
;
-}
-
-items = Object.keys(items[context.accountId].widget);
-
-return (
-
- {items.map((item, index) => (
- handleItemClick(`${context.accountId}/widget/${item}`)}>
- {/*
-
- */}
- {item}
-
- ))}
-
-);
diff --git a/apps/devs.near/widget/update.jsx b/apps/devs.near/widget/update.jsx
deleted file mode 100644
index d704e12..0000000
--- a/apps/devs.near/widget/update.jsx
+++ /dev/null
@@ -1,40 +0,0 @@
-const src = props.src;
-const update = props.update;
-const source = Social.get(`${src}`);
-const newVersion = Social.get(`${update}`);
-
-const [ownerId, type, name] = src.split("/");
-
-const handleCreate = () =>
- Social.set({
- [`${type}`]: {
- [`${name}`]: {
- "": `${source}`,
- },
- },
- });
-
-return (
-
-
- {source === newVersion ? (
-
- Merge
-
- ) : (
-
- Merged
-
- )}
-
- ),
- ...props,
- }}
- />
-
-);
diff --git a/apps/devs.near/widget/view.jsx b/apps/devs.near/widget/view.jsx
deleted file mode 100644
index aa7f423..0000000
--- a/apps/devs.near/widget/view.jsx
+++ /dev/null
@@ -1,21 +0,0 @@
-const { path } = props;
-
-const { get } = VM.require("devs.near/widget/adapter.github");
-
-const content = get({
- path:
- path ?? "near-everything/bos-workspace/teleport/docs/teleport/README.md",
-});
-
-if (content === null) return "";
-
-return (
-
-
-
-);
diff --git a/apps/devs.near/widget/view/posts.jsx b/apps/devs.near/widget/view/posts.jsx
deleted file mode 100644
index 22163d4..0000000
--- a/apps/devs.near/widget/view/posts.jsx
+++ /dev/null
@@ -1,135 +0,0 @@
-const domains = props.domains;
-const hashtags = props.hashtags;
-
-let index;
-if (hashtags && hashtags.length > 0) {
- index = hashtags.map((it) => ({
- action: "hashtag",
- key: it.toLowerCase(),
- options: {
- limit: 10,
- order: "desc",
- accountId: props.accounts,
- },
- }));
-} else {
- if (domains && domains.length > 0) {
- index = domains.map((it) => ({
- action: it,
- key: "main",
- options: {
- limit: 10,
- order: "desc",
- accountId: props.accounts,
- },
- }));
- } else {
- index = {
- action: "post",
- key: "main",
- options: {
- limit: 10,
- order: "desc",
- accountId: props.accounts,
- },
- };
- }
-}
-
-const Post = styled.div`
- border-bottom: 1px solid #eceef0;
- padding: 24px 0 12px;
-
- @media (max-width: 1200px) {
- padding: 12px 0 0;
- }
-`;
-
-const renderItem = (a) => {
- if (hashtags && hashtags.length > 0) {
- if (domains && domains.length > 0) {
- for (let i = 0; i < domains.length; i++) {
- const it = domains[i];
- if (
- a.value.type === "social" &&
- `${a.accountId}/${it}/main` === a.value.path
- ) {
- return (
-
-
-
- );
- } else if (
- a.value.type === "social" &&
- `${a.accountId}/${it}/comment` === a.value.path
- ) {
- return (
-
-
-
- );
- }
- }
- } else {
- return (
- (a.value.type === "social" &&
- `${a.accountId}/post/main` === a.value.path && (
-
-
-
- )) ||
- (a.value.type === "social" &&
- `${a.accountId}/post/comment` === a.value.path && (
-
-
-
- ))
- );
- }
- } else {
- return (
- (a.value.type === "md" && (
-
-
-
- )) ||
- (a.value.type === "social" &&
- `${a.accountId}/post/main` === a.value.path && (
-
-
-
- )) ||
- (a.value.type === "social" &&
- `${a.accountId}/post/comment` === a.value.path && (
-
-
-
- ))
- );
- }
-};
-
-return (
-
-);
diff --git a/apps/devs.near/widget/widget/card.jsx b/apps/devs.near/widget/widget/card.jsx
deleted file mode 100644
index 1ef8177..0000000
--- a/apps/devs.near/widget/widget/card.jsx
+++ /dev/null
@@ -1,182 +0,0 @@
-const accountId = props.accountId;
-const widgetName = props.widgetName;
-const widgetPath = `${accountId}/widget/${widgetName}`;
-const blockHeight = props.blockHeight;
-const metadata = props.metadata ?? Social.getr(`${widgetPath}/metadata`);
-const renderTag = props.renderTag;
-
-const notifyAccountId = accountId;
-
-const name = metadata.name ?? widgetName;
-const description = metadata.description;
-const image = metadata.image;
-const tags = Object.keys(metadata.tags ?? {});
-const expanded = !!props.expanded;
-
-const linktree = Object.entries(metadata.linktree ?? {});
-const linktreeElements = {
- website: {
- prefix: "https://",
- icon: "bi-globe2",
- },
-};
-
-const linktreeObjects = linktree.map((o, i) => {
- const key = o[0];
- let value = o[1];
- if (!value) {
- return null;
- }
- const e = linktreeElements[key];
- if (e.prefix) {
- value = value && value.replace(e.prefix, "");
- }
- const icon = e.icon ? (
-
- ) : (
- ""
- );
- return e.prefix ? (
-
- ) : (
-
- {key}: {icon}
- {value}
-
- );
-});
-
-const descriptionKey = `${widgetPath}-description`.replaceAll(/[._\/-]/g, "--");
-
-const item = {
- type: "dev",
- path: widgetPath,
- blockHeight,
-};
-
-const widget = { widgetPath };
-
-return (
-
-
-
-
-
- {linktreeObjects}
-
-
-
-);
diff --git a/apps/devs.near/widget/widgets/latest.jsx b/apps/devs.near/widget/widgets/latest.jsx
deleted file mode 100644
index 06ca89c..0000000
--- a/apps/devs.near/widget/widgets/latest.jsx
+++ /dev/null
@@ -1,134 +0,0 @@
-const accountId = props.accountId;
-const tag = props.tag;
-
-const makeLink = (accountId, tag) => {
- const args = [];
- if (accountId) {
- args.push(`accountId=${accountId}`);
- }
- if (tag) {
- args.push(`tag=${tag}`);
- }
- return `#/mob.near/widget/LastWidgets${args.length > 0 ? "?" : ""}${args.join(
- "&"
- )}`;
-};
-
-const render = (content) => {
- return (
-
-
Latest Widgets
- {(accountId || tag) && (
-
- )}
- {content}
-
- );
-};
-
-let keys = `${accountId ?? "*"}/widget/*`;
-
-if (tag) {
- const taggedWidgets = Social.keys(
- `${accountId ?? "*"}/widget/*/metadata/tags/${tag}`,
- "final"
- );
-
- if (taggedWidgets === null) {
- return render("Loading tags...");
- }
-
- keys = Object.entries(taggedWidgets)
- .map((kv) => Object.keys(kv[1].widget).map((w) => `${kv[0]}/widget/${w}`))
- .flat();
-
- if (!keys.length) {
- return render(`No widgets found by tag #${tag}`);
- }
-}
-
-const data = Social.keys(keys, "final", {
- return_type: "BlockHeight",
-});
-
-if (data === null) {
- return render("Loading...");
-}
-
-const processData = (data) => {
- const accounts = Object.entries(data);
-
- const allItems = accounts
- .map((account) => {
- const accountId = account[0];
- return Object.entries(account[1].widget).map((kv) => ({
- accountId,
- widgetName: kv[0],
- blockHeight: kv[1],
- }));
- })
- .flat();
-
- allItems.sort((a, b) => b.blockHeight - a.blockHeight);
- return allItems;
-};
-
-const renderTag = (tag, tagBadge) => (
- {tagBadge}
-);
-
-const renderItem = (a) => {
- return (
-
-
-
- );
-};
-
-console.log(data);
-
-if (JSON.stringify(data) !== JSON.stringify(state.data || {})) {
- State.update({
- data,
- allItems: processData(data),
- });
-}
-
-return render(
-
-);
diff --git a/apps/every.near/bos.config.json b/apps/every.near/bos.config.json
deleted file mode 100644
index 16fdd7e..0000000
--- a/apps/every.near/bos.config.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "appAccount": "every.near"
-}
\ No newline at end of file
diff --git a/apps/every.near/widget/Create/Any.jsx b/apps/every.near/widget/Create/Any.jsx
deleted file mode 100644
index 59ee0b3..0000000
--- a/apps/every.near/widget/Create/Any.jsx
+++ /dev/null
@@ -1,156 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-
-const src = Social.get(`${accountId}/settings/dev/src`);
-
-if (src === null) {
- return "Loading...";
-}
-
-const defaultSource = props.src ?? "mob.near/widget/Hashtag.Feed";
-
-State.init({
- src: src ?? defaultSource,
- prop: state.prop,
- value: state.value,
- isTemplate: false,
-});
-
-const handleSave = () =>
- Social.set({
- settings: {
- dev: {
- src: state.src,
- },
- },
- });
-
-const handleCreate = () =>
- Social.set({
- widget: {
- [`${state.value}.${widgetName}`]: {
- "": `const ${state.prop} = props.${state.prop} ?? "${state.value}"; return ( );`,
- metadata: {
- tags: {
- build: "",
- },
- },
- },
- },
- });
-
-const addWidget = ({ widgetPath: src, onHide }) => {
- return (
- {
- State.update({
- src,
- });
- onHide();
- }}
- >
- Add
-
- );
-};
-
-const current_src = state.src;
-const current_prop = state.prop;
-const current_value = state.value;
-
-let string = ".near/widget/";
-
-const checkSource = (src) => {
- if (src.indexOf(string) !== -1) {
- return State.update({ isTemplate: true });
- }
-};
-
-const validTemplate = checkSource(state.src);
-
-const [ownerId, widget, widgetName] = current_src.split("/");
-
-const metadata = Social.get(
- `${ownerId}/widget/${widgetName}/metadata/**`,
- "final"
-);
-
-return (
- <>
- Create Anything
-
-
Explore Templates
-
-
-
-
-
- Template Source
-
- {!validTemplate ? (
-
- not a valid component
-
- ) : (
-
- ↳ make something based on this component:
-
- )}
-
-
- {validTemplate && (
-
-
Main Prop 🎭
-
-
- ↳ read the documentation about{" "}
-
- props
-
-
-
-
-
- )}
- {validTemplate && (
-
-
Default Value
-
- ↳ passed into template via props.{state.prop ?? "id"}
-
-
-
- )}
-
-
-
- Save Template
-
- {state.src && (
-
- Create
-
- )}
-
-
- Preview
-
-
-
- >
-);
diff --git a/apps/every.near/widget/GrantPermissions.jsx b/apps/every.near/widget/GrantPermissions.jsx
deleted file mode 100644
index a3c42e1..0000000
--- a/apps/every.near/widget/GrantPermissions.jsx
+++ /dev/null
@@ -1,48 +0,0 @@
-const connected_account = context.accountId;
-
-const social_contract_id = "social.near";
-
-State.init({
- account: "",
-});
-
-let data = {
- accountId: state.account,
-};
-
-const handleGrantAccount = () => {
- const account = data.accountId;
-
- Near.call([
- {
- contractName: social_contract_id,
- methodName: "grant_write_permission",
- args: { predecessor_id: data.accountId, keys: [connected_account] },
- deposit: "1",
- },
- ]);
-};
-
-return (
-
-
-
Grant Permissions
- {!!data.accountId && (
-
- You are granting write permissions to{" "}
- {data.accountId}
-
- )}
-
-
-
- {
- handleGrantAccount();
- }}
- >
- Grant
-
-
-
-);
diff --git a/apps/every.near/widget/Settings.jsx b/apps/every.near/widget/Settings.jsx
deleted file mode 100644
index df728b3..0000000
--- a/apps/every.near/widget/Settings.jsx
+++ /dev/null
@@ -1,187 +0,0 @@
-const accountId = props.accountId ?? context.accountId;
-const daoId = props.daoId ?? "build.sputnik-dao.near";
-
-const policy = Near.view(daoId, "get_policy");
-
-const deposit = policy.proposal_bond;
-
-let string = "sputnik-dao.near";
-let domain = ".near";
-
-State.init({
- accountId: accountId ?? "",
- daoId: daoId ?? "",
- isDao: false,
- isAccount: false,
- isAddress: false,
-});
-
-const checkDao = (daoId) => {
- if (daoId.indexOf(string) !== -1) {
- return State.update({ isDao: true });
- }
-};
-
-const checkOrgAccount = (daoId) => {
- if (daoId.indexOf(domain) !== -1) {
- return State.update({ isAddress: true });
- }
-};
-
-const checkAccount = (accountId) => {
- if (accountId.indexOf(domain) !== -1) {
- return State.update({ isAccount: true });
- }
-};
-
-const validDao = checkDao(state.daoId);
-const validAccount = checkAccount(state.accountId);
-const validOrgAccount = checkOrgAccount(state.daoId);
-
-const permission_args = JSON.stringify({
- predecessor_id: `${state.accountId}`,
- keys: [`${state.daoId}`],
-});
-
-const proposal_args = Buffer.from(permission_args, "utf-8").toString("base64");
-
-const handleProposal = () => {
- Near.call([
- {
- contractName: state.daoId,
- methodName: "add_proposal",
- args: {
- proposal: {
- description: "grant permission to edit DAO profile on NEAR Social",
- kind: {
- FunctionCall: {
- receiver_id: "social.near",
- actions: [
- {
- method_name: "grant_write_permission",
- args: proposal_args,
- deposit: "50000000000000000000000",
- gas: "30000000000000",
- },
- ],
- },
- },
- },
- },
- deposit: deposit,
- gas: "300000000000000",
- },
- ]);
-};
-
-const handleGrant = () => {
- Near.call([
- {
- contractName: "social.near",
- methodName: "grant_write_permission",
- args: {
- predecessor_id: state.accountId,
- keys: [state.daoId],
- },
- deposit: "1",
- },
- ]);
-};
-
-const onChangeDao = (daoId) => {
- State.update({
- daoId,
- });
-};
-
-const onChangeAccount = (accountId) => {
- State.update({
- accountId,
- });
-};
-
-return (
-
-
-
-
Settings
-
-
-
-
- Organization Account:
-
- {!validOrgAccount ? (
-
- ↳ must be a valid NEAR account ~ example.near
-
- ) : (
-
-
↳ must have permission to control this account
-
- -- consider using a{" "}
- DAO account ~{" "}
-
- example.sputnik-dao.near
-
-
-
- )}
-
onChangeDao(e.target.value)}
- >
-
-
- {validOrgAccount && (
-
- {validDao ?
Request Permissions: :
Grant Permissions: }
-
-
-
- {validDao ? (
-
-
- ↳ propose allowing {state.accountId} to edit profile of{" "}
- {state.daoId}
-
-
- ) : (
-
-
- ↳ give {state.accountId} ability to edit profile of{" "}
- {state.daoId}
-
-
- )}
-
-
-
-
onChangeAccount(e.target.value)}
- >
- {validDao ? (
-
-
- Submit
-
-
- ) : (
-
- Grant
-
- )}
-
-
- )}
-
-);
diff --git a/apps/every.near/widget/app.jsx b/apps/every.near/widget/app.jsx
deleted file mode 100644
index 084a9dd..0000000
--- a/apps/every.near/widget/app.jsx
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Every app is structured the same
- */
-const { page, layout, loading, ...passProps } = props;
-
-const { routes } = props.data;
-
-const { AppLayout } = VM.require("every.near/widget/layout") || {
- AppLayout: () => <>Layout loading...>,
-};
-
-if (!page) page = "home";
-
-const Theme = styled.div`
- a {
- color: inherit;
- }
-`;
-
-const [activeRoute, setActiveRoute] = useState(page);
-
-useEffect(() => {
- setActiveRoute(page);
-}, [page]);
-
-function Router({ active, routes }) {
- const routeParts = active.split(".");
-
- let currentRoute = routes;
- let src = "";
- let defaultProps = {};
-
- for (let part of routeParts) {
- if (currentRoute[part]) {
- currentRoute = currentRoute[part];
- src = currentRoute.path;
-
- if (currentRoute.init) {
- defaultProps = { ...defaultProps, ...currentRoute.init };
- }
- } else {
- // Handle 404 or default case for unknown routes
- return 404 Not Found
;
- }
- }
-
- return (
-
-
-
- );
-}
-
-const Container = styled.div`
- display: flex;
- height: 100vh;
-`;
-
-const Content = styled.div`
- width: 100%;
- height: 100%;
- overflow: scroll;
-`;
-
-return (
-
-
-
-
-
-
-
-
-
-);
diff --git a/apps/every.near/widget/browser.jsx b/apps/every.near/widget/browser.jsx
deleted file mode 100644
index bc2b6a4..0000000
--- a/apps/every.near/widget/browser.jsx
+++ /dev/null
@@ -1,146 +0,0 @@
-const path = props.path || "every.near/thing/core";
-
-State.init({
- path,
- thingSrc: path,
-});
-
-const Row = styled.div`
- display: flex;
- flex-direction: row;
- width: 100%;
-// border: 2px solid orange;
-
- @media (max-width: 767px) {
- flex-direction: column;
- }
-`;
-
-const Column = styled.div`
- flex: 1;
- display: flex;
-// justify-content: center;
-// align-items: center;
-// border: 2px solid green;
- padding: 20px;
-
- @media (max-width: 767px) {
- border-top: none;
- padding: 10px;
- }
-`;
-
-const IconBox = styled.div`
- display: flex;
- align-items: center;
- justify-content: center;
- margin-top: 10px;
-
-
- svg {
- width: 50px;
- height: 50px;
- }
-
- @media (max-width: 767px) {
- margin-top: 0;
- svg {
- width: 40px;
- height: 40px;
- }
- }
-`;
-
-const ActionButton = styled.button`
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: pointer;
-`;
-
-const Button = styled.button`
- text-transform: lowercase !important;
-`;
-
-const ButtonRow = styled.div`
- display: flex;
- flex-direction: row;
- gap: 8px;
-`;
-
-const Link = styled.a`
- text-decoration: none;
- color: inherit;
- cursor: pointer;
-`;
-
-const SubjectField = styled.input`
- font-size: 2em;
-// line-height: 1.25;
-// font-weight: 400;
-// cursor: pointer;
-// border: none;
-// outline: none;
-// background: none;
- width: 100%;
-
- @media (max-width: 767px) {
- font-size: 1.5em;
- }
-`;
-
-function Thing() {
- if (state.thingSrc) {
- return (
- <>
-
- >
- );
- }
-}
-
-// how can we have this be custom?
-// settings/every/subject
-
-function handleInputChange(e) {
- State.update({
- path: e.target.value,
- });
-}
-
-return (
- <>
-
-
-
-
-
-
-
- {
- State.update({ path: e.target.value });
- }}
- value={state.path}
- />
- State.update({ thingSrc: state.path })}>
- ➜
-
-
-
- <>
-
- >
- >
-);
diff --git a/apps/every.near/widget/core.jsx b/apps/every.near/widget/core.jsx
deleted file mode 100644
index d6fd298..0000000
--- a/apps/every.near/widget/core.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-const data = JSON.parse(
- Social.get("efiz.near/thing/routes", "final") || "null"
-);
-
-return (
-
-);
diff --git a/apps/every.near/widget/creator.jsx b/apps/every.near/widget/creator.jsx
deleted file mode 100644
index 22e1922..0000000
--- a/apps/every.near/widget/creator.jsx
+++ /dev/null
@@ -1,353 +0,0 @@
-const data = props.data || {};
-const type = props.type || "";
-const typeSrc = props.typeSrc || "every.near";
-const buildEdges = props.buildEdges;
-const template = props.template || "";
-const thingId = props.thingId;
-const defaultView = props.defaultView || "CREATE_THING";
-
-if (type !== "") {
- const parts = type.split("/");
- typeSrc = parts[0];
-}
-
-const Container = styled.div`
- display: flex;
- `;
-
-const SidePanel = styled.div`
- display: flex;
- flex-direction: column;
- gap: 10px;
- padding: 20px;
- background-color: #f2f2f2;
- width: auto;
- z-index: 50;
- min-width: 400px;
-`;
-
-const MainContent = styled.div`
- display: flex;
- flex-direction: column;
- flex-grow: 1;
- `;
-
-const FormContainer = styled.div`
- border: 1px solid #ccc;
- padding: 20px;
-`;
-
-const Header = styled.div`
- display: flex;
- flex-direction: row;
- margin-bottom: 20px;
- gap: 8px;
- background-color: #f2f2f2;
- padding: 30px;
- `;
-
-const Footer = styled.div`
- display: flex;
- flex-direction: column;
- gap: 4px;
- align-self: flex-start;
- width: 100%;
-`;
-
-const Button = styled.button`
- `;
-
-const LeftPanelItem = styled.div`
- padding: 8px;
- background-color: #ccc;
- color: white;
- border-radius: 4px;
- `;
-
-const Select = styled.select`
- `;
-
-const Label = styled.label`
-`;
-
-const Input = styled.input`
- `;
-
-const ModalOverlay = styled.div`
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, 0.5);
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: 100;
-`;
-
-const ModalContent = styled.div`
- background-color: white;
- padding: 20px;
- border-radius: 4px;
- min-width: 500px;
- height: 100%;
- overflow: scroll;
-`;
-
-const ModalTitle = styled.h3`
- margin-bottom: 10px;
-`;
-
-const Row = styled.div`
- display: flex;
- flex-direction: row;
-`;
-
-const CenteredDiv = styled.div`
- display: flex;
- align-items: center;
- justify-content: center;
- height: 100%;
- text-align: center;
-`;
-
-State.init({
- data,
- config: data,
- isModalOpen: false,
- typeSrc,
- selectedType: type,
- view: defaultView,
- preview: "TEMPLATE",
- template,
- templateVal: template,
- thingId,
-});
-
-const handleOnChange = (value) => {
- State.update({ data: { ...state.data, ...value } });
-};
-
-const handleApply = () => {
- State.update({
- config: state.data,
- template: state.templateVal,
- });
- // set the props for the main content
-};
-
-const handleSave = () => {
- // create the thing
- State.update({ isModalOpen: false });
- const thingId = state.thingId || Math.random();
- let edges = [];
- if (buildEdges) {
- const newPath = `${context.accountId}/thing/${thingId}`;
- edges = buildEdges(newPath, state.selectedType);
- }
-
- const data = {
- thing: {
- [thingId]: JSON.stringify({
- data: state.config,
- template: {
- src: state.template,
- },
- type: state.selectedType,
- }),
- },
- index: {
- thing: JSON.stringify({
- key: thingId,
- value: {
- type: state.selectedType,
- },
- }),
- },
- };
- if (edges.length) {
- data.index.edge = JSON.stringify(edges);
- }
- Social.set(data, {
- onCommit: () => {
- State.update({
- data: {},
- isModalOpen: false,
- config: undefined,
- });
- },
- onCancel: () => {
- State.update({
- isModalOpen: false,
- });
- },
- });
-};
-
-let availableTypes = [];
-const types = Social.get(`${state.typeSrc}/type/**`, "final");
-if (types !== null) {
- availableTypes =
- Object.keys(types)?.map((it) => `${state.typeSrc}/type/${it}`) || [];
-}
-
-const handleTypeChange = (e) => {
- State.update({ selectedType: e.target.value, templateVal: "", data: {} });
-};
-
-return (
-
-
-
- create {" "}
- State.update({ view: e.target.value })}
- >
- thing
- type
-
-
- {state.view === "CREATE_THING" ? (
- <>
-
- Type Source:
-
- State.update({ newTypeSrc: e.target.value })}
- placeholder={"accountId"}
- />
- State.update({ typeSrc: state.newTypeSrc })}
- >
- apply
-
-
- Type
-
-
- Select a type
- {availableTypes?.map((it) => (
-
- {it}
-
- ))}
-
-
-
-
-
-
-
- handleApply()}>apply
- State.update({ isModalOpen: true })}
- disabled={state.config === undefined}
- >
- save
-
-
- >
- ) : (
-
- )}
-
-
- {state.view === "CREATE_THING" ? (
- <>
-
- {state.preview === "TEMPLATE" ? (
- <>
- {(state.template && (
-
- )) || set a template and click apply }
- >
- ) : (
-
- )}
- >
- ) : (
- <>>
- )}
-
- {state.isModalOpen && (
-
-
- create thing
- option to provide a thing id
-
- State.update({ thingId: e.target.value })}
- placeholder="thing id"
- />
-
-
- Save
- State.update({ isModalOpen: false })}>
- Cancel
-
-
-
- )}
-
-);
diff --git a/apps/every.near/widget/every/event/view.jsx b/apps/every.near/widget/every/event/view.jsx
deleted file mode 100644
index c87024c..0000000
--- a/apps/every.near/widget/every/event/view.jsx
+++ /dev/null
@@ -1,134 +0,0 @@
-const data = props.data;
-const path = props.path;
-
-const name = data.name || "No-name profile";
-const image = data.logo;
-const backgroundImage = data.background;
-const tags = Object.keys(data.tags ?? {});
-const link = `https://everything.dev/${path}`;
-const organizer = data.organizer;
-const hashtags = data.hashtags;
-
-const nameHeader = {data.name} ;
-
-return (
- <>
-
-
- {backgroundImage && (
-
- )}
-
-
-
-
-
-
-
-
-
- {link ? (
-
- {nameHeader}
-
- ) : (
- nameHeader
- )}
- {}
-
-
- {organizer}
-
-
-
-
-
-
-
- {tags.length > 0 && (
-
- {tags.map((tag, i) => (
-
- #{tag}
-
- ))}
-
- )}
-
-
-
- ,
- }}
- />
-
-
-
- Show public tags
-
-
-
-
-
-
-
-
-
- >
-);
diff --git a/apps/every.near/widget/every/feed/create.jsx b/apps/every.near/widget/every/feed/create.jsx
deleted file mode 100644
index 8ed2ab6..0000000
--- a/apps/every.near/widget/every/feed/create.jsx
+++ /dev/null
@@ -1,33 +0,0 @@
-const onChange = props.onChange;
-const key = props.pPath;
-
-const Input = styled.input`
- padding: 8px;
-`;
-
-const Button = styled.button`
- text-transform: lowercase !important;
- padding: 8px;
-`;
-
-const Container = styled.div`
- display: flex;
- flex-direction: column;
- min-height: 300px;
-`;
-
-const options = ["md", "social", "every.near/type/image"];
-
-// {}} />
-return (
-
- {
- onChange({ typeWhitelist: value, key });
- }}
- placeholder="available types..."
- />
-
-);
diff --git a/apps/every.near/widget/every/feed/view.jsx b/apps/every.near/widget/every/feed/view.jsx
deleted file mode 100644
index e4023e8..0000000
--- a/apps/every.near/widget/every/feed/view.jsx
+++ /dev/null
@@ -1,31 +0,0 @@
-const data = props.data;
-
-return (
- <>
- {JSON.stringify(data.typeWhitelist) === JSON.stringify(["md"]) ? (
-
- ) : (
- <>>
- )}
-
- >
-);
diff --git a/apps/every.near/widget/every/hashtag/view.jsx b/apps/every.near/widget/every/hashtag/view.jsx
deleted file mode 100644
index 264ad77..0000000
--- a/apps/every.near/widget/every/hashtag/view.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-const hashtag = props.hashtag;
-const hashtags = hashtag.split(",")?.map((it) => it.trim());
-
-return (
-
-);
diff --git a/apps/every.near/widget/every/image/create.jsx b/apps/every.near/widget/every/image/create.jsx
deleted file mode 100644
index 63aa566..0000000
--- a/apps/every.near/widget/every/image/create.jsx
+++ /dev/null
@@ -1,64 +0,0 @@
-const buttonText = props.buttonText || "Upload an image";
-const onChange = props.onChange;
-const cid = props.cid ?? null;
-
-initState({
- file: { cid },
-});
-
-const ipfsUrl = (cid) => `https://ipfs.near.social/ipfs/${cid}`;
-
-const filesOnChange = (file) => {
- if (file?.length > 0) {
- State.update({
- file: {
- uploading: true,
- cid: null,
- },
- });
- const body = file[0];
- asyncFetch("https://ipfs.near.social/add", {
- method: "POST",
- headers: {
- Accept: "application/json",
- },
- body,
- }).then((res) => {
- const cid = res.body.cid;
- State.update({
- file: {
- cid,
- },
- });
- console.log(res);
- if (onChange) {
- onChange({ ipfs_cid: cid });
- }
- });
- } else {
- State.update({
- file: null,
- });
- }
-};
-
-return (
-
- {state.file.cid ?
: <>>}
-
-
- {state.file?.uploading
- ? "Uploading"
- : state.file && state.file.cid
- ? "Replace"
- : buttonText}
-
-
-);
diff --git a/apps/every.near/widget/every/image/view.jsx b/apps/every.near/widget/every/image/view.jsx
deleted file mode 100644
index c0c14dd..0000000
--- a/apps/every.near/widget/every/image/view.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-const data = props.data;
-
-function toUrl(image) {
- return (
- (image.ipfs_cid
- ? `https://ipfs.near.social/ipfs/${image.ipfs_cid}`
- : image.url) || fallbackUrl
- );
-}
-
-return ;
diff --git a/apps/every.near/widget/every/post.jsx b/apps/every.near/widget/every/post.jsx
deleted file mode 100644
index f54252d..0000000
--- a/apps/every.near/widget/every/post.jsx
+++ /dev/null
@@ -1,82 +0,0 @@
-const sources = props.sources;
-const typeWhitelist = props.typeWhitelist;
-const hashtagWhitelist = props.hashtagWhitelist;
-const accountWhitelist = props.accountWhitelist;
-const accountBlacklist = props.accountBlacklist;
-const feedOrder = props.feedOrder || "desc";
-const limit = props.limit || 10;
-const disableCaching = props.disableCaching || false;
-
-const { Post } = VM.require("efiz.near/widget/every.post.view"); // takes the data and renders, this can be a thing, or provided via a map.
-// Post template
-// template for the item in the feed...
-
-let index = [];
-const options = {
- limit: limit,
- order: feedOrder,
- accountId: accountWhitelist.length ? accountWhitelist : undefined,
-};
-// posts indexed via a hashtag are saved differently
-// than posts indexed via a domain/action
-if (hashtagWhitelist.length) {
- // get all posts saved under the hashtags
- // and we will filter domains and keys later
- index = hashtagWhitelist.map((it) => ({
- action: "hashtag",
- key: it.toLowerCase(),
- options,
- }));
-} else {
- // else, get all posts saved under the domain/action key pairs
- index = sources?.map((it) => ({
- action: it.domain,
- key: it.key,
- options,
- }));
-}
-
-function extractPath(a) {
- let path;
- if (hashtagWhitelist.length) {
- // May want to revisit this again
- // The path doesn't represent where this came from
- // For example, a comment is indexed under the parent post's key
- // but is saved under a regular post/comment path
- path = a.value.path;
- } else {
- if (a.value.type === "md") {
- path = `${a.accountId}/${a.action}/${a.key}`;
- } else {
- path = a.value.path;
- }
- }
- return path;
-}
-
-const renderItem = (a) => {
- // Filter out post if account is in blacklist
- // Filter out post if type is not in whitelist
- if (
- (accountBlacklist.length && accountBlacklist.includes(a.accountId)) ||
- (hashtagWhitelist.length && !typeWhitelist.includes(a.value.type))
- ) {
- return <>>;
- }
-
- const path = extractPath(a);
- const blockHeight = a.blockHeight;
-
- if (!Post) {
- return Loading...
;
- } else {
- return ;
- }
-};
-
-return (
-
-);
diff --git a/apps/every.near/widget/every/post/create.jsx b/apps/every.near/widget/every/post/create.jsx
deleted file mode 100644
index 70266b5..0000000
--- a/apps/every.near/widget/every/post/create.jsx
+++ /dev/null
@@ -1,32 +0,0 @@
-const typeWhitelist = props.typeWhitelist;
-const key = props.key || "main";
-
-function postThing(data) {
- // get the root thing from data
- const thing = JSON.parse(data.index.thing);
- // get the thingId
- const thingId = thing.key;
- const type = thing.value.type;
- // build the path
- const path = `${context.accountId}/thing/${thingId}`;
- // create a post referencing the thing
- data.post = {
- [key]: JSON.stringify({ path, type }),
- };
- // and tell the indexer to index the post
- data.index.post = JSON.stringify({
- key: key,
- value: {
- path,
- type,
- },
- });
- return data;
-}
-
-return (
-
-);
diff --git a/apps/every.near/widget/every/post/view.jsx b/apps/every.near/widget/every/post/view.jsx
deleted file mode 100644
index 1936e2e..0000000
--- a/apps/every.near/widget/every/post/view.jsx
+++ /dev/null
@@ -1,219 +0,0 @@
-const path = props.path;
-const blockHeight =
- props.blockHeight === "now" ? "now" : parseInt(props.blockHeight);
-const subscribe = !!props.subscribe;
-const parts = path.split("/");
-const accountId = parts[0];
-const notifyAccountId = accountId;
-
-const postUrl = `https://near.org#/near/widget/PostPage?accountId=${accountId}&blockHeight=${blockHeight}`;
-
-State.init({ hasBeenFlagged: false });
-
-const content = props.content ?? JSON.parse(Social.get(path, blockHeight));
-const type = content.type;
-
-const item = {
- type: "social",
- path: path,
- blockHeight,
-};
-
-const Post = styled.div`
- position: relative;
-
- &::before {
- content: "";
- display: block;
- position: absolute;
- left: 19px;
- top: 52px;
- bottom: 12px;
- width: 2px;
- background: #eceef0;
- }
-`;
-
-const Header = styled.div`
- margin-bottom: 0;
- display: inline-flex;
-`;
-
-const Body = styled.div`
- padding-left: 52px;
- padding-bottom: 1px;
-`;
-
-const Content = styled.div`
- img {
- display: block;
- max-width: 100%;
- max-height: 80vh;
- margin: 0 0 12px;
- }
-`;
-
-const Text = styled.p`
- display: block;
- margin: 0;
- font-size: 14px;
- line-height: 20px;
- font-weight: 400;
- color: #687076;
- white-space: nowrap;
-`;
-
-const Actions = styled.div`
- display: flex;
- align-items: center;
- gap: 12px;
- margin: -6px -6px 6px;
-`;
-
-const Comments = styled.div`
- > div > div:first-child {
- padding-top: 12px;
- }
-`;
-
-if (state.hasBeenFlagged) {
- return (
-
- This content has been flagged for moderation
-
- );
-}
-
-function renderContent() {
- if (type === "md" || type === "social") {
- return (
- <>
- {content.text && (
-
- )}
-
- {content.image && (
-
- )}
- >
- );
- } else {
- // blockHeight would preserve the original post
- // so we pass final to get latest edit
- return (
-
- );
- }
-}
-
-return (
-
-
-
-
- {renderContent()}
-
- {blockHeight !== "now" && (
-
-
- State.update({ showReply: !state.showReply }),
- }}
- />
-
- {
- State.update({ hasBeenFlagged: true });
- },
- }}
- />
-
- )}
-
- {state.showReply && (
-
- State.update({ showReply: false }),
- }}
- />
-
- )}
-
-
-
-
-
-
-);
diff --git a/apps/every.near/widget/every/thing/create.jsx b/apps/every.near/widget/every/thing/create.jsx
deleted file mode 100644
index 86bfa61..0000000
--- a/apps/every.near/widget/every/thing/create.jsx
+++ /dev/null
@@ -1,214 +0,0 @@
-const postThing = props.postThing;
-const availableTypes = JSON.parse(props.availableTypes || "null");
-
-if (!availableTypes) {
- const types = Social.get("every.near/type/**", "final");
- if (!types) {
- return <>>;
- }
- availableTypes = Object.keys(types).map((it) => `every.near/type/${it}`);
-}
-
-State.init({
- selectedType: availableTypes.length === 1 ? availableTypes[0] : "",
- expanded: false,
-});
-
-function extractMentions(text) {
- const mentionRegex =
- /@((?:(?:[a-z\d]+[-_])*[a-z\d]+\.)*(?:[a-z\d]+[-_])*[a-z\d]+)/gi;
- mentionRegex.lastIndex = 0;
- const accountIds = new Set();
- for (const match of text.matchAll(mentionRegex)) {
- if (
- !/[\w`]/.test(match.input.charAt(match.index - 1)) &&
- !/[/\w`]/.test(match.input.charAt(match.index + match[0].length)) &&
- match[1].length >= 2 &&
- match[1].length <= 64
- ) {
- accountIds.add(match[1].toLowerCase());
- }
- }
- return [...accountIds];
-}
-
-function extractTagNotifications(text, item) {
- return extractMentions(text || "")
- .filter((accountId) => accountId !== context.accountId)
- .map((accountId) => ({
- key: accountId,
- value: {
- type: "mention",
- item,
- },
- }));
-}
-
-const composeData = () => {
- // generate a random id
- const thingId = state.thingId || Math.random();
- const data = {
- thing: {
- ...state.extra,
- [thingId]: JSON.stringify({
- data: state.thing,
- type: state.selectedType,
- }),
- },
- index: {
- thing: JSON.stringify({
- key: thingId,
- value: {
- type: state.selectedType,
- },
- }),
- },
- };
-
- // TODO: What other types can we extract mentions from?
- // How can this be better associated with the type?
- if (state.selectedType === "md") {
- const notifications = extractTagNotifications(state.thing.text, {
- type: "social",
- path: `${context.accountId}/thing/${thingId}`,
- });
-
- if (notifications.length) {
- data.index.notify = JSON.stringify(
- notifications.length > 1 ? notifications : notifications[0]
- );
- }
- }
-
- if (postThing) {
- data = postThing(data);
- }
- return data;
-};
-
-const Container = styled.div`
- display: flex;
- flex-direction: column;
- gap: 4px;
- margin: 20px;
-`;
-
-const Row = styled.div`
- display: flex;
- align-items: center;
- margin-bottom: 10px;
- width: 100%;
-`;
-
-const SwitchButton = styled.button`
- padding: 5px 10px;
- background-color: ${({ active }) => (active ? "#5fba7d" : "#ccc")};
- color: white;
- border: none;
- border-radius: 4px;
- cursor: pointer;
-`;
-
-const ButtonContainer = styled.div`
- display: flex;
- align-items: center;
- width: 100px;
-`;
-
-const TextContainer = styled.div`
- margin-left: 4px;
-`;
-
-const FormContainer = styled.div`
- margin: 20px;
-`;
-
-const Select = styled.select`
- height: 30px;
- width: 300px;
-`;
-
-const Button = styled.button`
- height: 30px;
-`;
-
-const Text = styled.p`
- display: inline-block;
- margin-right: 10px;
-`;
-
-const Input = styled.input`
- width: 300px;
- height: 30px;
-`;
-
-const handleTypeChange = (e) => {
- State.update({ selectedType: e.target.value });
-};
-
-const handleThingData = (value, extra) => {
- State.update({ thing: value, extra });
-};
-
-function RenderTypeCreate() {
- if (state.selectedType !== "") {
- const type = JSON.parse(Social.get(state.selectedType, "final") || "null");
- const widgetSrc = type?.widgets?.create;
- // it would be great to modify the onChange function
- return (
-
- );
- }
-}
-
-return (
- <>
-
- {props.type === undefined && availableTypes.length !== 1 ? (
- <>
-
- create a thing of type:
-
-
-
- Select a type
- {availableTypes.map((it) => (
-
- {it}
-
- ))}
-
-
- >
- ) : null}
-
-
-
- State.update({ expanded: !state.expanded })}>
- optional {state.expanded ? "-" : "+"}
-
-
- {state.expanded ? (
- <>
- State.update({ thingId: e.target.value })}
- placeholder="file name"
- />
- >
- ) : null}
-
-
- create
-
-
-
- >
-);
diff --git a/apps/every.near/widget/every/thing/view.jsx b/apps/every.near/widget/every/thing/view.jsx
deleted file mode 100644
index 7004a07..0000000
--- a/apps/every.near/widget/every/thing/view.jsx
+++ /dev/null
@@ -1,340 +0,0 @@
-const path = props.path; // every piece of data on social contract has a path
-const blockHeight = props.blockHeight || "final"; // and a blockHeight (~version)
-const options = props.options;
-
-// split the path
-const parts = path.split("/");
-const creatorId = parts[0];
-
-let type;
-if (parts.length === 1) {
- if (parts[0].charAt(0) === "#") {
- // hashtag
- type = "hashtag";
- } else {
- // every root of a path is an account
- type = "account";
- }
-} else {
- // otherwise the "standard" is the type (widget, post, type, thing...)
- // for thing, we'll extract the actual "Type" later
- type = parts[1];
-}
-
-State.init({
- view: "THING",
-});
-
-const Container = styled.div`
- border: 1px solid #ccc;
- height: fit-content;
-`;
-
-const Header = styled.div`
- display: flex;
- align-items: center;
- justify-content: flex-end;
- border-bottom: 1px solid #ccc;
-`;
-
-const IconBox = styled.div`
- font-family: "Times New Roman";
- font-size: 2em;
- line-height: 1.25;
- font-weight: 400;
- cursor: pointer;
-`;
-
-const Content = styled.div`
- padding: 1px;
- min-height: 300px;
-`;
-
-const Button = styled.button`
- text-transform: lowercase !important;
-`;
-
-const ButtonRow = styled.div`
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- justify-content: flex-end;
- gap: 4px;
-`;
-
-// PLUGINS
-// This should move to settings
-const plugins = {
- EDIT: {
- state: {
- active: {
- icon: "bi bi-arrow-counterclockwise",
- label: "Cancel Edit",
- },
- inactive: {
- icon: "bi bi-pencil",
- label: "Edit",
- },
- },
- src: "efiz.near/widget/every.thing.edit",
- creatorRequired: true,
- },
- RAW: {
- state: {
- active: {
- icon: "bi bi-arrow-up-left-circle",
- label: "Show Thing",
- },
- inactive: {
- icon: "bi bi-filetype-raw",
- label: "Raw",
- },
- },
- src: "efiz.near/widget/every.thing.raw",
- },
- HISTORY: {
- state: {
- active: {
- icon: "bi bi-clock",
- label: "Hide History",
- },
- inactive: {
- icon: "bi bi-clock-history",
- label: "Show History",
- },
- },
- src: "efiz.near/widget/Every.Thing.History",
- },
- DUPLICATE: {
- state: {
- active: {
- icon: "bi bi-arrow-counterclockwise",
- label: "Cancel Duplicate",
- },
- inactive: {
- icon: "bi bi-back",
- label: "Duplicate",
- },
- },
- src: "efiz.near/widget/every.thing.edit",
- },
- BUILD: {
- state: {
- active: {
- icon: "bi bi-arrow-counterclockwise",
- label: "Cancel Build",
- },
- inactive: {
- icon: "bi bi-hammer",
- label: "Build",
- },
- },
- src: "efiz.near/widget/every.thing.build",
- creatorRequired: true,
- },
- EDGES: {
- state: {
- active: {
- icon: "bi bi-arrow-counterclockwise",
- label: "Show Thing",
- },
- inactive: {
- icon: "bi bi-link",
- label: "Edges",
- },
- },
- src: "efiz.near/widget/every.edge",
- },
- CAMERA: {
- state: {
- active: {
- icon: "bi bi-arrow-counterclockwise",
- label: "Show Thing",
- },
- inactive: {
- icon: "bi bi-camera",
- label: "Camera",
- },
- },
- src: "efiz.near/widget/test",
- typeRequired: "every.near/type/marketplace",
- },
-};
-
-// DROPDOWN //
-function Modifier() {
- const renderIcon = () => {
- return (
-
-
-
- );
- };
-
- function createButton(key, data) {
- const stateVal = state.view === key ? "active" : "inactive";
- if (data.creatorRequired && context.accountId !== creatorId) {
- return <>>;
- } else {
- return (
-
- State.update({ view: stateVal === "active" ? "THING" : key })
- }
- >
-
- {data.state[stateVal].label}
-
- );
- }
- }
-
- function nearPad() {
- return (
-
-
-
-
-
-
- Open NEARpad
-
- );
- }
-
- return (
- createButton(it, plugins[it])),
- }}
- />
- );
-}
-
-function Thing() {
- // Renders the path according to type
- switch (type) {
- case "thing": {
- // get the thing data
- const thing = JSON.parse(Social.get(path, blockHeight) || "null");
- type = thing.type || null;
- // get the type data
- const typeObj = JSON.parse(Social.get(type, blockHeight) || "null");
- if (typeObj === null) {
- console.log(
- `edge case: thing ${path} had an invalid type: ${thingType}`
- );
- }
- // determine the widget to render this thing (is there a default view?)
- const widgetSrc =
- options?.templateOverride ||
- thing.template?.src ||
- typeObj?.widgets?.view;
- // Template
- return (
-
- );
- }
- case "post": {
- return (
-
- );
- }
- case "widget": {
- return ;
- }
- case "account": {
- return ;
- }
- case "settings": {
- // Standardize path to {accountId}/settings/**
- parts.splice(2);
- parts.push("**");
- path = parts.join("/");
- return (
-
- );
- }
- case "type": {
- return (
-
- );
- }
- case "hashtag": {
- return (
-
- );
- }
- }
- // DEFAULT:
- return The type: {type} is not yet supported.
;
-}
-
-function Plugin() {
- const plugin = plugins[state.view];
- return (
-
-
- {
- State.update({ view: "THING" });
- }}
- >
- back
-
-
-
-
- );
-}
-
-return (
-
-
- {state.view === "THING" ? : }
-
-);
diff --git a/apps/every.near/widget/every/type/create.jsx b/apps/every.near/widget/every/type/create.jsx
deleted file mode 100644
index 1ce18e0..0000000
--- a/apps/every.near/widget/every/type/create.jsx
+++ /dev/null
@@ -1,320 +0,0 @@
-const typeSrc = props.typeSrc || "";
-const blockHeight = props.blockHeight || "final";
-let type = {
- name: "",
- properties: [],
- widgets: {},
-};
-
-State.init({
- newType: typeSrc,
- typeName: type.name || "",
- properties: type.properties || [],
- widgets: type.widgets || {},
- newPropertyName: "",
- newPropertyType: "string",
- newWidgetKey: "",
- newWidgetSrc: "",
- newTypeSrc: "every.near",
- typeSrc: "every.near",
- expanded: false,
-});
-
-let importedTypes = [];
-if (state.typeSrc !== "") {
- const types = Social.get(`${state.typeSrc}/type/**`, "final");
- if (!types) {
- return <>>;
- }
- importedTypes =
- Object.keys(types)?.map((it) => `${state.typeSrc}/type/${it}`) || [];
-}
-
-const availableTypes = JSON.parse(props.availableTypes) || [
- "string",
- "boolean",
- "number",
- "date",
- "time",
- "tags",
- ...importedTypes,
-];
-
-const Container = styled.div`
- margin: 20px 0;
-`;
-
-const FormContainer = styled.div`
- border: 1px solid #ccc;
- padding: 20px;
-`;
-
-const Row = styled.div`
- display: flex;
- gap: 10px;
-`;
-
-const Input = styled.input`
- flex: 1;
- max-width: 200px;
- margin-bottom: 10px;
- height: 30px;
-`;
-
-const Select = styled.select`
- height: 30px;
-`;
-
-const Button = styled.button`
- height: 30px;
-`;
-
-const Text = styled.p`
- display: inline-block;
- margin-right: 10px;
-`;
-
-const loadType = () => {
- const parts = state.newType.split("/");
- type = JSON.parse(Social.get(state.newType, blockHeight) || null);
- if (type) {
- type.name = parts[2];
- State.update({
- typeName: type.name,
- properties: type.properties,
- widgets: type.widgets,
- });
- }
-};
-
-if (prop.typeSrc !== "" && state.typeName === "") {
- loadType();
-}
-
-const handleAddProperty = () => {
- if (state.newPropertyName.trim() === "") return;
-
- const newProperty = {
- name: state.newPropertyName,
- type: state.newPropertyType,
- required: state.newPropertyRequired,
- isMulti: state.newPropertyIsMulti,
- };
-
- State.update({
- properties: [...state.properties, newProperty],
- newPropertyName: "",
- newPropertyType: "string",
- newPropertyIsMulti: false,
- });
-};
-
-const handleRemoveProperty = (index) => {
- const updatedProperties = [...state.properties];
- updatedProperties.splice(index, 1);
- State.update({ properties: updatedProperties });
-};
-
-const handlePropertyChange = (e, index) => {
- const updatedProperties = [...state.properties];
- updatedProperties[index].name = e.target.value;
- State.update({ properties: updatedProperties });
-};
-
-const handleTypeChange = (e, index) => {
- const updatedProperties = [...state.properties];
- updatedProperties[index].type = e.target.value;
- State.update({ properties: updatedProperties });
-};
-
-const handleMultiChange = (e, index) => {
- const updatedProperties = [...state.properties];
- updatedProperties[index].isMulti = e.target.value;
- State.update({ properties: updatedProperties });
-};
-
-const handleTypeNameChange = (e) => {
- State.update({ typeName: e.target.value.toLowerCase() });
-};
-
-const handleWidgetKeyChange = (e) => {
- State.update({ newWidgetKey: e.target.value.toLowerCase() });
-};
-
-const handleWidgetSrcChange = (e) => {
- State.update({ newWidgetSrc: e.target.value });
-};
-
-const handleAddWidget = () => {
- if (state.newWidgetKey.trim() === "" || state.newWidgetSrc.trim() === "")
- return;
-
- const newWidget = {
- [state.newWidgetKey]: state.newWidgetSrc,
- };
-
- State.update({
- widgets: { ...state.widgets, ...newWidget },
- newWidgetKey: "",
- newWidgetSrc: "",
- });
-};
-
-const handleRemoveWidget = (key) => {
- const updatedWidgets = { ...state.widgets };
- delete updatedWidgets[key];
- State.update({ widgets: updatedWidgets });
-};
-
-const composeData = () => {
- const data = {
- type: {
- [state.typeName]: JSON.stringify({
- properties: state.properties,
- widgets: state.widgets,
- }),
- },
- };
- return data;
-};
-
-function TypeSelect({ value, onChange }) {
- return (
-
- {availableTypes.map((it) => (
-
- {it}
-
- ))}
-
- );
-}
-
-function MultiSelect({ value, onChange }) {
- return (
-
- single
- multi
-
- );
-}
-
-return (
-
-
- Load Type:
- State.update({ newType: e.target.value })}
- placeholder={"accountId/type/Type"}
- />
- load
-
-
- Type Source:
- State.update({ newTypeSrc: e.target.value })}
- placeholder={"accountId"}
- />
- State.update({ typeSrc: state.newTypeSrc })}>
- apply
-
-
-
-
- Type Name:
-
-
- Properties:
- {state.properties?.map((property, index) => (
-
- handlePropertyChange(e, index)}
- />
- handleTypeChange(e, index)}
- />
- handleMultiChange(e, index)}
- />
- handleRemoveProperty(index)}>Remove
-
- ))}
-
- State.update({ newPropertyName: e.target.value })}
- />
- State.update({ newPropertyType: e.target.value })}
- />
- State.update({ newPropertyIsMulti: e.target.value })}
- />
-
- +
-
-
- Widgets:
- {Object.entries(state.widgets)?.map(([key, src]) => (
-
- {key}:
- {}} />
- handleRemoveWidget(key)}>Remove
-
- ))}
-
-
- {":"}
-
-
- +
-
-
-
-
- create
-
-
-
-
-);
diff --git a/apps/every.near/widget/layout.jsx b/apps/every.near/widget/layout.jsx
deleted file mode 100644
index fec1794..0000000
--- a/apps/every.near/widget/layout.jsx
+++ /dev/null
@@ -1,124 +0,0 @@
-const Container = styled.div`
- display: flex;
- flex-direction: row;
- width: 100%;
- height: 100%;
- min-height: 100vh;
- // margin-top: calc(-1 * var(--body-top-padding));
-`;
-
-const ContentContainer = styled.div`
- flex: 1;
- display: flex;
- flex-direction: column;
- align-items: center;
- width: 100%;
-`;
-
-const Sidebar = styled.div`
- width: 64px;
-
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- align-items: center;
- padding: 20px 0;
-
- border: 2px outset #333;
- background-color: #f5f5f5;
-`;
-
-const ButtonGroup = styled.div`
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 8px;
-`;
-
-const Button = styled.button`
- width: 48px;
- min-height: 48px;
-
- border: 2px outset #333;
- background-color: #f5f5f5;
- cursor: pointer;
- color: #333;
-
- text-decoration: none;
-
- &:active {
- border-style: inset;
- background-color: #d5d5d5;
- color: #000;
- }
-
- &:hover {
- background-color: #e5e5e5;
- color: #111;
- }
-`;
-
-const { NavLink } = props || {
- NavLink: ({ to, children }) => (
-
- {children}
-
- ),
-};
-
-const AppHeader = ({ page, routes }) => (
-
-
- {routes &&
- (Object.keys(routes) || []).map((k) => {
- const route = routes[k];
- if (route.hide) {
- return null;
- }
- return (
-
-
-
-
-
- );
- })}
-
- {routes && (
- <>
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )}
-
-);
-
-const Footer = (props) => {
- return <>>;
-};
-
-// Define the new component that follows the AppLayout pattern
-function AppLayout({ routes, page, children }) {
- return (
- <>
-
-
- {children}
-
-
- >
- );
-}
-
-return { AppLayout };
diff --git a/apps/every.near/widget/post/feed.jsx b/apps/every.near/widget/post/feed.jsx
deleted file mode 100644
index 896beaf..0000000
--- a/apps/every.near/widget/post/feed.jsx
+++ /dev/null
@@ -1,52 +0,0 @@
-const { Feed } = VM.require("devs.near/widget/Module.Feed");
-
-Feed = Feed || (() => <>>);
-
-return (
-
-
- Every Post
-
- (
- }
- src="mob.near/widget/MainPage.N.Post"
- props={{ accountId: p.accountId, blockHeight: p.blockHeight }}
- />
- )}
- />
-
-);
diff --git a/apps/every.near/widget/things.jsx b/apps/every.near/widget/things.jsx
deleted file mode 100644
index 6252d33..0000000
--- a/apps/every.near/widget/things.jsx
+++ /dev/null
@@ -1,58 +0,0 @@
-const defaultFilters = props.defaultFilters ?? {};
-const defaultType = props.defaultType || "thing";
-
-const Button = styled.button``;
-
-State.init({
- typeName: defaultType,
-});
-
-const renderHeader = () => (
-
-
-
every {state.typeName}
- State.update({ typeName: "thing" })}>thing
- State.update({ typeName: "type" })}>type
- State.update({ typeName: "widget" })}>
- widget
-
-
-
- Create a new {state.typeName}
-
- >
- ),
- }}
- />
-
-);
-
-const renderThings = () => {
- return (
-
- );
-};
-
-return (
-
- {renderHeader()}
- {renderThings()}
-
-);
diff --git a/apps/video/bos.config.json b/apps/video/bos.config.json
new file mode 100644
index 0000000..a51cc05
--- /dev/null
+++ b/apps/video/bos.config.json
@@ -0,0 +1,10 @@
+{
+ "account": "video.every.near",
+ "aliases": ["../../aliases.mainnet.json"],
+ "overrides": {
+ "testnet": {
+ "account": "video.allthethings.testnet",
+ "aliases": ["../../aliases.testnet.json"]
+ }
+ }
+}
diff --git a/apps/video/data.json b/apps/video/data.json
new file mode 100644
index 0000000..3e5bd62
--- /dev/null
+++ b/apps/video/data.json
@@ -0,0 +1,3 @@
+{
+ "video.every.near": {}
+}
diff --git a/apps/video/widget/Broadcast/Broadcast.jsx b/apps/video/widget/Broadcast/Broadcast.jsx
new file mode 100644
index 0000000..b385bb0
--- /dev/null
+++ b/apps/video/widget/Broadcast/Broadcast.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Broadcast/Debug.jsx b/apps/video/widget/Broadcast/Debug.jsx
new file mode 100644
index 0000000..cb5e2ad
--- /dev/null
+++ b/apps/video/widget/Broadcast/Debug.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Broadcast/GenerateStream.jsx b/apps/video/widget/Broadcast/GenerateStream.jsx
new file mode 100644
index 0000000..1431cb5
--- /dev/null
+++ b/apps/video/widget/Broadcast/GenerateStream.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Broadcast/WatchStream.jsx b/apps/video/widget/Broadcast/WatchStream.jsx
new file mode 100644
index 0000000..18d59f2
--- /dev/null
+++ b/apps/video/widget/Broadcast/WatchStream.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Components/browse-tabs.jsx b/apps/video/widget/Components/browse-tabs.jsx
new file mode 100644
index 0000000..016b5d9
--- /dev/null
+++ b/apps/video/widget/Components/browse-tabs.jsx
@@ -0,0 +1,18 @@
+const { Button } = VM.require("video.every.near/widget/Components.button") || {
+ Button: () => <>>,
+};
+
+const BrowseTabs = ({ tabs }) => {
+ return (
+
+ {tabs.length &&
+ tabs.map((tab) => (
+
+ {tab.label}
+
+ ))}
+
+ );
+};
+
+return { BrowseTabs };
diff --git a/apps/video/widget/Components/button.jsx b/apps/video/widget/Components/button.jsx
new file mode 100644
index 0000000..97792ee
--- /dev/null
+++ b/apps/video/widget/Components/button.jsx
@@ -0,0 +1,61 @@
+const StyledButton = styled.button`
+ display: flex;
+ padding: 8px 20px;
+ justify-content: center;
+ align-items: center;
+ gap: 8px;
+ height: 40px;
+
+ border-radius: 12px;
+ border: 1px solid #dbdbdb;
+ background: #fff;
+
+ color: #171717;
+
+ /* Poppins/Text/S - 14px/Medium */
+ font-family: Poppins;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+
+ transition: all 300ms;
+ &:hover {
+ opacity: 0.8;
+ }
+
+ ${(props) =>
+ props.type === "icon" &&
+ `
+ padding: 4px 12px;
+ `}
+
+ ${(props) =>
+ props.variant === "primary" &&
+ `
+ color: white;
+ background: #171717;
+ `}
+
+ ${(props) =>
+ props.variant === "tab" &&
+ `
+ border: 1px solid #E2E2E2;
+ background: #F8F8F8;
+ `}
+`;
+
+const Button = ({ children, onClick, type, variant, ...passProps }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+return { Button };
diff --git a/apps/video/widget/Components/hero-banner.jsx b/apps/video/widget/Components/hero-banner.jsx
new file mode 100644
index 0000000..1da5998
--- /dev/null
+++ b/apps/video/widget/Components/hero-banner.jsx
@@ -0,0 +1,126 @@
+const { Button } = VM.require("video.every.near/widget/Components.button") || {
+ Button: () => <>>,
+};
+
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => {},
+};
+
+const Heading = styled.h2`
+ color: #171717;
+ font-family: Poppins;
+ font-size: 32px;
+ letter-spacing: -1.28px;
+ margin: 0;
+
+ span {
+ font-weight: 600;
+ }
+`;
+
+const SubHeading = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 8px;
+
+ color: #6f6f6f;
+ font-family: Poppins;
+ font-size: 12px;
+ line-height: 140%; /* 16.8px */
+ letter-spacing: -0.12px;
+ margin: 0;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const BannerContainer = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ @media screen and (max-width: 768px) {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 1.5rem;
+ }
+`;
+
+const CodeIcon = () => {
+ return (
+
+
+
+ );
+};
+
+const CreateIcon = () => {
+ return (
+
+
+
+ );
+};
+
+const HeroBanner = () => {
+ return (
+
+
+
+ every. video on NEAR
+
+
+ Powered by{" "}
+
+
+
+
+
+
+ component library
+
+
+
+ create
+
+
+
+ );
+};
+
+return { HeroBanner };
diff --git a/apps/video/widget/Components/like-button.jsx b/apps/video/widget/Components/like-button.jsx
new file mode 100644
index 0000000..00f203d
--- /dev/null
+++ b/apps/video/widget/Components/like-button.jsx
@@ -0,0 +1,111 @@
+const item = props.item;
+
+if (!item) {
+ return "";
+}
+
+const likes = Social.index("like", item);
+
+const dataLoading = likes === null;
+
+const likesByUsers = {};
+
+(likes || []).forEach((like) => {
+ if (like.value.type === "like") {
+ likesByUsers[like.accountId] = like;
+ } else if (like.value.type === "unlike") {
+ delete likesByUsers[like.accountId];
+ }
+});
+if (state.hasLike === true) {
+ likesByUsers[context.accountId] = {
+ accountId: context.accountId,
+ };
+} else if (state.hasLike === false) {
+ delete likesByUsers[context.accountId];
+}
+
+const accountsWithLikes = Object.keys(likesByUsers);
+const hasLike = context.accountId && !!likesByUsers[context.accountId];
+
+const LikeButton = styled.button`
+ border: 0 !important;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ width: 2.5em;
+ height: 2.5em;
+`;
+
+const likeClick = () => {
+ if (state.loading) {
+ return;
+ }
+ State.update({
+ loading: true,
+ });
+ const data = {
+ index: {
+ like: JSON.stringify({
+ key: item,
+ value: {
+ type: hasLike ? "unlike" : "like",
+ },
+ }),
+ },
+ };
+
+ if (!hasLike && props.notifyAccountId) {
+ data.index.notify = JSON.stringify({
+ key: props.notifyAccountId,
+ value: {
+ type: "like",
+ item,
+ },
+ });
+ }
+ Social.set(data, {
+ onCommit: () => State.update({ loading: false, hasLike: !hasLike }),
+ onCancel: () => State.update({ loading: false }),
+ });
+};
+
+const title = hasLike ? "Unlike" : "Like";
+
+return (
+
+
+ {state.loading || dataLoading ? (
+
+ ) : (
+ <>
+
+ {accountsWithLikes.length > 0 ? accountsWithLikes.length : 0}
+
+
+
+
+ >
+ )}
+
+
+);
diff --git a/apps/video/widget/Components/suggested-video.jsx b/apps/video/widget/Components/suggested-video.jsx
new file mode 100644
index 0000000..fbcdab5
--- /dev/null
+++ b/apps/video/widget/Components/suggested-video.jsx
@@ -0,0 +1,155 @@
+const path = props.path;
+const blockHeight = props.blockHeight;
+
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => {},
+};
+
+const VideoCard = styled.div`
+ border: 1px solid #e2e2e2;
+ border-radius: 1rem;
+ padding: 0.5rem;
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ background-color: #fff;
+ flex-shrink: 0;
+
+ transition: all 300ms;
+ &:hover {
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+
+ transform: scale(1.01);
+ }
+`;
+
+const VideoTitle = styled.h3`
+ color: #0d0d0e;
+
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+ margin: 0;
+`;
+
+const VideoInfo = styled.div`
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.8em;
+ color: #888;
+`;
+
+const VideoThumbnail = styled.img`
+ object-fit: cover;
+ border-radius: 0.5rem;
+ aspect-ratio: 16 / 9;
+`;
+
+function handleExpandVideo() {
+ if (props.handleExpandVideo) {
+ props.handleExpandVideo(path, blockHeight);
+ }
+}
+
+const videoThing = Social.getr(path, blockHeight);
+
+if (!videoThing) return Loading...
;
+
+const userId = path.split("/")[0];
+const userProfile = Social.getr(`${userId}/profile`);
+
+const data = JSON.parse(videoThing[""] || "null");
+data = {
+ ...data,
+ poster:
+ data.poster === "https://ipfs.near.social/ipfs/undefined"
+ ? "https://placehold.co/450x300/000000/000000/png"
+ : data.poster,
+};
+
+const VideoDescription = styled.p`
+ color: #6f6f6f;
+ font-size: 12px;
+ line-height: 140%; /* 16.8px */
+ letter-spacing: -0.12px;
+ margin: 0;
+
+ display: flex;
+ align-items: center;
+ gap: 0.25rem;
+
+ svg {
+ height: 16px;
+ width: 16px;
+ }
+`;
+
+function secondsToHoursMinutes(seconds) {
+ const hours = Math.floor(seconds / 3600);
+ const minutes = Math.floor((seconds % 3600) / 60);
+ const remainingSeconds = Math.floor(seconds % 60);
+
+ if (!hours) {
+ return minutes + ":" + remainingSeconds;
+ }
+
+ return hours + ":" + minutes + ":" + remainingSeconds;
+}
+
+return (
+
+
+
+
+
+ {data?.videoSpec?.duration
+ ? secondsToHoursMinutes(data?.videoSpec?.duration)
+ : ""}
+
+
+
+
+
+ {videoThing.metadata.name}
+
+
+ {userProfile.name}{" "}
+
+
+
+
+
+
+
+
+);
diff --git a/apps/video/widget/Components/upload-banner.jsx b/apps/video/widget/Components/upload-banner.jsx
new file mode 100644
index 0000000..2d50708
--- /dev/null
+++ b/apps/video/widget/Components/upload-banner.jsx
@@ -0,0 +1,122 @@
+const { Button } = VM.require("video.every.near/widget/Components.button") || {
+ Button: () => <>>,
+};
+const Heading = styled.h2`
+ color: #171717;
+ font-family: Poppins;
+ font-size: 32px;
+ letter-spacing: -1.28px;
+ margin: 0;
+
+ span {
+ font-weight: 600;
+ }
+`;
+
+const SubHeading = styled.h3`
+ color: #6f6f6f;
+ font-family: Poppins;
+ font-size: 12px;
+ line-height: 140%; /* 16.8px */
+ letter-spacing: -0.12px;
+ margin: 0;
+`;
+
+const BannerContainer = styled.div`
+ display: flex;
+ align-items: center;
+ background-color: black;
+
+ border-radius: 8px;
+ border: 1px solid #c7c7c7;
+
+ img {
+ height: 100%;
+ object-fit: cover;
+ aspect-ratio: 138 / 59;
+ border-radius: 8px 0 0 8px;
+ vertical-align: top;
+ }
+
+ .img-container {
+ border-radius: 8px 0 0 8px;
+ height: inherit;
+ max-width: 35%;
+ }
+
+ .content {
+ padding: 24px;
+ display: flex;
+ flex-direction: column;
+ background-color: white;
+ align-self: stretch;
+ justify-content: center;
+ width: 100%;
+ border-radius: 0 8px 8px 0;
+ gap: 24px;
+
+ h4 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+ }
+
+ p {
+ color: var(--Gray-Light-11, #6f6f6f);
+ font-family: Poppins;
+ font-size: 14px;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+ margin: 0;
+ }
+ }
+
+ @media screen and (max-width: 768px) {
+ flex-direction: column;
+ align-items: flex-start;
+
+ .img-container {
+ max-width: 100%;
+ border-radius: 8px 8px 0 0;
+ height: 128px;
+ margin: 0 auto;
+ }
+
+ .content {
+ border-radius: 0 0 8px 8px;
+ }
+ }
+`;
+
+const imageUrl =
+ "https://ipfs.near.social/ipfs/bafkreihwn3bhw73lv76kqlngczcsgqyjcmwzirpb6funfigqmotql7deaq";
+
+const UploadBanner = () => {
+ return (
+
+
+
+
+
+
+
Welcome to every.video on Near!
+
+ Craft and customize your own video app effortlessly with Near.
+ Unleash your creativity and showcase your unique style in every
+ frame.
+
+
+
+ upload
+ create
+
+
+
+ );
+};
+
+return { UploadBanner };
diff --git a/apps/video/widget/Library/Broadcast.jsx b/apps/video/widget/Library/Broadcast.jsx
new file mode 100644
index 0000000..e85ce9b
--- /dev/null
+++ b/apps/video/widget/Library/Broadcast.jsx
@@ -0,0 +1,118 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ Broadcast
+
+
+
+
+
Description
+
+ This component initiates a live video stream using a provided stream
+ key.
+
+
+
+ Usage
+
+
+
+);
diff --git a/apps/video/widget/Library/BroadcastApiKey.jsx b/apps/video/widget/Library/BroadcastApiKey.jsx
new file mode 100644
index 0000000..7a63142
--- /dev/null
+++ b/apps/video/widget/Library/BroadcastApiKey.jsx
@@ -0,0 +1,198 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+const MonospaceText = styled.span`
+ font-family: monospace;
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ BroadcastApiKey
+
+
+
+
+
Description
+
This component allow you to set the Livepeer Studio api key.
+
+
+ Usage
+
+
+
+
+
+
+
+ Property
+
+
+ Type
+
+
+ Default value
+
+
+ This component enables the configuration of the Livepeer Studio
+ API key.
+
+
+
+
+
+
+ automated
+
+ boolean
+ false
+
+ When automated, this component operates without a user interface
+ and automatically configures the
+ apiKey in the
+ Broadcast.Player
+ component using the specified{" "}
+ apiKey property.
+
+
+
+
+ apiKey
+
+ string
+ ""
+
+ Value of the apiKey as configured
+ by the component.
+
+
+
+
+
+
+);
diff --git a/apps/video/widget/Library/BroadcastSandbox.jsx b/apps/video/widget/Library/BroadcastSandbox.jsx
new file mode 100644
index 0000000..17a8270
--- /dev/null
+++ b/apps/video/widget/Library/BroadcastSandbox.jsx
@@ -0,0 +1,11 @@
+return (
+ <>
+ 1. add the api key:
+
+ 2. generate a stream key:
+
+ 3. stream:
+
+
+ >
+);
diff --git a/apps/video/widget/Library/Creator.jsx b/apps/video/widget/Library/Creator.jsx
new file mode 100644
index 0000000..ee51af8
--- /dev/null
+++ b/apps/video/widget/Library/Creator.jsx
@@ -0,0 +1,366 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+/ Use Files if you need the user to upload a video asset from file system
+ {
+ if (!files || !files.length) return;
+ const [body] = files;
+ State.update({ currentUpload: body });
+ }}
+ >
+ Stage Video
+
+
+ { console.log(status) },
+ handleProgress: (progress) => { console.log(progress) },
+ handleError: (error) => { console.log(assets) },
+ handleAssets: (assets) => { console.log(assets) },
+ Button: ({ onClick, disabled }) => (
+
+ Upload to Livepeer
+
+ ),
+ }}
+/>
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+
+ overflow-x: scroll;
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+return (
+
+
+
+ Powered by{" "}
+
+
+
+ Creator
+
+
+
+
Preview
+
+ {
+ if (!files || !files.length) return;
+ const [body] = files;
+ State.update({ currentUpload: body });
+ }}
+ >
+ Stage Video
+
+ {
+ console.log(status);
+ },
+ handleProgress: (progress) => {
+ console.log(progress);
+ },
+ handleError: (error) => {
+ console.log(assets);
+ },
+ handleAssets: (assets) => {
+ console.log(assets);
+ },
+ Button: ({ onClick, disabled }) => (
+
+ Upload to Livepeer
+
+ ),
+ }}
+ />
+
+
+
+ Usage
+
+
+
+
+
Properties
+
+
+
+
+ Prop Name
+ Type/Values
+ Default Value
+ Description
+
+
+
+
+
+ video
+
+ File
+
+ N/A
+
+ The video file to upload.
+
+
+
+ metadata
+
+ Object
+
+ N/A
+
+ The metadata for the video.
+
+
+
+ handleStatus
+
+ Function
+
+ N/A
+
+ A callback function for status updates.
+
+
+
+ handleProgress
+
+ Function
+
+ N/A
+
+ A callback function for progress updates.
+
+
+
+ handleError
+
+ Function
+
+ N/A
+
+ A callback function for error updates.
+
+
+
+ handleAssets
+
+ Function
+
+ N/A
+
+ A callback function for asset updates.
+
+
+
+ Button
+
+ Function/ReactNode
+
+ N/A
+
+ A custom component to render the button for uploading.
+
+
+
+ debug
+
+ Boolean
+
+ false
+
+ Whether to log debug messages or not.
+
+
+
+ ...props
+
+ any
+
+ N/A
+
+
+ Any other props will be passed to the underlying{" "}
+
+ Livepeer Asset Creator
+
+ .
+
+
+
+
+
+
+
+);
diff --git a/apps/video/widget/Library/DirectUploadAsset.jsx b/apps/video/widget/Library/DirectUploadAsset.jsx
new file mode 100644
index 0000000..ac2075c
--- /dev/null
+++ b/apps/video/widget/Library/DirectUploadAsset.jsx
@@ -0,0 +1,126 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+const MonospaceText = styled.span`
+ font-family: monospace;
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ DirectUploadAsset
+
+
+
+
+
Description
+
+ This component facilitates asset uploads to Livepeer Studio. Begin by
+ generating the upload URL with the{" "}
+ GetUploadUrl component. Once the upload
+ is complete, use the GetSrc component to
+ generate the src object required for the
+ player to display the video.
+
+
+
+ Usage
+
+
+
+);
diff --git a/apps/video/widget/Library/FileUploader.jsx b/apps/video/widget/Library/FileUploader.jsx
new file mode 100644
index 0000000..c593163
--- /dev/null
+++ b/apps/video/widget/Library/FileUploader.jsx
@@ -0,0 +1,130 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+const MonospaceText = styled.span`
+ font-family: monospace;
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ File Uploader
+
+
+
+
+
Description
+
+ This component is responsible for uploading and displaying an asset
+ using the
+
+ Livepeer web-server
+
+ .
+
+
+
+ Usage
+
+
+
+);
diff --git a/apps/video/widget/Library/GenerateStream.jsx b/apps/video/widget/Library/GenerateStream.jsx
new file mode 100644
index 0000000..b732fa8
--- /dev/null
+++ b/apps/video/widget/Library/GenerateStream.jsx
@@ -0,0 +1,130 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+}}
+/>
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+const MonospaceText = styled.span`
+ font-family: monospace;
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ GenerateStream
+
+
+
+
+
Description
+
+ This component generates a stream key based on a specified name, which
+ is essential for the Broadcast.Player {" "}
+ component to initiate a live stream.
+
+
+
+ Usage
+
+
+
+);
diff --git a/apps/video/widget/Library/GetAssets.jsx b/apps/video/widget/Library/GetAssets.jsx
new file mode 100644
index 0000000..d89c3ef
--- /dev/null
+++ b/apps/video/widget/Library/GetAssets.jsx
@@ -0,0 +1,129 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+const MonospaceText = styled.span`
+ font-family: monospace;
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ Get Assets
+
+
+
+
+
Description
+
+ This component will fetch the list of assets in your Livepeer account.
+ It requires a the{" "}
+
+ Livepeer web-server
+
+ up and running.
+
+
+
+ Usage
+
+
+
+);
diff --git a/apps/video/widget/Library/GetSrc.jsx b/apps/video/widget/Library/GetSrc.jsx
new file mode 100644
index 0000000..9a21600
--- /dev/null
+++ b/apps/video/widget/Library/GetSrc.jsx
@@ -0,0 +1,174 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+const MonospaceText = styled.span`
+ font-family: monospace;
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ GetSrc
+
+
+
+
+
Description
+
+ This component is responsible for generating the
+ src object required by the
+ Player
+ component to facilitate video display.
+
+
+
+ Usage
+
+
+
+
+
+
+
+ Error name
+
+
+ Reason
+
+
+
+
+
+
+ not found
+
+
+ the playbackId to generate the src object has not been found in
+ your Livepeer Dashboard
+
+
+
+
+ asset is not ready for playback
+
+
+ Livepeer Studio has not finished processing the asset or the asset
+ has not yet been uploaded.
+
+
+
+
+
+
+);
diff --git a/apps/video/widget/Library/GetUploadUrl.jsx b/apps/video/widget/Library/GetUploadUrl.jsx
new file mode 100644
index 0000000..56083bb
--- /dev/null
+++ b/apps/video/widget/Library/GetUploadUrl.jsx
@@ -0,0 +1,126 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+const MonospaceText = styled.span`
+ font-family: monospace;
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ GetUploadUrl
+
+
+
+
+ Description
+ This component accepts an asset name and provides the upload URLs required
+ for asset uploads, as well as generating a playback ID essential for the
+ Player component to display the video.
+ Utilize the DirectUploadAsset
+ component for standard uploads via a single URL. For more robust uploads,
+ especially in conditions of slow connectivity, use the
+ ResumableUploadAsset component with the
+ provided tus URL.
+
+
+ Usage
+
+
+
+);
diff --git a/apps/video/widget/Library/Overview.jsx b/apps/video/widget/Library/Overview.jsx
new file mode 100644
index 0000000..d302a60
--- /dev/null
+++ b/apps/video/widget/Library/Overview.jsx
@@ -0,0 +1,115 @@
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => {},
+};
+
+const { Button } = VM.require("video.every.near/widget/Components.button") || {
+ Button: () => <>>,
+};
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ text-wrap: balance;
+ }
+
+ h3 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+ }
+
+ p {
+ color: #777d7a;
+ font-family: Poppins;
+ font-size: 16px;
+ line-height: 150%; /* 24px */
+ letter-spacing: -0.16px;
+ }
+`;
+
+return (
+
+
+
+ Powered by{" "}
+
+
+
+ Empower your blockchain app development with our comprehensive widget
+ collection
+
+
+
+
About Livepeer
+
+ Livepeer is pioneering a scalable, decentralized video infrastructure
+ network that empowers developers and broadcasters to create powerful
+ video applications.
+
+
+ This a collection of widgets that can be used to build Livepeer apps on
+ the Blockchain Operating System.
+
+
+
+
+ creator
+
+
+ player
+
+
+
+);
diff --git a/apps/video/widget/Library/Player.jsx b/apps/video/widget/Library/Player.jsx
new file mode 100644
index 0000000..fb26adf
--- /dev/null
+++ b/apps/video/widget/Library/Player.jsx
@@ -0,0 +1,326 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+}}
+/>
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+return (
+
+
+
+ Powered by{" "}
+
+
+
+ Player
+
+
+
+
+
+
Description
+
+ This component facilitates video display. Users have the option to
+ generate a new asset via the component's API for video uploads or
+ directly supply the necessary details to display an existing video.
+
+
+ Usage
+
+
+
+
Properties
+
+
+
+
+
+ Prop Name
+
+
+ Type/Values
+
+
+ Default Value
+
+
+ Description
+
+
+
+
+
+
+ title
+
+ string
+
+ ""
+
+
+ The title for the content. This is highly recommended, since it
+ is used for accessibility labels in the Player. If you do not
+ want to show the title visually, see{" "}
+
+ showTitle
+
+ .
+
+
+
+
+ playbackId
+
+ number/string
+
+ ""
+
+
+ The{" "}
+
+ playbackId
+ {" "}
+ of the video. Can be a short playbackId for an Asset or Stream,
+ a media source URL, or an IPFS CID.
+
+
+
+
+ PosterImage
+
+ Function/ReactNode
+
+ N/A
+
+
+ A custom component to render the poster image while video is not
+ playing.
+
+
+
+
+ showPipButton
+
+ boolean
+
+ true
+
+ Whether to show the picture-in-picture button.
+
+
+
+ objectFit
+
+ string
+
+ "cover"
+
+ The object fit for the video.
+
+
+
+ priority
+
+ boolean
+
+ true
+
+ Whether to prioritize the video.
+
+
+
+ ...props
+
+ any
+
+ N/A
+
+
+ Any other props will be passed to the underlying{" "}
+
+ Livepeer Video Player
+
+ .
+
+
+
+
+
+
+
+);
diff --git a/apps/video/widget/Library/PlayerApiKey.jsx b/apps/video/widget/Library/PlayerApiKey.jsx
new file mode 100644
index 0000000..3ff7abc
--- /dev/null
+++ b/apps/video/widget/Library/PlayerApiKey.jsx
@@ -0,0 +1,189 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ PlayerApiKey
+
+
+
+
+
Description
+
+ This component enables the configuration of the Livepeer Studio API key.
+
+
+
+ Usage
+
+
+
+
+
+
+
+ Property
+
+
+ Type
+
+
+ Default value
+
+
+ Description
+
+
+
+
+
+
+ automated
+
+ boolean
+ false
+
+ When the component is automated it doesn't display UI and will set
+ the apiKey in the Player cast component player based on the
+ property "apiKey"
+
+
+
+
+ apiKey
+
+ string
+ ""
+ value of the apiKey set by the component.
+
+
+
+
+
+);
diff --git a/apps/video/widget/Library/PlayerSandbox.jsx b/apps/video/widget/Library/PlayerSandbox.jsx
new file mode 100644
index 0000000..60cad11
--- /dev/null
+++ b/apps/video/widget/Library/PlayerSandbox.jsx
@@ -0,0 +1,17 @@
+return (
+ <>
+ 1. set up api key:
+
+ 2. create an asset object:
+
+ 3. upload the asset directly:
+
+ 3a. or with resumable upload (more reliable):
+
+ 4. get the `src` object
+
+ 5. Display the asset
+
+
+ >
+);
diff --git a/apps/video/widget/Library/ResumableUploadAsset.jsx b/apps/video/widget/Library/ResumableUploadAsset.jsx
new file mode 100644
index 0000000..0903ba3
--- /dev/null
+++ b/apps/video/widget/Library/ResumableUploadAsset.jsx
@@ -0,0 +1,128 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+const MonospaceText = styled.span`
+ font-family: monospace;
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ ResumableUploadAsset
+
+
+
+
+
Description
+
+ This component facilitates the uploading of large assets to Livepeer
+ Studio via the tus library, enhancing reliability, especially over slow
+ or unstable connections. To initiate an upload, generate an upload URL
+ using the GetUploadUrl component. Upon
+ completion of the upload, utilize the
+ GetSrc component to generate the
+ src
+ object required for video playback in the player component.
+
+
+
+ Usage
+
+
+
+);
diff --git a/apps/video/widget/Library/WatchStream.jsx b/apps/video/widget/Library/WatchStream.jsx
new file mode 100644
index 0000000..7a3a5fb
--- /dev/null
+++ b/apps/video/widget/Library/WatchStream.jsx
@@ -0,0 +1,123 @@
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ h1 {
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 130%; /* 31.2px */
+ letter-spacing: -0.48px;
+ margin: 0;
+ }
+`;
+
+const Heading = styled.h3`
+ color: #292c2a;
+ font-family: Poppins;
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 150%; /* 27px */
+ letter-spacing: -0.18px;
+ margin-bottom: 8px;
+`;
+
+const PreviewContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+`;
+
+const WidgetCode = `
+\`\`\`js
+
+\`\`\`
+`;
+
+const UsageContent = styled.div`
+ pre {
+ div {
+ padding: 1.5rem !important;
+ border-radius: 1.5rem;
+ }
+ }
+`;
+
+const PoweredBy = styled.h3`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ color: #a5a5a5 !important;
+
+ font-family: Poppins;
+ font-size: 12px !important;
+ line-height: 140% !important; /* 16.8px */
+ font-weight: 400 !important;
+ letter-spacing: -0.12px !important;
+ margin-bottom: 8px !important;
+
+ img {
+ height: 12px;
+ width: auto;
+ object-fit: cover;
+ }
+`;
+
+const PropertiesContent = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 1rem;
+ word-break: normal;
+ overflow-x: scroll;
+
+ table {
+ border-radius: 24px;
+ overflow: hidden;
+ }
+`;
+
+const MonospaceText = styled.span`
+ font-family: monospace;
+`;
+
+return (
+
+
+
+ Powered by
+
+
+
+ Watch stream
+
+
+
+
+
Description
+
+ This component allow the user to watch the desired stream by providing
+ the stream playbackId .
+
+
+
+ Usage
+
+
+
+);
diff --git a/apps/video/widget/Library/index.jsx b/apps/video/widget/Library/index.jsx
new file mode 100644
index 0000000..58b431f
--- /dev/null
+++ b/apps/video/widget/Library/index.jsx
@@ -0,0 +1,275 @@
+const { HeroBanner } = VM.require(
+ "video.every.near/widget/Components.hero-banner"
+) || {
+ HeroBanner: () => <>>,
+};
+
+const { Button } = VM.require("UI.near/widget/atoms.Button") || {
+ Button: () => <>>,
+};
+
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => {},
+};
+
+// TODO: React objects shouldn't be dereferenced
+// const { Draggable } = VM.require(
+// "video.every.near/widget/Library.Draggable"
+// ) || {
+// href: () => Draggable not present
,
+// };
+
+// TODO: why this is not working?
+
+//const { Debugger } = VM.require("video.every.near/widget/Player.Debug") || {
+// href: () => Debugger not present ,
+//};
+
+const { tab } = props;
+
+const tabs = {
+ library: [
+ { label: "overview", widget: "video.every.near/widget/Library.Overview" },
+ ],
+ // livepeer: [
+ // subaccounts video -> every -> near
+ // / widget namespace
+ // / name of the widget
+ // . designated file structure
+
+ // { label: "player", widget: "video.every.near/widget/Library.Player" },
+ // { label: "creator", widget: "video.every.near/widget/Library.Creator" },
+ // ],
+ player: [
+ { label: "Player", widget: "video.every.near/widget/Library.Player" },
+ {
+ label: "GetUploadUrl",
+ widget: "video.every.near/widget/Library.GetUploadUrl",
+ },
+ {
+ label: "DirectUpload",
+ widget: "video.every.near/widget/Library.DirectUploadAsset",
+ },
+ {
+ label: "ResumableUpload",
+ widget: "video.every.near/widget/Library.ResumableUploadAsset",
+ },
+ {
+ label: "GetSrc",
+ widget: "video.every.near/widget/Library.GetSrc",
+ },
+ {
+ label: "PlayerApiKey",
+ widget: "video.every.near/widget/Library.PlayerApiKey",
+ },
+ {
+ label: "Player Sandbox",
+ widget: "video.every.near/widget/Library.PlayerSandbox",
+ },
+ {
+ label: "Backend Integration",
+ widget: "video.every.near/widget/Library.GetAssets",
+ },
+ {
+ label: "Backend Uploader",
+ widget: "video.every.near/widget/Library.FileUploader",
+ },
+ ],
+ broadcast: [
+ {
+ label: "Broadcast",
+ widget: "video.every.near/widget/Library.Broadcast",
+ },
+ {
+ label: "GenerateStream",
+ widget: "video.every.near/widget/Library.GenerateStream",
+ },
+ {
+ label: "Broadcast ApiKey",
+ widget: "video.every.near/widget/Library.BroadcastApiKey",
+ },
+ {
+ label: "Watch Stream",
+ widget: "video.every.near/widget/Library.WatchStream",
+ },
+ {
+ label: "Broadcast Sandbox",
+ widget: "video.every.near/widget/Library.BroadcastSandbox",
+ },
+ ],
+};
+
+const LibraryWrapper = styled.div`
+ padding: 32px 40px;
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+ height: 100%;
+
+ @media (max-width: 768px) {
+ padding: 1.5rem;
+ }
+`;
+
+const GridContainer = styled.div`
+ display: grid;
+ grid-template-columns: repeat(12, minmax(0, 1fr));
+ gap: 1rem;
+ @media (max-width: 920px) {
+ display: flex;
+ flex-direction: column;
+ }
+`;
+
+const SideBar = styled.div`
+ grid-column: span 3 / span 3;
+ height: 100%;
+
+ display: flex;
+ padding: 24px 12px;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 14px;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+
+ .title {
+ width: 100%;
+ }
+
+ p {
+ height: 40px;
+ padding: 10px 12px;
+ text-transform: capitalize;
+ margin-bottom: 14px;
+ }
+
+ @media (max-width: 1010px) {
+ grid-column: span 2 / span 2;
+ }
+
+ @media screen and (max-width: 768px) {
+ border: 0px;
+ flex-direction: row;
+ overflow-x: auto;
+ min-height: auto;
+ flex-wrap: nowrap;
+ flex-shrink: 0;
+
+ .title {
+ width: auto;
+ }
+ }
+`;
+
+const Content = styled.div`
+ grid-column: span 9 / span 9;
+ border-radius: 24px;
+ border: 1px solid #c7c7c7;
+ padding: 4rem;
+ word-break: normal;
+ @media (max-width: 1010px) {
+ grid-column: span 10 / span 10;
+ }
+
+ @media screen and (max-width: 768px) {
+ padding: 1rem;
+ }
+`;
+
+// const RightBar = styled.div`
+// grid-column: span 3 / span 3;
+// height: 100%;
+// display: flex;
+// padding: 24px 12px;
+// flex-direction: column;
+// align-items: flex-start;
+// gap: 14px;
+// border-radius: 24px;
+// border: 1px solid #c7c7c7;
+// `;
+
+const labelToFind = props.tab;
+const activeTab =
+ Object.values(tabs)
+ .flatMap((array) => array)
+ .find((obj) => obj.label === labelToFind) ||
+ Object.values(tabs).flatMap((array) => array)[0];
+
+const StyledLink = styled.div`
+ a {
+ text-decoration: none;
+ width: 100%;
+
+ button {
+ width: 100%;
+ }
+ }
+`;
+
+const [activateDebug, setActivateDebug] = useState(false);
+
+return (
+
+
+
+
+ {Object.keys(tabs).map((tab) => {
+ return (
+
+ {tab === "player" && (
+ <>
+ {/*
+ Show debug component:
+ setActivateDebug(!activateDebug)}
+ />
+ */}
+ >
+ )}
+
{tab}
+
+ {tabs[tab].map((item) => {
+ return (
+
+
+
+ {item.label}
+
+
+
+ );
+ })}
+
+
+ );
+ })}
+
+
+
+
+ {/*
+
+ */}
+
+
+);
diff --git a/apps/video/widget/Library/index.old.jsx b/apps/video/widget/Library/index.old.jsx
new file mode 100644
index 0000000..50c1708
--- /dev/null
+++ b/apps/video/widget/Library/index.old.jsx
@@ -0,0 +1,196 @@
+const ROOT_ACCOUNT = "efiz.near";
+
+State.init({
+ widget: state.widget ?? props.widget ?? "Library.Overview",
+});
+
+const data = Social.keys(`${ROOT_ACCOUNT}/widget/*`, "final", {
+ return_type: "BlockHeight",
+});
+
+const RouterLink = props.RouterLink;
+
+if (!data) return "";
+
+function convertToNestedObject(obj) {
+ const result = {};
+ Object.keys(obj)
+ .filter((key) => key !== "index")
+ .forEach((key) => {
+ let parts = key.split(".");
+ let firstPart = parts.shift();
+ if (parts[1] === "demo") {
+ return;
+ }
+ if (parts.length) {
+ result[firstPart] = result[firstPart] || {};
+ result[firstPart][parts.join(".")] = obj[key];
+ } else {
+ result[firstPart] = obj[key];
+ }
+ });
+ return result;
+}
+
+const Wrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ font-family: sans-serif;
+
+ @media (max-width: 800px) {
+ flex-wrap: wrap;
+ }
+`;
+
+const Sidebar = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ background: #fff;
+ box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
+ border-radius: 8px;
+ min-width: 240px;
+ width: 240px;
+ padding: 40px 17px 30px;
+ z-index: 1;
+ bottom: 0;
+ margin-bottom: 40px;
+ height: fit-content;
+
+ @media (max-width: 800px) {
+ width: 100%;
+ }
+
+ h3 {
+ margin: 0;
+ font-size: 14px;
+ font-weight: 500;
+ color: #999;
+ padding: 6px 21px;
+ }
+
+ a {
+ display: block;
+ font-size: 14px;
+ font-weight: 600;
+ padding: 6px 21px;
+ border-radius: 4px;
+ color: #141414;
+ cursor: pointer;
+ transition: all 0.2s ease-in-out;
+ text-decoration: none;
+ text-transform: capitalize;
+ }
+
+ a.active {
+ background: #edf4fc !important;
+ color: #4498e0 !important;
+ }
+
+ a:hover {
+ color: #4498e0 !important;
+ }
+`;
+
+const Content = styled.div`
+ flex: 1;
+ margin-left: 20px;
+ min-height: 70vh;
+ margin-bottom: auto;
+
+ @media (max-width: 800px) {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+`;
+
+const widgets = {
+ index: 0,
+ "Livepeer.Creator": 0,
+ "Livepeer.Creator.demo": 0,
+ "Livepeer.Player": 0,
+ "Livepeer.Player.demo": 0,
+ "Library.Overview": 0,
+};
+const widgetsObj = convertToNestedObject(widgets);
+
+const tabContent = () => {
+ const hasDemo = widgets[`${state.widget}.demo`] !== undefined;
+ return (
+
+
+
+
+
+ );
+};
+
+const widgetsKeys = Object.keys(widgetsObj)
+ .sort((a, b) => {
+ if (a.toLowerCase() > b.toLowerCase()) return 1;
+ if (a.toLowerCase() < b.toLowerCase()) return -1;
+ return 0;
+ })
+ .sort((a, b) => {
+ if (typeof widgetsObj[a] === "object") return 1;
+ return -1;
+ });
+return (
+
+
+ {widgetsKeys.map((folder) => {
+ if (typeof widgetsObj[folder] !== "object") {
+ return (
+ {
+ State.update({
+ widget: folder,
+ });
+ }}
+ className={state.widget === folder ? "active" : ""}
+ >
+ {folder}
+
+ );
+ }
+ return (
+
+ );
+ })}
+
+ {tabContent()}
+
+);
diff --git a/apps/video/widget/Livepeer/Creator.jsx b/apps/video/widget/Livepeer/Creator.jsx
new file mode 100644
index 0000000..e1e40c1
--- /dev/null
+++ b/apps/video/widget/Livepeer/Creator.jsx
@@ -0,0 +1,165 @@
+/**
+ * Livepeer Creator
+ *
+ * Widget for uploading a video to Livepeer
+ * (https://docs.livepeer.org/reference/livepeer-js/asset/useCreateAsset)
+ *
+ * Props:
+ * @prop {File} video - the video file to upload
+ * @prop {Object} metadata - the metadata for the video
+ * @prop {Function} handleStatus - a callback for status updates
+ * @prop {Function} handleProgress - a callback for progress updates
+ * @prop {Function} handleError - a callback for error updates
+ * @prop {Function} handleAssets - a callback for asset updates
+ * @prop {Function} Button - a component to render the button
+ * @prop {Boolean} debug - whether to log debug messages
+ */
+
+function handleStatus(status) {
+ if (props.debug) {
+ console.log("status", status);
+ }
+ if (props.handleStatus) {
+ props.handleStatus(status);
+ }
+}
+
+function handleProgress(progress) {
+ if (props.debug) {
+ console.log("progress", progress);
+ }
+ if (props.handleProgress) {
+ props.handleProgress(progress);
+ }
+}
+
+function handleAssets(assets) {
+ if (props.debug) {
+ console.log("assets", assets);
+ }
+ if (props.handleAssets) {
+ // Here, do I want to do createThing?
+ props.handleAssets(assets);
+ }
+}
+
+function handleError(error) {
+ if (props.debug) {
+ console.log("error", error);
+ }
+ if (props.handleError) {
+ props.handleError(error);
+ }
+}
+
+const UploadButton = styled.button`
+ box-sizing: border-box;
+ margin: 0 4px;
+ min-width: fit-content;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ display: inline-flex;
+ text-align: center;
+ line-height: inherit;
+ text-decoration: none;
+ font-size: inherit;
+ padding: 8px 18px;
+ background-color: #4dc28a;
+ color: black;
+ border: 0;
+ border-radius: 4px;
+ align-items: center;
+ justify-content: center;
+ height: auto;
+ font-weight: 600;
+ transition: opacity 0.15s;
+ cursor: pointer;
+
+ svg {
+ width: 1em;
+ height: auto;
+ vertical-align: middle;
+ fill: black;
+ margin-right: 8px;
+ }
+`;
+
+function Button({ disabled, onClick }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ {" "}
+ Upload
+
+ );
+}
+
+return (
+
+);
diff --git a/apps/video/widget/Livepeer/Creator/demo.jsx b/apps/video/widget/Livepeer/Creator/demo.jsx
new file mode 100644
index 0000000..b4703d6
--- /dev/null
+++ b/apps/video/widget/Livepeer/Creator/demo.jsx
@@ -0,0 +1,114 @@
+const ROOT_ACCOUNT = props.ROOT_ACCOUNT ?? "efiz.near";
+
+const propsTable = `
+
+| Prop Name | Type/Values | Default Value | Description |
+|-----------------|-----------------|----------------|----------------------------------------------------|
+| ${"`video`"} | File | ${"`N/A`"} | The video file to upload. |
+| ${"`metadata`"} | Object | ${"`N/A`"} | The metadata for the video. |
+| ${"`handleStatus`"} | Function | ${"`N/A`"} | A callback function for status updates. |
+| ${"`handleProgress`"}| Function | ${"`N/A`"} | A callback function for progress updates. |
+| ${"`handleError`"} | Function | ${"`N/A`"} | A callback function for error updates. |
+| ${"`handleAssets`"} | Function | ${"`N/A`"} | A callback function for asset updates. |
+| ${"`Button`"} | Function/ReactNode | ${"`N/A`"} | A custom component to render the button for uploading. |
+| ${"`debug`"} | Boolean | ${"`false`"} | Whether to log debug messages or not. |
+| ${"`...props`"} | any | ${"`N/A`"}| Any other props will be passed to the underlying [Livepeer Asset Creator](https://docs.livepeer.org/reference/livepeer-js/asset/useCreateAsset). |
+`;
+
+const widgetCode = `
+\`\`\`jsx
+// Use Files if you need the user to upload a video asset from file system
+ {
+ if (!files || !files.length) return;
+ const [body] = files;
+ State.update({ currentUpload: body });
+ }}
+ >
+ Stage Video
+
+
+ { console.log(status) },
+ handleProgress: (progress) => { console.log(progress) },
+ handleError: (error) => { console.log(assets) },
+ handleAssets: (assets) => { console.log(assets) },
+ Button: ({ onClick, disabled }) => (
+
+ Upload to Livepeer
+
+ ),
+ }}
+/>
+\`\`\`
+`;
+
+return (
+
+);
diff --git a/apps/video/widget/Livepeer/Player.jsx b/apps/video/widget/Livepeer/Player.jsx
new file mode 100644
index 0000000..6fc3747
--- /dev/null
+++ b/apps/video/widget/Livepeer/Player.jsx
@@ -0,0 +1,26 @@
+/**
+ * Livepeer Player
+ *
+ * Widget for playing a video from Livepeer
+ * (https://docs.livepeer.org/reference/livepeer-js/player/usePlayer)
+ *
+ * Props:
+ * @prop {String} title - the title of the video
+ * @prop {String} playbackId - the playbackId of the video
+ * @prop {Image} PosterImage - The image object for the poster image.
+ * @prop {Boolean} showPipButton - whether to show the picture-in-picture button
+ * @prop {String} objectFit - the object fit for the video
+ * @prop {Boolean} priority - whether to prioritize the video
+ */
+
+return (
+ >}
+ showPipButton={props.showPipButton && true}
+ objectFit={props.objectFit || "cover"}
+ priority={props.priority && true}
+ {...props}
+ />
+);
diff --git a/apps/video/widget/Livepeer/Player/demo.jsx b/apps/video/widget/Livepeer/Player/demo.jsx
new file mode 100644
index 0000000..181c094
--- /dev/null
+++ b/apps/video/widget/Livepeer/Player/demo.jsx
@@ -0,0 +1,84 @@
+const ROOT_ACCOUNT = props.ROOT_ACCOUNT ?? "efiz.near";
+
+const propsTable = `
+| Prop Name | Type/Values | Default Value | Description |
+|------------|--------------|----------------|-------------|
+| ${"`title`"} | string | ${'`""`'} | The title for the content. This is highly recommended, since it is used for accessibility labels in the Player. If you do not want to show the title visually, see [showTitle](https://docs.livepeer.org/reference/livepeer-js/Player#showtitle). |
+| ${"`playbackId`"} | number/string | ${'`""`'} | The ${`[playbackId](https://docs.livepeer.org/reference/livepeer-js/Player#playbackid-or-src)`} of the video. Can be a short playbackId for an Asset or Stream, a media source URL, or an IPFS CID. |
+| ${"`PosterImage`"} | Function/ReactNode | ${"`N/A`"} | A custom component to render the poster image while video is not playing. |
+| ${"`showPipButton`"} | boolean | ${'`true`'} | Whether to show the picture-in-picture button. |
+| ${"`objectFit`"}| string | ${'`"cover"`'} | The object fit for the video. |
+| ${"`priority`"} | boolean | ${'`true`'}| Whether to prioritize the video. |
+| ${"`...props`"} | any | ${"`N/A`"} | Any other props will be passed to the underlying [Livepeer Video Player](https://docs.livepeer.org/reference/livepeer-js/Player). |
+`;
+
+const widgetCode = `
+\`\`\`jsx
+
+ }}
+/>
+\`\`\`
+`;
+
+return (
+
+
+
+
+ }}
+ />
+
+
+
+
+
+
+);
diff --git a/apps/video/widget/Player/Debug.jsx b/apps/video/widget/Player/Debug.jsx
new file mode 100644
index 0000000..49f287b
--- /dev/null
+++ b/apps/video/widget/Player/Debug.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Player/DirectUploadAsset.jsx b/apps/video/widget/Player/DirectUploadAsset.jsx
new file mode 100644
index 0000000..001eebd
--- /dev/null
+++ b/apps/video/widget/Player/DirectUploadAsset.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Player/FileUploader.jsx b/apps/video/widget/Player/FileUploader.jsx
new file mode 100644
index 0000000..b4280d3
--- /dev/null
+++ b/apps/video/widget/Player/FileUploader.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Player/GetAssets.jsx b/apps/video/widget/Player/GetAssets.jsx
new file mode 100644
index 0000000..ad62933
--- /dev/null
+++ b/apps/video/widget/Player/GetAssets.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Player/GetSrc.jsx b/apps/video/widget/Player/GetSrc.jsx
new file mode 100644
index 0000000..a826980
--- /dev/null
+++ b/apps/video/widget/Player/GetSrc.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Player/GetUploadUrl.jsx b/apps/video/widget/Player/GetUploadUrl.jsx
new file mode 100644
index 0000000..ff9219d
--- /dev/null
+++ b/apps/video/widget/Player/GetUploadUrl.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Player/Player.jsx b/apps/video/widget/Player/Player.jsx
new file mode 100644
index 0000000..f57f9da
--- /dev/null
+++ b/apps/video/widget/Player/Player.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Player/ResumableUploadAsset.jsx b/apps/video/widget/Player/ResumableUploadAsset.jsx
new file mode 100644
index 0000000..7a91742
--- /dev/null
+++ b/apps/video/widget/Player/ResumableUploadAsset.jsx
@@ -0,0 +1 @@
+return ;
diff --git a/apps/video/widget/Router.jsx b/apps/video/widget/Router.jsx
new file mode 100644
index 0000000..cf77cc8
--- /dev/null
+++ b/apps/video/widget/Router.jsx
@@ -0,0 +1,73 @@
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => "/",
+};
+
+const Content = styled.div`
+ width: 100%;
+ height: 100%;
+`;
+
+function findDefaultRoute(routesObject) {
+ const routeKey =
+ routesObject &&
+ Object.keys(routesObject).find((key) => {
+ const route = routesObject[key];
+ return route.default === true;
+ });
+
+ if (routeKey) {
+ return routesObject[routeKey];
+ } else {
+ return null;
+ }
+}
+
+function Router({ config, passedProps, ...passProps }) {
+ const { routes, PageNotFound, debug, param } = config;
+
+ if (!param) param = "page";
+
+ const defaultRoute =
+ findDefaultRoute(routes) ??
+ (routes && Object.keys(routes).length && routes[Object.keys(routes)[0]]);
+ const activeRoute =
+ (routes &&
+ routes.hasOwnProperty(passProps[param]) &&
+ routes[passProps[param]]) ||
+ defaultRoute;
+
+ if (!PageNotFound) PageNotFound = () => 404 Not Found
;
+
+ if (!activeRoute) {
+ // Handle 404 or default case for unknown routes
+ return ;
+ }
+
+ // An improvement may be to "lazy load", e.g. load all widgets at once and only "display" the active one
+ // potentionally add a "lazy: true" prop to the route object
+
+ // for each route, if lazy, load the widget and store it in a map
+ // set display for the active route
+
+ // we may want to convert this to a widget for that purpose, to manage state?
+ if (debug) {
+ return (
+
+
{JSON.stringify(activeRoute, null, 2)}
+
{JSON.stringify(props, null, 2)}
+
+ );
+ } else {
+ return (
+
+ }
+ />
+
+ );
+ }
+}
+
+return { Router };
diff --git a/apps/video/widget/app.jsx b/apps/video/widget/app.jsx
new file mode 100644
index 0000000..989b7f6
--- /dev/null
+++ b/apps/video/widget/app.jsx
@@ -0,0 +1,86 @@
+const config = {
+ theme: {
+ // add key values to define colors
+ // "--main-color": "blue",
+ // "--secondary-color": "red",
+ // background: "var(--main-color)",
+ // color: "var(--secondary-color)",
+ },
+ layout: {
+ src: "devs.near/widget/Layout",
+ props: {
+ variant: "standard",
+ },
+ },
+ blocks: {
+ // these get passed to the layout and children
+ Header: () => (
+
+ ),
+ Footer: () => <>>, // customize your footer
+ },
+ router: {
+ param: "page",
+ routes: {
+ home: {
+ path: "video.every.near/widget/browse",
+ blockHeight: "final",
+ init: {
+ name: "Browse",
+ },
+ default: true,
+ },
+ create: {
+ path: "video.every.near/widget/create",
+ blockHeight: "final",
+ init: {
+ name: "Create",
+ },
+ },
+ view: {
+ path: "video.every.near/widget/view",
+ blockHeight: "final",
+ init: {
+ name: "View",
+ path: props.path,
+ blockHeight: props.blockHeight,
+ },
+ },
+ library: {
+ path: "video.every.near/widget/Library.index",
+ blockHeight: "final",
+ init: {
+ name: "View",
+ path: props.path,
+ blockHeight: props.blockHeight,
+ },
+ },
+ },
+ },
+};
+
+const poppinsCSS = fetch(
+ "https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"
+).body;
+
+const Root = styled.div`
+ .container {
+ border: none !important;
+ }
+ ${poppinsCSS}
+ font-family: "Poppins", sans-serif;
+`;
+
+return (
+
+
+
+);
diff --git a/apps/video/widget/app.old.jsx b/apps/video/widget/app.old.jsx
new file mode 100644
index 0000000..33a3c9e
--- /dev/null
+++ b/apps/video/widget/app.old.jsx
@@ -0,0 +1,76 @@
+const config = {
+ theme: {
+ // add key values to define colors
+ // "--main-color": "blue",
+ // "--secondary-color": "red",
+ // background: "var(--main-color)",
+ // color: "var(--secondary-color)",
+ },
+ layout: {
+ src: "devs.near/widget/Layout",
+ props: {
+ variant: "standard",
+ },
+ },
+ blocks: {
+ // these get passed to the layout and children
+ Header: () => (
+ // customize your header
+
+ ),
+ Footer: () => <>>, // customize your footer
+ },
+ router: {
+ param: "page",
+ routes: {
+ home: {
+ path: "video.every.near/widget/browse.old",
+ blockHeight: "final",
+ init: {
+ name: "Browse",
+ },
+ default: true,
+ },
+ create: {
+ path: "video.every.near/widget/create",
+ blockHeight: "final",
+ init: {
+ name: "Create",
+ },
+ },
+ view: {
+ path: "video.every.near/widget/view",
+ blockHeight: "final",
+ init: {
+ name: "View",
+ path: props.path,
+ blockHeight: props.blockHeight,
+ },
+ },
+ library: {
+ path: "video.every.near/widget/Library.index",
+ blockHeight: "final",
+ init: {
+ name: "View",
+ path: props.path,
+ blockHeight: props.blockHeight,
+ },
+ },
+ },
+ },
+};
+
+const Root = styled.div`
+ .container {
+ border: none !important;
+ }
+`;
+
+return (
+
+
+
+);
diff --git a/apps/video/widget/app/view.jsx b/apps/video/widget/app/view.jsx
new file mode 100644
index 0000000..6a1841b
--- /dev/null
+++ b/apps/video/widget/app/view.jsx
@@ -0,0 +1,115 @@
+const { Router } = VM.require("video.every.near/widget/Router") || {
+ Router: () => <>>,
+};
+
+const { config, ...passProps } = props;
+
+if (!config) {
+ // TODO: get from settings (or default)
+ config = {
+ router: {
+ param: "page",
+ routes: {
+ home: {
+ default: true,
+ path: "efiz.near/widget/Tree",
+ blockHeight: "final",
+ init: {
+ name: "Home",
+ },
+ },
+ },
+ },
+ blocks: {
+ Header: () => <>>, // customize your header
+ Footer: () => <>>, // customize your footer
+ },
+ };
+} else {
+ // config may be a VM require string
+ if (typeof config !== "object") {
+ config = VM.require(config) || {};
+ }
+}
+
+console.log("config", config);
+
+if (!config) {
+ return (
+
+ unable to load config:{" "}
+ {typeof config === object ? JSON.stringify(config) : config}
+
+ );
+}
+
+const { Layout } = VM.require(
+ config.layout?.src ?? "devs.near/widget/Layout"
+) || {
+ Layout: () => <>>,
+};
+
+// While something like Theme should be in the parent...
+const CSS = styled.div`
+ .container {
+ border: 1px solid red;
+ }
+
+ .button {
+ }
+
+ .input {
+ }
+
+ .layout {
+ border: 4px solid var(--main-color);
+ }
+
+ .header {
+ border: 1px solid blue;
+ }
+
+ .content {
+ }
+
+ .footer {
+ }
+
+ img {
+ width: 100%;
+ }
+`;
+
+const Container = styled.div`
+ display: flex;
+ height: 100%;
+`;
+
+const Content = styled.div`
+ width: 100%;
+ height: 100%;
+`;
+
+// const GlobalStyle = createGlobalStyle`
+// `;
+
+// const Template = config.Template ?? (({children}) => <>{children}>);
+
+return (
+
+
+
+
+
+
+
+
+
+);
diff --git a/apps/video/widget/browse.jsx b/apps/video/widget/browse.jsx
new file mode 100644
index 0000000..c78d1c7
--- /dev/null
+++ b/apps/video/widget/browse.jsx
@@ -0,0 +1,80 @@
+const { HeroBanner } = VM.require(
+ "video.every.near/widget/Components.hero-banner"
+) || {
+ HeroBanner: () => <>>,
+};
+const { UploadBanner } = VM.require(
+ "video.every.near/widget/Components.upload-banner"
+) || {
+ UploadBanner: () => <>>,
+};
+const { BrowseTabs } = VM.require(
+ "video.every.near/widget/Components.browse-tabs"
+) || {
+ BrowseTabs: () => <>>,
+};
+
+const Grid = styled.div`
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ max-width: 100%;
+ gap: 1rem;
+
+ @media (max-width: 992px) {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ @media (max-width: 768px) {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+`;
+
+const BrowseContainer = styled.div`
+ padding: 32px 40px;
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+
+ @media (max-width: 768px) {
+ padding: 1.5rem;
+ }
+`;
+
+const tabs = [
+ { label: "All" },
+ { label: "Near" },
+ { label: "Everything" },
+ { label: "Build" },
+ { label: "User interface design" },
+ { label: "Music" },
+ { label: "Live" },
+];
+
+return (
+
+
+
+
+ (
+
+ ),
+ Layout: Grid,
+ buildPath: (item) => `${item.accountId}/thing/${item.value.id}`,
+ }}
+ />
+
+);
diff --git a/apps/video/widget/browse.old.jsx b/apps/video/widget/browse.old.jsx
new file mode 100644
index 0000000..336159b
--- /dev/null
+++ b/apps/video/widget/browse.old.jsx
@@ -0,0 +1,34 @@
+const Grid = styled.div`
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+
+ @media (hover: none) {
+ grid-template-columns: repeat(1, 1fr);
+ }
+`;
+
+return (
+ <>
+ (
+
+ ),
+ Layout: Grid,
+ buildPath: (item) => `${item.accountId}/thing/${item.value.id}`,
+ }}
+ />
+ >
+);
diff --git a/apps/video/widget/card.jsx b/apps/video/widget/card.jsx
new file mode 100644
index 0000000..fbcdab5
--- /dev/null
+++ b/apps/video/widget/card.jsx
@@ -0,0 +1,155 @@
+const path = props.path;
+const blockHeight = props.blockHeight;
+
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => {},
+};
+
+const VideoCard = styled.div`
+ border: 1px solid #e2e2e2;
+ border-radius: 1rem;
+ padding: 0.5rem;
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ background-color: #fff;
+ flex-shrink: 0;
+
+ transition: all 300ms;
+ &:hover {
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+
+ transform: scale(1.01);
+ }
+`;
+
+const VideoTitle = styled.h3`
+ color: #0d0d0e;
+
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 140%; /* 19.6px */
+ letter-spacing: -0.14px;
+ margin: 0;
+`;
+
+const VideoInfo = styled.div`
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.8em;
+ color: #888;
+`;
+
+const VideoThumbnail = styled.img`
+ object-fit: cover;
+ border-radius: 0.5rem;
+ aspect-ratio: 16 / 9;
+`;
+
+function handleExpandVideo() {
+ if (props.handleExpandVideo) {
+ props.handleExpandVideo(path, blockHeight);
+ }
+}
+
+const videoThing = Social.getr(path, blockHeight);
+
+if (!videoThing) return Loading...
;
+
+const userId = path.split("/")[0];
+const userProfile = Social.getr(`${userId}/profile`);
+
+const data = JSON.parse(videoThing[""] || "null");
+data = {
+ ...data,
+ poster:
+ data.poster === "https://ipfs.near.social/ipfs/undefined"
+ ? "https://placehold.co/450x300/000000/000000/png"
+ : data.poster,
+};
+
+const VideoDescription = styled.p`
+ color: #6f6f6f;
+ font-size: 12px;
+ line-height: 140%; /* 16.8px */
+ letter-spacing: -0.12px;
+ margin: 0;
+
+ display: flex;
+ align-items: center;
+ gap: 0.25rem;
+
+ svg {
+ height: 16px;
+ width: 16px;
+ }
+`;
+
+function secondsToHoursMinutes(seconds) {
+ const hours = Math.floor(seconds / 3600);
+ const minutes = Math.floor((seconds % 3600) / 60);
+ const remainingSeconds = Math.floor(seconds % 60);
+
+ if (!hours) {
+ return minutes + ":" + remainingSeconds;
+ }
+
+ return hours + ":" + minutes + ":" + remainingSeconds;
+}
+
+return (
+
+
+
+
+
+ {data?.videoSpec?.duration
+ ? secondsToHoursMinutes(data?.videoSpec?.duration)
+ : ""}
+
+
+
+
+
+ {videoThing.metadata.name}
+
+
+ {userProfile.name}{" "}
+
+
+
+
+
+
+
+
+);
diff --git a/apps/video/widget/card.old.jsx b/apps/video/widget/card.old.jsx
new file mode 100644
index 0000000..39686ab
--- /dev/null
+++ b/apps/video/widget/card.old.jsx
@@ -0,0 +1,85 @@
+const path = props.path;
+const blockHeight = props.blockHeight;
+
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => {},
+};
+
+const VideoCard = styled.div`
+ border: 1px solid #ccc;
+ border-radius: 8px;
+ padding: 16px;
+ margin: 16px;
+ width: 450px;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+ background-color: #fff;
+`;
+
+const VideoTitle = styled.h3`
+ margin: 0;
+ padding: 0;
+ font-size: 1.2em;
+`;
+
+const VideoDescription = styled.p`
+ font-size: 0.9em;
+ color: #666;
+`;
+
+const VideoInfo = styled.div`
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.8em;
+ color: #888;
+`;
+
+const VideoThumbnail = styled.img`
+ width: 100%;
+ height: auto;
+ border-radius: 4px;
+ margin-bottom: 12px;
+`;
+
+function handleExpandVideo() {
+ if (props.handleExpandVideo) {
+ props.handleExpandVideo(path, blockHeight);
+ }
+}
+
+const videoThing = Social.getr(path, blockHeight);
+
+if (!videoThing) return Loading...
;
+
+const data = JSON.parse(videoThing[""] || "null");
+
+return (
+
+
+
+
+ {videoThing.metadata.name}
+ {videoThing.metadata.description}
+
+
+ Duration:{" "}
+ {data?.videoSpec?.duration ? `${data?.videoSpec.duration}s` : "N/A"}
+
+ Format: {data?.videoSpec?.format || "N/A"}
+
+
+ Download Video
+
+
+);
diff --git a/apps/video/widget/create.jsx b/apps/video/widget/create.jsx
new file mode 100644
index 0000000..19dea01
--- /dev/null
+++ b/apps/video/widget/create.jsx
@@ -0,0 +1,224 @@
+const UUID = {
+ generate: (template) => {
+ if (typeof template !== "string") {
+ template = "xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx";
+ }
+ return template.replace(/[xy]/g, (c) => {
+ var r = (Math.random() * 16) | 0;
+ var v = c === "x" ? r : (r & 0x3) | 0x8;
+ return v.toString(16);
+ });
+ },
+};
+
+function handleVideoChange(e) {
+ State.update(e.target.files[0]);
+}
+
+function handleAssets(assets) {
+ console.log("assets", assets);
+ State.update({ uploadedVideo: assets[0] });
+}
+
+function handleStatus(status) {
+ console.log(status);
+ State.update({ uploadStatus: status });
+}
+
+State.init({
+ title: "",
+ description: "",
+ tags: [],
+ playbackId: "",
+ view: "BROWSE",
+});
+
+function handleOnChange(video) {
+ State.update({ currentUpload: video });
+}
+
+function handleCreateVideo() {
+ const { playbackId, storage, size, videoSpec, downloadUrl, name, source } =
+ state.uploadedVideo;
+ console.log(state.uploadedVideo);
+ const id = UUID.generate("xxxxxxx");
+ // TODO: Validate against Type
+ Social.set(
+ {
+ thing: {
+ [id]: {
+ "": JSON.stringify({
+ playbackId,
+ storage,
+ size,
+ videoSpec,
+ downloadUrl,
+ name,
+ source,
+ poster: "https://ipfs.near.social/ipfs/" + state.image.ipfs_cid,
+ }),
+ metadata: {
+ name: state.title,
+ description: state.description,
+ type: "every.near/type/video",
+ },
+ },
+ },
+ index: {
+ every: JSON.stringify({
+ key: "video",
+ value: { id, type: "every.near/type/video" },
+ }),
+ },
+ },
+ {
+ onCommit: () => {
+ State.update({ title: "", description: "", view: "SUCCESS" });
+ },
+ }
+ );
+}
+
+function handleImageUpload(image) {
+ State.update({ image });
+}
+
+const ImageUploaderContainer = styled.div`
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 1em;
+ padding: 1em;
+ background: #ffffff;
+ border: 1px solid #eceef0;
+ box-shadow: 0px 1px 3px rgba(16, 24, 40, 0.1),
+ 0px 1px 2px rgba(16, 24, 40, 0.06);
+ border-radius: 8px;
+ width: 100%;
+`;
+
+const ProcessingOverlay = styled.div`
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(255, 255, 255, 0.8);
+ backdrop-filter: blur(4px);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 9999;
+`;
+
+const Main = styled.div`
+ display: flex;
+ width: 100%;
+ height: 100%;
+
+ .left,
+ .right {
+ width: 50%;
+ padding: 20px;
+ box-sizing: border-box;
+ }
+
+ input,
+ button {
+ margin-top: 10px;
+ }
+`;
+
+const Button = styled.button``;
+
+return (
+
+
+
+
Play from Livepeer
+ State.update({ playbackId: e.target.value })}
+ />
+ {state.playbackId && (
+
+ ),
+ }}
+ />
+ )}
+
+
+);
diff --git a/apps/video/widget/header.jsx b/apps/video/widget/header.jsx
new file mode 100644
index 0000000..5a03644
--- /dev/null
+++ b/apps/video/widget/header.jsx
@@ -0,0 +1,125 @@
+const { Button } = VM.require("video.every.near/widget/Components.button") || {
+ Button: () => <>>,
+};
+
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => {},
+};
+
+const Header = styled.div`
+ border-bottom: 1px solid #e2e2e2;
+ background: #fff;
+ padding: 16px 40px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ img {
+ height: 32px;
+ width: auto;
+ object-fit: cover;
+ }
+
+ @media (max-width: 768px) {
+ padding: 1rem;
+ }
+`;
+
+const logoUrl =
+ "https://ipfs.near.social/ipfs/bafkreigkltpi3n6zltlryzfa7ipfyjz2vm3bdaizy6i6hinsjjudyldrtq";
+
+const CodeIcon = () => {
+ return (
+
+
+
+ );
+};
+
+const BellIcon = () => {
+ return (
+
+
+
+ );
+};
+
+const [open, setOpen] = useState(false);
+const toggleOpen = () => {
+ setOpen((prev) => !prev);
+};
+
+const Dropdown = styled.div`
+ max-height: ${({ open }) => (open ? "500px" : "0")};
+ overflow: hidden;
+`;
+
+return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+ connect
+
+
+
+
+
+
+
+
+
+
+ source
+
+
+ notifications
+
+
+ connect
+
+
+
+ >
+);
diff --git a/apps/video/widget/header.old.jsx b/apps/video/widget/header.old.jsx
new file mode 100644
index 0000000..bc461e3
--- /dev/null
+++ b/apps/video/widget/header.old.jsx
@@ -0,0 +1,165 @@
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => {},
+};
+
+const Header = styled.div`
+ display: flex;
+ justify-content: space-between;
+ padding: 10px 18px;
+ background-color: #f2f2f2;
+`;
+
+const ButtonRow = styled.div`
+ display: flex;
+ flex-direction: row;
+ gap: 4px;
+`;
+
+const Branding = styled.div`
+ display: flex;
+ align-items: baseline;
+ gap: 8px;
+ cursor: pointer;
+
+ svg {
+ width: auto;
+ height: 1em;
+ vertical-align: middle;
+ }
+`;
+
+const MainText = styled.span`
+ font-size: 3em;
+ font-weight: bold;
+ margin-right: 8px;
+`;
+
+const SubText = styled.span`
+ font-size: 0.8em;
+ color: grey;
+ margin-left: 4px;
+`;
+
+const Button = styled.button`
+ height: 100%;
+`;
+
+return (
+
+);
diff --git a/apps/video/widget/view.jsx b/apps/video/widget/view.jsx
new file mode 100644
index 0000000..fbe3961
--- /dev/null
+++ b/apps/video/widget/view.jsx
@@ -0,0 +1,323 @@
+const { HeroBanner } = VM.require(
+ "video.every.near/widget/Components.hero-banner"
+) || {
+ HeroBanner: () => <>>,
+};
+
+const { BrowseTabs } = VM.require(
+ "video.every.near/widget/Components.browse-tabs"
+) || {
+ BrowseTabs: () => <>>,
+};
+
+const { Feed } = VM.require("devs.near/widget/Feed") || {
+ Feed: () => <>>,
+};
+
+const path = props.path;
+const blockHeight = props.blockHeight;
+const accountId = path.split("/")[0];
+
+const item = {
+ path,
+ type: "every.near/type/video",
+};
+
+const ModalBox = styled.div`
+ background-color: white;
+ min-width: 400px;
+ max-width: 600px;
+ padding: 20px;
+ border-radius: 8px;
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
+ z-index: 1003;
+`;
+
+const VideoTitle = styled.h3`
+ margin: 0;
+ padding: 0;
+ font-size: 1.2em;
+`;
+
+const VideoDescription = styled.p`
+ font-size: 0.9em;
+ color: #666;
+`;
+
+const VideoInfo = styled.div`
+ display: flex;
+ gap: 1rem;
+ font-size: 0.8em;
+ color: #888;
+`;
+
+const VideoThumbnail = styled.img`
+ width: 100%;
+ height: auto;
+ border-radius: 4px;
+ margin-bottom: 12px;
+`;
+
+function handleExpandVideo() {
+ console.log("hey");
+ if (props.handleExpandVideo) {
+ props.handleExpandVideo(path, blockHeight);
+ }
+}
+
+const videoThing = Social.getr(path, blockHeight);
+
+if (!videoThing) return Loading...
;
+
+const data = JSON.parse(videoThing[""] || "null");
+
+const Button = styled.button``;
+
+const { href } = VM.require("buildhub.near/widget/lib.url") || {
+ href: () => {},
+};
+
+const ViewContainer = styled.div`
+ padding: 32px 40px;
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+
+ @media (max-width: 768px) {
+ padding: 1.5rem;
+ }
+`;
+
+const tabs = [
+ { label: "All" },
+ { label: "Near" },
+ { label: "Everything" },
+ { label: "Build" },
+ { label: "User interface design" },
+ { label: "Music" },
+ { label: "Live" },
+];
+
+const GridContainer = styled.div`
+ display: grid;
+ grid-template-columns: repeat(12, minmax(0, 1fr));
+ gap: 2rem;
+
+ @media (max-width: 768px) {
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+ }
+`;
+
+const Content = styled.div`
+ grid-column: span 9 / span 9;
+`;
+
+const SideContent = styled.div`
+ grid-column: span 3 / span 3;
+`;
+
+const List = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+`;
+
+return (
+
+
+
+
+
+
+
+ ),
+ },
+ }}
+ />
+
+
{videoThing.metadata.name}
+
+ {videoThing.metadata.description}
+
+
+
+ Format: {data?.videoSpec?.format || "N/A"}
+
+
+
+
+
+ {accountId}{" "}
+
+
+
+
+
+
{
+ State.update({
+ ...state,
+ postModalOpen: open,
+ });
+ },
+ toggle: (
+
+ <>
+
+
+
+ share
+ >
+
+ ),
+ content: (
+
+
+ {
+ State.update({
+ ...state,
+ postModalOpen: false,
+ });
+ },
+ }}
+ />
+
+
+ ),
+ }}
+ />
+
+
+
+
+ download
+
+
+
+
+
+
+ Comments
+
+ {
+ return (
+ }
+ props={{ accountId: p.accountId, blockHeight: p.blockHeight }}
+ />
+ );
+ }}
+ />
+
+
+
+ Suggested Videos
+ (
+
+ ),
+ Layout: List,
+ buildPath: (item) => `${item.accountId}/thing/${item.value.id}`,
+ }}
+ />
+
+
+
+);
diff --git a/bos.workspace.json b/bos.workspace.json
new file mode 100644
index 0000000..a2c1d3e
--- /dev/null
+++ b/bos.workspace.json
@@ -0,0 +1,3 @@
+{
+ "apps": ["./apps/*"]
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 6d37ba2..0000000
--- a/package-lock.json
+++ /dev/null
@@ -1,2562 +0,0 @@
-{
- "name": "every.near",
- "version": "1.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "every.near",
- "version": "1.0.0",
- "devDependencies": {
- "bos-workspace": "^0.0.1-alpha.4"
- }
- },
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "dev": true,
- "dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
- "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.22",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
- "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@socket.io/component-emitter": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
- "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
- "dev": true
- },
- "node_modules/@types/cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
- "dev": true
- },
- "node_modules/@types/cors": {
- "version": "2.8.17",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
- "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/node": {
- "version": "20.11.8",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.8.tgz",
- "integrity": "sha512-i7omyekpPTNdv4Jb/Rgqg0RU8YqLcNsI12quKSDkRXNfx7Wxdm6HhK1awT3xTgEkgxPn3bvnSpiEAc7a7Lpyow==",
- "dev": true,
- "dependencies": {
- "undici-types": "~5.26.4"
- }
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dev": true,
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
- "dev": true
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/base64id": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
- "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
- "dev": true,
- "engines": {
- "node": "^4.5.0 || >= 5.9"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
- "dev": true,
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/bos-cli": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/bos-cli/-/bos-cli-0.3.9.tgz",
- "integrity": "sha512-fkqctvFYl7c/0f5kY0X1NVozmmumJyp0yepx/PktK+gtW3Gh/Lodws1eWj1T9U/Hla4TIQdkXDQhcbcEihNUhw==",
- "dev": true,
- "hasInstallScript": true,
- "hasShrinkwrap": true,
- "dependencies": {
- "axios-proxy-builder": "^0.1.1",
- "binary-install": "^1.0.6",
- "console.table": "^0.10.0",
- "detect-libc": "^2.0.0"
- },
- "bin": {
- "bos": "run.js"
- },
- "engines": {
- "node": ">=14",
- "npm": ">=6"
- }
- },
- "node_modules/bos-cli/node_modules/axios": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
- "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
- "dev": true,
- "dependencies": {
- "follow-redirects": "^1.14.8"
- }
- },
- "node_modules/bos-cli/node_modules/axios-proxy-builder": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/axios-proxy-builder/-/axios-proxy-builder-0.1.2.tgz",
- "integrity": "sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==",
- "dev": true,
- "dependencies": {
- "tunnel": "^0.0.6"
- }
- },
- "node_modules/bos-cli/node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/bos-cli/node_modules/binary-install": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/binary-install/-/binary-install-1.0.6.tgz",
- "integrity": "sha512-h3K4jaC4jEauK3csXI9GxGBJldkpuJlHCIBv8i+XBNhPuxnlERnD1PWVczQYDqvhJfv0IHUbB3lhDrZUMHvSgw==",
- "dev": true,
- "dependencies": {
- "axios": "^0.26.1",
- "rimraf": "^3.0.2",
- "tar": "^6.1.11"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/bos-cli/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/bos-cli/node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/bos-cli/node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/bos-cli/node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/bos-cli/node_modules/console.table": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz",
- "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==",
- "dev": true,
- "dependencies": {
- "easy-table": "1.1.0"
- },
- "engines": {
- "node": "> 0.10"
- }
- },
- "node_modules/bos-cli/node_modules/defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "clone": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/bos-cli/node_modules/detect-libc": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
- "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/bos-cli/node_modules/easy-table": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz",
- "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==",
- "dev": true,
- "optionalDependencies": {
- "wcwidth": ">=1.0.1"
- }
- },
- "node_modules/bos-cli/node_modules/follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/bos-cli/node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/bos-cli/node_modules/fs-minipass/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/bos-cli/node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/bos-cli/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/bos-cli/node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/bos-cli/node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/bos-cli/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/bos-cli/node_modules/minipass": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz",
- "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/bos-cli/node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/bos-cli/node_modules/minizlib/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/bos-cli/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/bos-cli/node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/bos-cli/node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/bos-cli/node_modules/prettier": {
- "version": "2.8.4",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
- "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
- "extraneous": true,
- "bin": {
- "prettier": "bin-prettier.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/bos-cli/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/bos-cli/node_modules/tar": {
- "version": "6.1.13",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
- "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
- "dev": true,
- "dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^4.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/bos-cli/node_modules/tunnel": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
- "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
- "dev": true,
- "engines": {
- "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
- }
- },
- "node_modules/bos-cli/node_modules/wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "defaults": "^1.0.3"
- }
- },
- "node_modules/bos-cli/node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/bos-cli/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/bos-workspace": {
- "version": "0.0.1-alpha.4",
- "resolved": "https://registry.npmjs.org/bos-workspace/-/bos-workspace-0.0.1-alpha.4.tgz",
- "integrity": "sha512-meZJOdyL+OgQ6VJvDimYIrD6pAzFYlZyFZF59R4/3q89YjFrLTVCQ/pynI06kuL7qZeXwUCqxWg3slJ0pwtESA==",
- "dev": true,
- "dependencies": {
- "bos-cli": "^0.3.6",
- "chokidar": "^3.5.3",
- "commander": "^11.1.0",
- "express": "^4.18.2",
- "glob": "^10.3.10",
- "mock-fs": "^5.2.0",
- "near-cli-rs": "^0.4.3",
- "prettier": "^3.1.0",
- "socket.io": "^4.7.2",
- "sucrase": "^3.34.0"
- },
- "bin": {
- "bos-workspace": "bin/bos-workspace",
- "bw": "bin/bos-workspace"
- }
- },
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
- "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.1",
- "set-function-length": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/commander": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
- "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
- "dev": true,
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "dev": true
- },
- "node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "dev": true,
- "dependencies": {
- "object-assign": "^4",
- "vary": "^1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/define-data-property": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
- "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "dev": true
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/engine.io": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz",
- "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==",
- "dev": true,
- "dependencies": {
- "@types/cookie": "^0.4.1",
- "@types/cors": "^2.8.12",
- "@types/node": ">=10.0.0",
- "accepts": "~1.3.4",
- "base64id": "2.0.0",
- "cookie": "~0.4.1",
- "cors": "~2.8.5",
- "debug": "~4.3.1",
- "engine.io-parser": "~5.2.1",
- "ws": "~8.11.0"
- },
- "engines": {
- "node": ">=10.2.0"
- }
- },
- "node_modules/engine.io-parser": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz",
- "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/engine.io/node_modules/cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/engine.io/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/engine.io/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "dev": true
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dev": true,
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/foreground-child": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
- "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
- "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob": {
- "version": "10.3.10",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
- "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
- "dev": true,
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^2.3.5",
- "minimatch": "^9.0.1",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
- "path-scurry": "^1.10.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
- "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
- "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/jackspeak": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
- "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
- "dev": true,
- "dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "node_modules/lru-cache": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
- "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
- "dev": true,
- "engines": {
- "node": "14 || >=16.14"
- }
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
- "dev": true
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true,
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
- "dev": true,
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/mock-fs": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-5.2.0.tgz",
- "integrity": "sha512-2dF2R6YMSZbpip1V1WHKGLNjr/k48uQClqMVb5H3MOvwc9qhYis3/IWbj02qIg/Y8MDXKFF4c5v0rxx2o6xTZw==",
- "dev": true,
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "node_modules/near-cli-rs": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/near-cli-rs/-/near-cli-rs-0.4.3.tgz",
- "integrity": "sha512-bnMvFdRoQH8rq6FZ2YTfN06eaETsBDWcjW1NQVwpzCEjhaqofMDggpKGtcL713d7j0kU9BOdLFhuGlytFbmH8g==",
- "dev": true,
- "hasInstallScript": true,
- "hasShrinkwrap": true,
- "dependencies": {
- "axios-proxy-builder": "^0.1.1",
- "binary-install": "^1.0.6",
- "console.table": "^0.10.0",
- "detect-libc": "^2.0.0"
- },
- "bin": {
- "near": "run.js"
- },
- "engines": {
- "node": ">=14",
- "npm": ">=6"
- }
- },
- "node_modules/near-cli-rs/node_modules/axios": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
- "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
- "dev": true,
- "dependencies": {
- "follow-redirects": "^1.14.8"
- }
- },
- "node_modules/near-cli-rs/node_modules/axios-proxy-builder": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/axios-proxy-builder/-/axios-proxy-builder-0.1.2.tgz",
- "integrity": "sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==",
- "dev": true,
- "dependencies": {
- "tunnel": "^0.0.6"
- }
- },
- "node_modules/near-cli-rs/node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/near-cli-rs/node_modules/binary-install": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/binary-install/-/binary-install-1.0.6.tgz",
- "integrity": "sha512-h3K4jaC4jEauK3csXI9GxGBJldkpuJlHCIBv8i+XBNhPuxnlERnD1PWVczQYDqvhJfv0IHUbB3lhDrZUMHvSgw==",
- "dev": true,
- "dependencies": {
- "axios": "^0.26.1",
- "rimraf": "^3.0.2",
- "tar": "^6.1.11"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/near-cli-rs/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/near-cli-rs/node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/near-cli-rs/node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/near-cli-rs/node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/near-cli-rs/node_modules/console.table": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz",
- "integrity": "sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==",
- "dev": true,
- "dependencies": {
- "easy-table": "1.1.0"
- },
- "engines": {
- "node": "> 0.10"
- }
- },
- "node_modules/near-cli-rs/node_modules/defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "clone": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/near-cli-rs/node_modules/detect-libc": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
- "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/near-cli-rs/node_modules/easy-table": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz",
- "integrity": "sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==",
- "dev": true,
- "optionalDependencies": {
- "wcwidth": ">=1.0.1"
- }
- },
- "node_modules/near-cli-rs/node_modules/follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/near-cli-rs/node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/near-cli-rs/node_modules/fs-minipass/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/near-cli-rs/node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/near-cli-rs/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/near-cli-rs/node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/near-cli-rs/node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/near-cli-rs/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/near-cli-rs/node_modules/minipass": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz",
- "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/near-cli-rs/node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/near-cli-rs/node_modules/minizlib/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/near-cli-rs/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/near-cli-rs/node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/near-cli-rs/node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/near-cli-rs/node_modules/prettier": {
- "version": "2.8.4",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz",
- "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==",
- "extraneous": true,
- "bin": {
- "prettier": "bin-prettier.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/near-cli-rs/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/near-cli-rs/node_modules/tar": {
- "version": "6.1.13",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
- "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
- "dev": true,
- "dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^4.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/near-cli-rs/node_modules/tunnel": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
- "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
- "dev": true,
- "engines": {
- "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
- }
- },
- "node_modules/near-cli-rs/node_modules/wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "defaults": "^1.0.3"
- }
- },
- "node_modules/near-cli-rs/node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/near-cli-rs/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dev": true,
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-scurry": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
- "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^9.1.1 || ^10.0.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
- "dev": true
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
- "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/prettier": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz",
- "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==",
- "dev": true,
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dev": true,
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "dev": true,
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dev": true,
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "dev": true,
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
- "dev": true,
- "dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/set-function-length": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz",
- "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==",
- "dev": true,
- "dependencies": {
- "define-data-property": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.2",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/socket.io": {
- "version": "4.7.4",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz",
- "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.4",
- "base64id": "~2.0.0",
- "cors": "~2.8.5",
- "debug": "~4.3.2",
- "engine.io": "~6.5.2",
- "socket.io-adapter": "~2.5.2",
- "socket.io-parser": "~4.2.4"
- },
- "engines": {
- "node": ">=10.2.0"
- }
- },
- "node_modules/socket.io-adapter": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
- "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
- "dev": true,
- "dependencies": {
- "ws": "~8.11.0"
- }
- },
- "node_modules/socket.io-parser": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
- "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
- "dev": true,
- "dependencies": {
- "@socket.io/component-emitter": "~3.1.0",
- "debug": "~4.3.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/socket.io-parser/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/socket.io-parser/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/socket.io/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/socket.io/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/string-width-cjs": {
- "name": "string-width",
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/string-width-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/sucrase": {
- "version": "3.35.0",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
- "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "glob": "^10.3.10",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/sucrase/node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dev": true,
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
- "dev": true
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs": {
- "name": "wrap-ansi",
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/wrap-ansi-cjs/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ws": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
- "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- }
- }
-}
diff --git a/package.json b/package.json
index 31c630f..e7fbf65 100644
--- a/package.json
+++ b/package.json
@@ -1,11 +1,22 @@
{
"name": "every.near",
- "version": "1.0.0",
+ "version": "0.0.0",
+ "description": "",
+ "author": "nearbuilders",
+ "license": "MIT",
"scripts": {
- "dev": "bos-workspace dev",
- "build": "bos-workspace build"
+ "fmt": "prettier --write '**/*.{js,jsx,ts,tsx,json}'",
+ "fmt:check": "prettier --check '**/*.{js,jsx,ts,tsx,json}'",
+ "bw": "bos-workspace",
+ "dev": "bw ws dev",
+ "dev:testnet": "bw ws dev -n testnet",
+ "build": "bw ws build",
+ "build:testnet": "bw ws build -n testnet",
+ "test": "npx playwright test"
},
"devDependencies": {
- "bos-workspace": "^0.0.1-alpha.4"
+ "@playwright/test": "^1.43.1",
+ "bos-workspace": "^1.0.0-alpha",
+ "prettier": "^2.8.8"
}
}
diff --git a/playwright-tests/README.md b/playwright-tests/README.md
new file mode 100644
index 0000000..cd123ff
--- /dev/null
+++ b/playwright-tests/README.md
@@ -0,0 +1,64 @@
+# Testing Guide
+
+This project uses [playwright](https://playwright.dev/) for end-to-end testing. Please become familiar with this documentation.
+
+## Writing tests
+
+Tests should be written for each change or addition to the codebase.
+If a new feature is introduced, tests should be written to validate its functionality. If a bug is fixed, tests should be written to prevent regression. Writing tests not only safeguards against future breaks by other developers but also accelerates development by minimizing manual coding and browser interactions.
+
+When writing tests, remember to:
+
+- Test user-visible behavior
+- Make tests as isolated as possible
+- Avoid testing third-party dependencies
+
+> **[LEARN BEST PRACTICES](https://playwright.dev/docs/best-practices)**
+
+See the [cookbook](#cookbook) for help in covering scenerios. It is possible to [generate tests](https://playwright.dev/docs/codegen) via the [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright).
+
+## Running tests
+
+To run the tests, you may do so through the command line:
+
+```cmd
+npm run test
+```
+
+Or through VS Code **(recommended)**, see [Getting started - VS Code](https://playwright.dev/docs/getting-started-vscode).
+
+## Recording video
+
+You may automatically record video with your tests by setting
+
+```
+use: {
+ video: "on"
+}
+```
+
+in the [playwright.config.js](../playwright.config.js). After running tests, you will find the output as a `.webm` in `./test-results`. Then, [convert to MP4](https://video.online-convert.com/convert/webm-to-mp4) and share.
+
+It is encouraged to include video in pull requests in order to demonstrate functionality and prove thorough testing.
+
+## Cookbook
+
+### Capturing the VM Confirmation Popup
+
+Currently, none of the tests post actual transactions to the smart contracts. Still you should try writing your tests so that they do the actual function call, but just skip the final step of sending the transaction. You can do this by capturing the transaction confirmation popup provided by the NEAR social VM.
+
+```javascript
+// click button that triggers transaction
+await page.getByRole("button", { name: "Donate" }).nth(1).click();
+
+const transactionObj = JSON.parse(await page.locator("div.modal-body code").innerText());
+
+// do something with transactionObj
+expect(transactionObj).toMatchObject({
+ amount: 100,
+ message: "",
+ projectId: DEFAULT_PROJECT_ID,
+});
+```
+
+See the test called "project with no active pot should donate direct with correct amount" in donate.spec.js for a full example.
diff --git a/playwright-tests/storage-states/admin-connected.json b/playwright-tests/storage-states/admin-connected.json
new file mode 100644
index 0000000..c25b5db
--- /dev/null
+++ b/playwright-tests/storage-states/admin-connected.json
@@ -0,0 +1,27 @@
+{
+ "cookies": [],
+ "origins": [
+ {
+ "origin": "http://localhost:8080",
+ "localStorage": [
+ {
+ "name": "near-wallet-selector:selectedWalletId",
+ "value": "\"my-near-wallet\""
+ },
+ {
+ "name": "near_app_wallet_auth_key",
+ "value": "{\"accountId\":\"devs.near\"}"
+ },
+ {
+ "name": "near-social-vm:v01::accountId:",
+ "value": "devs.near"
+ },
+ {
+ "name": "flags",
+ "value": "{\"bosLoaderUrl\":\"http://127.0.0.1:3030\"}"
+ }
+ ]
+ }
+ ],
+ "sessionStorage": []
+}
diff --git a/playwright-tests/storage-states/wallet-connected.json b/playwright-tests/storage-states/wallet-connected.json
new file mode 100644
index 0000000..ac54d16
--- /dev/null
+++ b/playwright-tests/storage-states/wallet-connected.json
@@ -0,0 +1,27 @@
+{
+ "cookies": [],
+ "origins": [
+ {
+ "origin": "http://localhost:8080",
+ "localStorage": [
+ {
+ "name": "near-wallet-selector:selectedWalletId",
+ "value": "\"my-near-wallet\""
+ },
+ {
+ "name": "near_app_wallet_auth_key",
+ "value": "{\"accountId\":\"anybody.near\"}"
+ },
+ {
+ "name": "near-social-vm:v01::accountId:",
+ "value": "anybody.near"
+ },
+ {
+ "name": "flags",
+ "value": "{\"bosLoaderUrl\":\"http://127.0.0.1:3030\"}"
+ }
+ ]
+ }
+ ],
+ "sessionStorage": []
+}
diff --git a/playwright-tests/storage-states/wallet-not-connected.json b/playwright-tests/storage-states/wallet-not-connected.json
new file mode 100644
index 0000000..73acb7e
--- /dev/null
+++ b/playwright-tests/storage-states/wallet-not-connected.json
@@ -0,0 +1,15 @@
+{
+ "cookies": [],
+ "origins": [
+ {
+ "origin": "http://localhost:8080",
+ "localStorage": [
+ {
+ "name": "flags",
+ "value": "{\"bosLoaderUrl\":\"http://127.0.0.1:3030\"}"
+ }
+ ]
+ }
+ ],
+ "sessionStorage": []
+}
diff --git a/playwright-tests/testUtils.js b/playwright-tests/testUtils.js
new file mode 100644
index 0000000..1421fef
--- /dev/null
+++ b/playwright-tests/testUtils.js
@@ -0,0 +1,31 @@
+import { expect } from "@playwright/test";
+
+export const pauseIfVideoRecording = async (page) => {
+ let isVideoRecorded = (await page.video()) ? true : false;
+ if (isVideoRecorded) {
+ await page.waitForTimeout(500);
+ }
+};
+
+export const setInputAndAssert = async (page, selector, value) => {
+ await page.fill(selector, value);
+ const actualValue = await page.inputValue(selector);
+ expect(actualValue).toBe(value);
+};
+
+export const selectAndAssert = async (page, selector, value) => {
+ await page.selectOption(selector, { value: value });
+ const selectedValue = await page.$eval(selector, (select) => select.value);
+ expect(selectedValue).toBe(value);
+};
+
+export const waitForSelectorToBeVisible = async (page, selector) => {
+ await page.waitForSelector(selector, {
+ state: "visible",
+ });
+};
+
+export const clickWhenSelectorIsVisible = async (page, selector) => {
+ waitForSelectorToBeVisible(page, selector);
+ await page.click(selector);
+};
diff --git a/playwright-tests/tests/bosloaderenvironment.spec.js b/playwright-tests/tests/bosloaderenvironment.spec.js
new file mode 100644
index 0000000..881579a
--- /dev/null
+++ b/playwright-tests/tests/bosloaderenvironment.spec.js
@@ -0,0 +1,16 @@
+import { test, expect } from "@playwright/test";
+
+test("should find bos loader configuration in localstorage", async ({ page }) => {
+ await page.goto("/");
+
+ const localStoreFlags = await page.evaluate(() => localStorage.getItem("flags"));
+ expect(localStoreFlags).toEqual(
+ JSON.stringify({ bosLoaderUrl: "http://127.0.0.1:8080/api/loader" })
+ );
+});
+
+test("should not get bos loader fetch error", async ({ page }) => {
+ await page.goto("/potlock.near/widget/Index?tab=projects");
+ const bodyText = await page.textContent("body");
+ expect(bodyText).not.toContain('Source code for "potlock.near/widget/Index" is not found');
+});
diff --git a/playwright-tests/util/constants.js b/playwright-tests/util/constants.js
new file mode 100644
index 0000000..ecc9bb1
--- /dev/null
+++ b/playwright-tests/util/constants.js
@@ -0,0 +1,3 @@
+/**
+ * constants
+ */
diff --git a/playwright.config.js b/playwright.config.js
new file mode 100644
index 0000000..d28ddeb
--- /dev/null
+++ b/playwright.config.js
@@ -0,0 +1,107 @@
+// @ts-check
+import { defineConfig, devices } from "@playwright/test";
+
+/**
+ * Read environment variables from file.
+ * https://github.com/motdotla/dotenv
+ */
+// require('dotenv').config();
+
+/**
+ * @see https://playwright.dev/docs/test-configuration
+ */
+export default defineConfig({
+ testDir: "./playwright-tests/tests",
+ /* Maximum time one test can run for. */
+ timeout: 30 * 1000,
+ expect: {
+ /**
+ * Maximum time expect() should wait for the condition to be met.
+ * For example in `await expect(locator).toHaveText();`
+ */
+ timeout: 5000,
+ },
+ /* Run tests in files in parallel */
+ fullyParallel: true,
+ /* Fail the build on CI if you accidentally left test.only in the source code. */
+ forbidOnly: !!process.env.CI,
+ /* Retry on CI only */
+ retries: process.env.CI ? 2 : 0,
+ /* Opt out of parallel tests on CI. */
+ workers: process.env.CI ? "100%" : undefined,
+ /* Reporter to use. See https://playwright.dev/docs/test-reporters */
+ reporter: "line",
+ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
+ use: {
+ video: "off",
+ /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */
+ actionTimeout: 0,
+ /* Base URL to use in actions like `await page.goto('/')`. */
+ baseURL: "http://localhost:8080",
+
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+ trace: "on-first-retry",
+ storageState: {
+ cookies: [],
+ origins: [
+ {
+ origin: "http://localhost:8080",
+ localStorage: [
+ {
+ name: "flags",
+ value: JSON.stringify({ bosLoaderUrl: "http://127.0.0.1:8080/api/loader" }),
+ },
+ ],
+ },
+ ],
+ },
+ },
+
+ /* Configure projects for major browsers */
+ projects: [
+ {
+ name: "chromium",
+ use: { ...devices["Desktop Chrome"] },
+ },
+
+ /*{
+ name: 'firefox',
+ use: { ...devices['Desktop Firefox'] },
+ },
+
+ {
+ name: 'webkit',
+ use: { ...devices['Desktop Safari'] },
+ },*/
+
+ /* Test against mobile viewports. */
+ // {
+ // name: 'Mobile Chrome',
+ // use: { ...devices['Pixel 5'] },
+ // },
+ // {
+ // name: 'Mobile Safari',
+ // use: { ...devices['iPhone 12'] },
+ // },
+
+ /* Test against branded browsers. */
+ // {
+ // name: 'Microsoft Edge',
+ // use: { channel: 'msedge' },
+ // },
+ // {
+ // name: 'Google Chrome',
+ // use: { channel: 'chrome' },
+ // },
+ ],
+
+ /* Folder for test artifacts such as screenshots, videos, traces, etc. */
+ outputDir: "test-results/",
+
+ /* Run your local dev server before starting the tests */
+ webServer: {
+ command: "npm run dev",
+ port: 8080,
+ reuseExistingServer: !process.env.CI,
+ },
+});
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..b5fc558
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,1639 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0":
+ version "9.3.0"
+ resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb"
+ integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==
+
+"@hapi/topo@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012"
+ integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==
+ dependencies:
+ "@hapi/hoek" "^9.0.0"
+
+"@isaacs/cliui@^8.0.2":
+ version "8.0.2"
+ resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+ integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ dependencies:
+ string-width "^5.1.2"
+ string-width-cjs "npm:string-width@^4.2.0"
+ strip-ansi "^7.0.1"
+ strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+ wrap-ansi "^8.1.0"
+ wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
+"@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.5"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.4.15"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.24":
+ version "0.3.25"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@near-js/crypto@1.2.3":
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/@near-js/crypto/-/crypto-1.2.3.tgz#ba318d77b9eed79ef92a86f7a2c84562cb2f6b9d"
+ integrity sha512-BuNE+tdcxwImxktFtuAxLiVejFDtn1X92kejcDcYc6f7e0ku9yMntdw98LMb+5ls+xlRuF1UDoi/hUF1LPVpyQ==
+ dependencies:
+ "@near-js/types" "0.2.0"
+ "@near-js/utils" "0.2.1"
+ "@noble/curves" "1.2.0"
+ borsh "1.0.0"
+ randombytes "2.1.0"
+
+"@near-js/keystores@0.0.11":
+ version "0.0.11"
+ resolved "https://registry.npmjs.org/@near-js/keystores/-/keystores-0.0.11.tgz#570c70c4c5bb6ba64a94b8bff4cc71cc23265aec"
+ integrity sha512-B/VkSNIT8vxMozDbK9O54YQGa4JT/rFnB0W+0cN3na38sQHdvzK015X2RHK8mfS0isP/iIT9QzIQtYZcI3M83Q==
+ dependencies:
+ "@near-js/crypto" "1.2.3"
+ "@near-js/types" "0.2.0"
+
+"@near-js/providers@^0.2.1":
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/@near-js/providers/-/providers-0.2.1.tgz#1d195638b07fd542e202a61dd8c571034ec7cd62"
+ integrity sha512-F5ZVlXynGopg3BjK3ihyA28tnOk/cM7kUhc/bw5aJg+m+oa1yuBkaAp9JbihagbLZpWOZiDJmkrdkpvTvQlHag==
+ dependencies:
+ "@near-js/transactions" "1.2.1"
+ "@near-js/types" "0.2.0"
+ "@near-js/utils" "0.2.1"
+ borsh "1.0.0"
+ http-errors "1.7.2"
+ optionalDependencies:
+ node-fetch "2.6.7"
+
+"@near-js/signers@0.1.3":
+ version "0.1.3"
+ resolved "https://registry.npmjs.org/@near-js/signers/-/signers-0.1.3.tgz#7ac9c630536457c3cd94c4faf901b7033a76b6bc"
+ integrity sha512-Eim6ZsQUgsaSzi+oyR9cQesOO2QcZmhK+tawZan1vni8y+JvKnSH6r3krzbtvKWqIlx/kJ+PsIV74YIxPY5Uhw==
+ dependencies:
+ "@near-js/crypto" "1.2.3"
+ "@near-js/keystores" "0.0.11"
+ "@noble/hashes" "1.3.3"
+
+"@near-js/transactions@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@near-js/transactions/-/transactions-1.2.1.tgz#f9a304cd2a35f292557c3764473127b231c06892"
+ integrity sha512-w2EXgTRXJ+Zxqh8lVnQuRnpCEm6Cq7NxqAcfH6x0BPuSXye5kR9d0n2ut8AGkSXWeooKKEUnDhi6UcXadfoerg==
+ dependencies:
+ "@near-js/crypto" "1.2.3"
+ "@near-js/signers" "0.1.3"
+ "@near-js/types" "0.2.0"
+ "@near-js/utils" "0.2.1"
+ "@noble/hashes" "1.3.3"
+ borsh "1.0.0"
+
+"@near-js/types@0.2.0", "@near-js/types@^0.2.0":
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/@near-js/types/-/types-0.2.0.tgz#5370c3e9230103222b2827dbd6370f03c4e996d1"
+ integrity sha512-pTahjni0+PzStseFtnnI9nqmh+ZrHqBqeERo3B3OCXUC/qEie0ZSBMSMt80SgqnaGAy5/CqkCLO9zOx1gA8Cwg==
+
+"@near-js/utils@0.2.1":
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/@near-js/utils/-/utils-0.2.1.tgz#6798cf8c3a6ed8057da002401e24409c49454a82"
+ integrity sha512-u7yR1fmxIcYoiITR1spTvqciXbMXNvlrmRcneNt9DWeQP7yPdbCQtRB7lMN2KI7ONkUf3U7xiheQDDmk2vFI0w==
+ dependencies:
+ "@near-js/types" "0.2.0"
+ bs58 "4.0.0"
+ depd "2.0.0"
+ mustache "4.0.0"
+
+"@noble/curves@1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
+ integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==
+ dependencies:
+ "@noble/hashes" "1.3.2"
+
+"@noble/hashes@1.3.2":
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39"
+ integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==
+
+"@noble/hashes@1.3.3":
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699"
+ integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==
+
+"@pkgjs/parseargs@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
+"@playwright/test@^1.43.1":
+ version "1.44.0"
+ resolved "https://registry.npmjs.org/@playwright/test/-/test-1.44.0.tgz#ac7a764b5ee6a80558bdc0fcbc525fcb81f83465"
+ integrity sha512-rNX5lbNidamSUorBhB4XZ9SQTjAqfe5M+p37Z8ic0jPFBMo5iCtQz1kRWkEMg+rYOKSlVycpQmpqjSFq7LXOfg==
+ dependencies:
+ playwright "1.44.0"
+
+"@sideway/address@^4.1.5":
+ version "4.1.5"
+ resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5"
+ integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==
+ dependencies:
+ "@hapi/hoek" "^9.0.0"
+
+"@sideway/formula@^3.0.1":
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f"
+ integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==
+
+"@sideway/pinpoint@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df"
+ integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
+
+"@socket.io/component-emitter@~3.1.0":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2"
+ integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==
+
+"@types/cookie@^0.4.1":
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d"
+ integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==
+
+"@types/cors@^2.8.12":
+ version "2.8.17"
+ resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b"
+ integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node@*", "@types/node@>=10.0.0":
+ version "20.12.12"
+ resolved "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050"
+ integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==
+ dependencies:
+ undici-types "~5.26.4"
+
+accepts@~1.3.4, accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
+ integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+ integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
+any-promise@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+ integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+axios-proxy-builder@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/axios-proxy-builder/-/axios-proxy-builder-0.1.2.tgz#1149ffd916d0817c665c0bff2d50eeb10afce5bf"
+ integrity sha512-6uBVsBZzkB3tCC8iyx59mCjQckhB8+GQrI9Cop8eC7ybIsvs/KtnNgEBfRMSEa7GqK2VBGUzgjNYMdPIfotyPA==
+ dependencies:
+ tunnel "^0.0.6"
+
+axios@^0.26.1:
+ version "0.26.1"
+ resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
+ integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==
+ dependencies:
+ follow-redirects "^1.14.8"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^2.0.1:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/base-x/-/base-x-2.0.6.tgz#4582a91ebcec99ee06f4e4032030b0cf1c2941d8"
+ integrity sha512-UAmjxz9KbK+YIi66xej+pZVo/vxUOh49ubEvZW5egCbxhur05pBb+hwuireQwKO4nDpsNm64/jEei17LEpsr5g==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base64id@2.0.0, base64id@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
+ integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
+
+binary-install@^1.0.6:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/binary-install/-/binary-install-1.1.0.tgz#61195349acabf5a043f3805b03f96e506cc96d6e"
+ integrity sha512-rkwNGW+3aQVSZoD0/o3mfPN6Yxh3Id0R/xzTVBVVpGNlVz8EGwusksxRlbk/A5iKTZt9zkMn3qIqmAt3vpfbzg==
+ dependencies:
+ axios "^0.26.1"
+ rimraf "^3.0.2"
+ tar "^6.1.11"
+
+body-parser@1.20.2, body-parser@^1.20.2:
+ version "1.20.2"
+ resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
+ integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.5"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.11.0"
+ raw-body "2.5.2"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+borsh@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/borsh/-/borsh-1.0.0.tgz#b564c8cc8f7a91e3772b9aef9e07f62b84213c1f"
+ integrity sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==
+
+bos-cli@^0.3.13:
+ version "0.3.13"
+ resolved "https://registry.npmjs.org/bos-cli/-/bos-cli-0.3.13.tgz#b6d44f8766440e0de1946cf8417852b9fb1bff92"
+ integrity sha512-pXBjeiBxxBuBCX/q5nIa0/Kqx8813axfVRHfLGATHM7g5RFLVqR7+A/zJ4tMvSwmV5fC2AL0Oamve8/HZkSRyA==
+ dependencies:
+ axios-proxy-builder "^0.1.1"
+ binary-install "^1.0.6"
+ console.table "^0.10.0"
+ detect-libc "^2.0.0"
+
+bos-workspace@^1.0.0-alpha:
+ version "1.0.0-alpha.20"
+ resolved "https://registry.npmjs.org/bos-workspace/-/bos-workspace-1.0.0-alpha.20.tgz#8515b26067c3cc7461032423c64574dcac87a152"
+ integrity sha512-wMBVPP81p2jPygklvx3ZHAiurWKoSJ7+Xu/5IR/gz1hnESyqvsEVwSdBO+yF5WcbvgDcLgIbV41dnXjnm+uFtw==
+ dependencies:
+ "@near-js/providers" "^0.2.1"
+ "@near-js/types" "^0.2.0"
+ body-parser "^1.20.2"
+ bos-cli "^0.3.13"
+ commander "^11.1.0"
+ crypto-js "^4.2.0"
+ express "^4.18.2"
+ fs-extra "^11.2.0"
+ gaze "^1.1.3"
+ glob "^10.3.10"
+ https "^1.0.0"
+ joi "^17.11.0"
+ multilang-extract-comments "^0.4.0"
+ mvdir "^1.0.21"
+ prettier "^2.8.8"
+ prompts "^2.4.2"
+ replace-in-file "^7.1.0"
+ slugify "^1.6.6"
+ socket.io "^4.7.3"
+ sucrase "^3.34.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+bs58@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.0.tgz#65f5deaf6d74e6135a99f763ca6209ab424b9172"
+ integrity sha512-/jcGuUuSebyxwLLfKrbKnCJttxRf9PM51EnHTwmFKBxl4z1SGkoAhrfd6uZKE0dcjQTfm6XzTP8DPr1tzE4KIw==
+ dependencies:
+ base-x "^2.0.1"
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
+
+chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+commander@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906"
+ integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==
+
+commander@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+ integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+
+comment-patterns@^0.12.0:
+ version "0.12.2"
+ resolved "https://registry.npmjs.org/comment-patterns/-/comment-patterns-0.12.2.tgz#bcdc541959afd6ecf8593da83cfb736727ad3e17"
+ integrity sha512-yA1FeubMSK0MXzapPm1uNdxyGk0mTAn5qrsVS6uQUSDOpUgWVLCqsgZfA/lhRx6TCLr1MvxeRqXOb1peWXWg3Q==
+ dependencies:
+ lodash "^4.17.11"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+console.table@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.npmjs.org/console.table/-/console.table-0.10.0.tgz#0917025588875befd70cf2eff4bef2c6e2d75d04"
+ integrity sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==
+ dependencies:
+ easy-table "1.1.0"
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4, content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
+ integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
+
+cookie@~0.4.1:
+ version "0.4.2"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
+ integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
+
+cors@~2.8.5:
+ version "2.8.5"
+ resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+cross-spawn@^7.0.0:
+ version "7.0.3"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+crypto-js@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631"
+ integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@~4.3.1, debug@~4.3.2, debug@~4.3.4:
+ version "4.3.4"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+defaults@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a"
+ integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==
+ dependencies:
+ clone "^1.0.2"
+
+define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-libc@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
+ integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==
+
+eastasianwidth@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+ integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
+easy-table@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/easy-table/-/easy-table-1.1.0.tgz#86f9ab4c102f0371b7297b92a651d5824bc8cb73"
+ integrity sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA==
+ optionalDependencies:
+ wcwidth ">=1.0.1"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+engine.io-parser@~5.2.1:
+ version "5.2.2"
+ resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49"
+ integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==
+
+engine.io@~6.5.2:
+ version "6.5.4"
+ resolved "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc"
+ integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==
+ dependencies:
+ "@types/cookie" "^0.4.1"
+ "@types/cors" "^2.8.12"
+ "@types/node" ">=10.0.0"
+ accepts "~1.3.4"
+ base64id "2.0.0"
+ cookie "~0.4.1"
+ cors "~2.8.5"
+ debug "~4.3.1"
+ engine.io-parser "~5.2.1"
+ ws "~8.11.0"
+
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+escalade@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
+ integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+express@^4.18.2:
+ version "4.19.2"
+ resolved "https://registry.npmjs.org/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
+ integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.2"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.6.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.2.0"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.7"
+ qs "6.11.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.18.0"
+ serve-static "1.15.0"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+finalhandler@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
+ integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.0.0"
+
+follow-redirects@^1.14.8:
+ version "1.15.6"
+ resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+ integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+
+foreground-child@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d"
+ integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==
+ dependencies:
+ cross-spawn "^7.0.0"
+ signal-exit "^4.0.1"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+fs-extra@^11.2.0:
+ version "11.2.0"
+ resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
+ integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@2.3.2:
+ version "2.3.2"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+gaze@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
+ integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
+ dependencies:
+ globule "^1.0.0"
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+glob@^10.3.10:
+ version "10.3.16"
+ resolved "https://registry.npmjs.org/glob/-/glob-10.3.16.tgz#bf6679d5d51279c8cfae4febe0d051d2a4bf4c6f"
+ integrity sha512-JDKXl1DiuuHJ6fVS2FXjownaavciiHNUU4mOvV/B793RLh05vZL1rcPnCSaOgv1hDT6RDlY7AB7ZUvFYAtPgAw==
+ dependencies:
+ foreground-child "^3.1.0"
+ jackspeak "^3.1.2"
+ minimatch "^9.0.1"
+ minipass "^7.0.4"
+ path-scurry "^1.11.0"
+
+glob@^7.1.3:
+ version "7.2.3"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
+ integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^5.0.1"
+ once "^1.3.0"
+
+glob@~7.1.1:
+ version "7.1.7"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globule@^1.0.0:
+ version "1.3.4"
+ resolved "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz#7c11c43056055a75a6e68294453c17f2796170fb"
+ integrity sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==
+ dependencies:
+ glob "~7.1.1"
+ lodash "^4.17.21"
+ minimatch "~3.0.2"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.11"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
+has-proto@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+ integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+
+has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+hasown@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+https@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4"
+ integrity sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+jackspeak@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz#eada67ea949c6b71de50f1b09c92a961897b90ab"
+ integrity sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+ optionalDependencies:
+ "@pkgjs/parseargs" "^0.11.0"
+
+joi@^17.11.0:
+ version "17.13.1"
+ resolved "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz#9c7b53dc3b44dd9ae200255cc3b398874918a6ca"
+ integrity sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==
+ dependencies:
+ "@hapi/hoek" "^9.3.0"
+ "@hapi/topo" "^5.1.0"
+ "@sideway/address" "^4.1.5"
+ "@sideway/formula" "^3.0.1"
+ "@sideway/pinpoint" "^2.0.0"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+line-counter@^1.0.3:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/line-counter/-/line-counter-1.1.0.tgz#10df2c046ad3546e724fba55fa72cde18a6a01f3"
+ integrity sha512-6bmXJG/pOX5HBb2aIJZrI9CALBgY1VMbS0GPuXfJaT13UEfee/2xxPCsOOJdXLl3KPRyBf2/D+cjiG8hU9S7LA==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+lodash@^4.17.11, lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+lru-cache@^10.2.0:
+ version "10.2.2"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878"
+ integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+minimatch@^3.0.4, minimatch@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^5.0.1:
+ version "5.1.6"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@^9.0.1:
+ version "9.0.4"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51"
+ integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@~3.0.2:
+ version "3.0.8"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1"
+ integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minipass@^3.0.0:
+ version "3.3.6"
+ resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+ integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+ dependencies:
+ yallist "^4.0.0"
+
+minipass@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
+ integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
+
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4:
+ version "7.1.1"
+ resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481"
+ integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==
+
+minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mkdirp@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multilang-extract-comments@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/multilang-extract-comments/-/multilang-extract-comments-0.4.0.tgz#45a7bb8158423bbdddf2cf7b8c69df8c57143de8"
+ integrity sha512-8mXCo9Q42Wyfho9nn7hHkG/0sKxH0nJWfmBLl8+c+FLv++XhFkFC1sntOk4NFZ+nSpoMjlF/8ILeOLyMRTFbIw==
+ dependencies:
+ comment-patterns "^0.12.0"
+ line-counter "^1.0.3"
+ lodash "^4.17.11"
+ quotemeta "0.0.0"
+
+mustache@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/mustache/-/mustache-4.0.0.tgz#7f02465dbb5b435859d154831c032acdfbbefb31"
+ integrity sha512-FJgjyX/IVkbXBXYUwH+OYwQKqWpFPLaLVESd70yHjSDunwzV2hZOoTBvPf4KLoxesUzzyfTH6F784Uqd7Wm5yA==
+
+mvdir@^1.0.21:
+ version "1.0.21"
+ resolved "https://registry.npmjs.org/mvdir/-/mvdir-1.0.21.tgz#d8de39037c3198a4ab8478c7afa64e99f0e77483"
+ integrity sha512-au1XRgt8EOlAzDxDSAkH7T+lpHsguZZi6mNYMZzwy5PO1xT6jw2Lu2ZUe4GN0PFb5xVoyAEnTcDu1eV4wbxC+Q==
+
+mz@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+ integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+ dependencies:
+ any-promise "^1.0.0"
+ object-assign "^4.0.1"
+ thenify-all "^1.0.0"
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+node-fetch@2.6.7:
+ version "2.6.7"
+ resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+ integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+object-assign@^4, object-assign@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.13.1:
+ version "1.13.1"
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
+ integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-scurry@^1.11.0:
+ version "1.11.1"
+ resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
+ integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
+ dependencies:
+ lru-cache "^10.2.0"
+ minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
+
+pirates@^4.0.1:
+ version "4.0.6"
+ resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
+ integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
+
+playwright-core@1.44.0:
+ version "1.44.0"
+ resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.0.tgz#316c4f0bca0551ffb88b6eb1c97bc0d2d861b0d5"
+ integrity sha512-ZTbkNpFfYcGWohvTTl+xewITm7EOuqIqex0c7dNZ+aXsbrLj0qI8XlGKfPpipjm0Wny/4Lt4CJsWJk1stVS5qQ==
+
+playwright@1.44.0:
+ version "1.44.0"
+ resolved "https://registry.npmjs.org/playwright/-/playwright-1.44.0.tgz#22894e9b69087f6beb639249323d80fe2b5087ff"
+ integrity sha512-F9b3GUCLQ3Nffrfb6dunPOkE5Mh68tR7zN32L4jCk4FjQamgesGay7/dAAe1WaMEGV04DkdJfcJzjoCKygUaRQ==
+ dependencies:
+ playwright-core "1.44.0"
+ optionalDependencies:
+ fsevents "2.3.2"
+
+prettier@^2.8.8:
+ version "2.8.8"
+ resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
+ integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
+
+prompts@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+qs@6.11.0:
+ version "6.11.0"
+ resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
+ integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
+ dependencies:
+ side-channel "^1.0.4"
+
+quotemeta@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.npmjs.org/quotemeta/-/quotemeta-0.0.0.tgz#51d3a06ee0fcd6e3b501dbd28904351ad7a5a38c"
+ integrity sha512-1XGObUh7RN5b58vKuAsrlfqT+Rc4vmw8N4pP9gFCq1GFlTdV0Ex/D2Ro1Drvrqj++HPi3ig0Np17XPslELeMRA==
+
+randombytes@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.2:
+ version "2.5.2"
+ resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+replace-in-file@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/replace-in-file/-/replace-in-file-7.1.0.tgz#ec5d50283a3ce835d62c99d90700aacbada1d2f8"
+ integrity sha512-1uZmJ78WtqNYCSuPC9IWbweXkGxPOtk2rKuar8diTw7naVIQZiE3Tm8ACx2PCMXDtVH6N+XxwaRY2qZ2xHPqXw==
+ dependencies:
+ chalk "^4.1.2"
+ glob "^8.1.0"
+ yargs "^17.7.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+send@0.18.0:
+ version "0.18.0"
+ resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
+ integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+serve-static@1.15.0:
+ version "1.15.0"
+ resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
+ integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.18.0"
+
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
+
+signal-exit@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slugify@^1.6.6:
+ version "1.6.6"
+ resolved "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b"
+ integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==
+
+socket.io-adapter@~2.5.2:
+ version "2.5.4"
+ resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz#4fdb1358667f6d68f25343353bd99bd11ee41006"
+ integrity sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==
+ dependencies:
+ debug "~4.3.4"
+ ws "~8.11.0"
+
+socket.io-parser@~4.2.4:
+ version "4.2.4"
+ resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83"
+ integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==
+ dependencies:
+ "@socket.io/component-emitter" "~3.1.0"
+ debug "~4.3.1"
+
+socket.io@^4.7.3:
+ version "4.7.5"
+ resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8"
+ integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==
+ dependencies:
+ accepts "~1.3.4"
+ base64id "~2.0.0"
+ cors "~2.8.5"
+ debug "~4.3.2"
+ engine.io "~6.5.2"
+ socket.io-adapter "~2.5.2"
+ socket.io-parser "~4.2.4"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+"statuses@>= 1.5.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
+"string-width-cjs@npm:string-width@^4.2.0":
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^5.0.1, string-width@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+ integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ dependencies:
+ eastasianwidth "^0.2.0"
+ emoji-regex "^9.2.2"
+ strip-ansi "^7.0.1"
+
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+ dependencies:
+ ansi-regex "^6.0.1"
+
+sucrase@^3.34.0:
+ version "3.35.0"
+ resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263"
+ integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.2"
+ commander "^4.0.0"
+ glob "^10.3.10"
+ lines-and-columns "^1.1.6"
+ mz "^2.7.0"
+ pirates "^4.0.1"
+ ts-interface-checker "^0.1.9"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+tar@^6.1.11:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
+ integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^5.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+thenify-all@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+ integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==
+ dependencies:
+ thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
+ integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
+ dependencies:
+ any-promise "^1.0.0"
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+ts-interface-checker@^0.1.9:
+ version "0.1.13"
+ resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
+ integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
+
+tunnel@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
+ integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+wcwidth@>=1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==
+ dependencies:
+ defaults "^1.0.3"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+ integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+ dependencies:
+ ansi-styles "^6.1.0"
+ string-width "^5.0.1"
+ strip-ansi "^7.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@~8.11.0:
+ version "8.11.0"
+ resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"
+ integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"