@misonetwork/sdk 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -7
- package/dist/client.d.ts +3 -17
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -0
- package/dist/client.js.map +1 -1
- package/dist/contracts/miso/composition.d.ts +0 -14
- package/dist/contracts/miso/composition.d.ts.map +1 -1
- package/dist/contracts/miso/composition.js +0 -15
- package/dist/contracts/miso/composition.js.map +1 -1
- package/dist/contracts/miso/recording.d.ts +0 -15
- package/dist/contracts/miso/recording.d.ts.map +1 -1
- package/dist/contracts/miso/recording.js +0 -15
- package/dist/contracts/miso/recording.js.map +1 -1
- package/dist/contracts/miso/release.d.ts +0 -11
- package/dist/contracts/miso/release.d.ts.map +1 -1
- package/dist/contracts/miso/release.js +0 -14
- package/dist/contracts/miso/release.js.map +1 -1
- package/dist/contracts/miso_party/deps/sui/vec_set.d.ts +21 -0
- package/dist/contracts/miso_party/deps/sui/vec_set.d.ts.map +1 -0
- package/dist/contracts/miso_party/deps/sui/vec_set.js +20 -0
- package/dist/contracts/miso_party/deps/sui/vec_set.js.map +1 -0
- package/dist/contracts/miso_party/party.d.ts +481 -0
- package/dist/contracts/miso_party/party.d.ts.map +1 -0
- package/dist/contracts/miso_party/party.js +527 -0
- package/dist/contracts/miso_party/party.js.map +1 -0
- package/dist/contracts/party_cta/party_cta.d.ts +120 -0
- package/dist/contracts/party_cta/party_cta.d.ts.map +1 -0
- package/dist/contracts/party_cta/party_cta.js +139 -0
- package/dist/contracts/party_cta/party_cta.js.map +1 -0
- package/dist/contracts/party_genre/party_genre.d.ts +117 -0
- package/dist/contracts/party_genre/party_genre.d.ts.map +1 -0
- package/dist/contracts/party_genre/party_genre.js +131 -0
- package/dist/contracts/party_genre/party_genre.js.map +1 -0
- package/dist/contracts/party_media/party_media.d.ts +86 -0
- package/dist/contracts/party_media/party_media.d.ts.map +1 -0
- package/dist/contracts/party_media/party_media.js +97 -0
- package/dist/contracts/party_media/party_media.js.map +1 -0
- package/dist/contracts/party_music/party_music.d.ts +209 -0
- package/dist/contracts/party_music/party_music.d.ts.map +1 -0
- package/dist/contracts/party_music/party_music.js +259 -0
- package/dist/contracts/party_music/party_music.js.map +1 -0
- package/dist/contracts/party_platform_link/party_platform_link.d.ts +89 -0
- package/dist/contracts/party_platform_link/party_platform_link.d.ts.map +1 -0
- package/dist/contracts/party_platform_link/party_platform_link.js +92 -0
- package/dist/contracts/party_platform_link/party_platform_link.js.map +1 -0
- package/dist/contracts/party_pro_link/party_pro_link.d.ts +233 -0
- package/dist/contracts/party_pro_link/party_pro_link.d.ts.map +1 -0
- package/dist/contracts/party_pro_link/party_pro_link.js +289 -0
- package/dist/contracts/party_pro_link/party_pro_link.js.map +1 -0
- package/dist/contracts/party_profile/deps/country_code/country_code.d.ts +15 -0
- package/dist/contracts/party_profile/deps/country_code/country_code.d.ts.map +1 -0
- package/dist/contracts/party_profile/deps/country_code/country_code.js +17 -0
- package/dist/contracts/party_profile/deps/country_code/country_code.js.map +1 -0
- package/dist/contracts/party_profile/deps/language_code/language_code.d.ts +6 -0
- package/dist/contracts/party_profile/deps/language_code/language_code.d.ts.map +1 -0
- package/dist/contracts/party_profile/deps/language_code/language_code.js +8 -0
- package/dist/contracts/party_profile/deps/language_code/language_code.js.map +1 -0
- package/dist/contracts/party_profile/party_profile.d.ts +133 -0
- package/dist/contracts/party_profile/party_profile.d.ts.map +1 -0
- package/dist/contracts/party_profile/party_profile.js +153 -0
- package/dist/contracts/party_profile/party_profile.js.map +1 -0
- package/dist/contracts/party_roles/party_roles.d.ts +201 -0
- package/dist/contracts/party_roles/party_roles.d.ts.map +1 -0
- package/dist/contracts/party_roles/party_roles.js +237 -0
- package/dist/contracts/party_roles/party_roles.js.map +1 -0
- package/dist/contracts/party_social/party_social.d.ts +258 -0
- package/dist/contracts/party_social/party_social.d.ts.map +1 -0
- package/dist/contracts/party_social/party_social.js +320 -0
- package/dist/contracts/party_social/party_social.js.map +1 -0
- package/dist/contracts/party_tags/party_tags.d.ts +116 -0
- package/dist/contracts/party_tags/party_tags.d.ts.map +1 -0
- package/dist/contracts/party_tags/party_tags.js +130 -0
- package/dist/contracts/party_tags/party_tags.js.map +1 -0
- package/dist/contracts/routed_stake/routed_stake.d.ts +0 -14
- package/dist/contracts/routed_stake/routed_stake.d.ts.map +1 -1
- package/dist/contracts/routed_stake/routed_stake.js +0 -14
- package/dist/contracts/routed_stake/routed_stake.js.map +1 -1
- package/dist/contracts/royalty_pool/pool.d.ts +0 -14
- package/dist/contracts/royalty_pool/pool.d.ts.map +1 -1
- package/dist/contracts/royalty_pool/pool.js +0 -14
- package/dist/contracts/royalty_pool/pool.js.map +1 -1
- package/dist/contracts/royalty_pool/stake.d.ts +0 -13
- package/dist/contracts/royalty_pool/stake.d.ts.map +1 -1
- package/dist/contracts/royalty_pool/stake.js +0 -14
- package/dist/contracts/royalty_pool/stake.js.map +1 -1
- package/dist/contracts.d.ts +13 -2
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +14 -2
- package/dist/contracts.js.map +1 -1
- package/dist/deployments.d.ts +2 -2
- package/dist/deployments.d.ts.map +1 -1
- package/dist/deployments.js +16 -3
- package/dist/deployments.js.map +1 -1
- package/dist/events.d.ts +0 -14
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +0 -4
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/packages.d.ts +39 -4
- package/dist/packages.d.ts.map +1 -1
- package/dist/packages.js +39 -4
- package/dist/packages.js.map +1 -1
- package/dist/party/client.d.ts +233 -0
- package/dist/party/client.d.ts.map +1 -0
- package/dist/party/client.js +222 -0
- package/dist/party/client.js.map +1 -0
- package/dist/party/extensions/ctas.d.ts +19 -0
- package/dist/party/extensions/ctas.d.ts.map +1 -0
- package/dist/party/extensions/ctas.js +25 -0
- package/dist/party/extensions/ctas.js.map +1 -0
- package/dist/party/extensions/genres.d.ts +27 -0
- package/dist/party/extensions/genres.d.ts.map +1 -0
- package/dist/party/extensions/genres.js +31 -0
- package/dist/party/extensions/genres.js.map +1 -0
- package/dist/party/extensions/links.d.ts +65 -0
- package/dist/party/extensions/links.d.ts.map +1 -0
- package/dist/party/extensions/links.js +117 -0
- package/dist/party/extensions/links.js.map +1 -0
- package/dist/party/extensions/media.d.ts +36 -0
- package/dist/party/extensions/media.d.ts.map +1 -0
- package/dist/party/extensions/media.js +45 -0
- package/dist/party/extensions/media.js.map +1 -0
- package/dist/party/extensions/profile.d.ts +24 -0
- package/dist/party/extensions/profile.d.ts.map +1 -0
- package/dist/party/extensions/profile.js +48 -0
- package/dist/party/extensions/profile.js.map +1 -0
- package/dist/party/extensions/roles.d.ts +37 -0
- package/dist/party/extensions/roles.d.ts.map +1 -0
- package/dist/party/extensions/roles.js +46 -0
- package/dist/party/extensions/roles.js.map +1 -0
- package/dist/party/extensions/tags.d.ts +25 -0
- package/dist/party/extensions/tags.d.ts.map +1 -0
- package/dist/party/extensions/tags.js +25 -0
- package/dist/party/extensions/tags.js.map +1 -0
- package/dist/party/index.d.ts +12 -0
- package/dist/party/index.d.ts.map +1 -0
- package/dist/party/index.js +14 -0
- package/dist/party/index.js.map +1 -0
- package/dist/party/internal.d.ts +15 -0
- package/dist/party/internal.d.ts.map +1 -0
- package/dist/party/internal.js +103 -0
- package/dist/party/internal.js.map +1 -0
- package/dist/party/queries.d.ts +38 -0
- package/dist/party/queries.d.ts.map +1 -0
- package/dist/party/queries.js +232 -0
- package/dist/party/queries.js.map +1 -0
- package/dist/party/transactions.d.ts +74 -0
- package/dist/party/transactions.d.ts.map +1 -0
- package/dist/party/transactions.js +85 -0
- package/dist/party/transactions.js.map +1 -0
- package/dist/party/types.d.ts +54 -0
- package/dist/party/types.d.ts.map +1 -0
- package/dist/party/types.js +4 -0
- package/dist/party/types.js.map +1 -0
- package/package.json +6 -2
- package/src/client.ts +16 -0
- package/src/contracts/miso/composition.ts +0 -27
- package/src/contracts/miso/recording.ts +0 -28
- package/src/contracts/miso/release.ts +0 -23
- package/src/contracts/miso_party/deps/sui/vec_set.ts +21 -0
- package/src/contracts/miso_party/party.ts +797 -0
- package/src/contracts/party_cta/party_cta.ts +212 -0
- package/src/contracts/party_genre/party_genre.ts +199 -0
- package/src/contracts/party_media/party_media.ts +141 -0
- package/src/contracts/party_music/party_music.ts +405 -0
- package/src/contracts/party_platform_link/party_platform_link.ts +148 -0
- package/src/contracts/party_pro_link/party_pro_link.ts +453 -0
- package/src/contracts/party_profile/deps/country_code/country_code.ts +19 -0
- package/src/contracts/party_profile/deps/language_code/language_code.ts +7 -0
- package/src/contracts/party_profile/party_profile.ts +239 -0
- package/src/contracts/party_roles/party_roles.ts +363 -0
- package/src/contracts/party_social/party_social.ts +502 -0
- package/src/contracts/party_tags/party_tags.ts +198 -0
- package/src/contracts/routed_stake/routed_stake.ts +0 -27
- package/src/contracts/royalty_pool/pool.ts +0 -27
- package/src/contracts/royalty_pool/stake.ts +0 -26
- package/src/contracts.ts +15 -2
- package/src/deployments.ts +18 -3
- package/src/events.ts +0 -4
- package/src/index.ts +2 -0
- package/src/packages.ts +40 -8
- package/src/party/client.ts +283 -0
- package/src/party/extensions/ctas.ts +46 -0
- package/src/party/extensions/genres.ts +62 -0
- package/src/party/extensions/links.ts +185 -0
- package/src/party/extensions/media.ts +72 -0
- package/src/party/extensions/profile.ts +81 -0
- package/src/party/extensions/roles.ts +94 -0
- package/src/party/extensions/tags.ts +54 -0
- package/src/party/index.ts +14 -0
- package/src/party/internal.ts +119 -0
- package/src/party/queries.ts +303 -0
- package/src/party/transactions.ts +167 -0
- package/src/party/types.ts +95 -0
- package/dist/contracts/release_snapshot_bundle/deps/ori/walrus_data.d.ts +0 -52
- package/dist/contracts/release_snapshot_bundle/deps/ori/walrus_data.d.ts.map +0 -1
- package/dist/contracts/release_snapshot_bundle/deps/ori/walrus_data.js +0 -37
- package/dist/contracts/release_snapshot_bundle/deps/ori/walrus_data.js.map +0 -1
- package/dist/contracts/release_snapshot_bundle/release_snapshot_bundle.d.ts +0 -91
- package/dist/contracts/release_snapshot_bundle/release_snapshot_bundle.d.ts.map +0 -1
- package/dist/contracts/release_snapshot_bundle/release_snapshot_bundle.js +0 -91
- package/dist/contracts/release_snapshot_bundle/release_snapshot_bundle.js.map +0 -1
- package/src/contracts/release_snapshot_bundle/deps/ori/walrus_data.ts +0 -36
- package/src/contracts/release_snapshot_bundle/release_snapshot_bundle.ts +0 -124
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// The `party_genre` extension: a set of `genre::Genre` object ids tagged on a
|
|
5
|
+
// party. `add_genre` takes a `&Genre` vocabulary object (proving the id is a real
|
|
6
|
+
// entry), so the builder passes `tx.object(genreId)`; removal is by id.
|
|
7
|
+
|
|
8
|
+
import * as genreMod from "../../contracts/party_genre/party_genre.ts";
|
|
9
|
+
import type { TxThunk } from "../transactions.ts";
|
|
10
|
+
|
|
11
|
+
export interface AddGenreParams {
|
|
12
|
+
partyId: string;
|
|
13
|
+
capId: string;
|
|
14
|
+
/** The `genre::Genre` vocabulary object id to tag. */
|
|
15
|
+
genreId: string;
|
|
16
|
+
partyGenrePackageId: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Tags a genre on the party. Aborts on-chain if already present or the max is reached. */
|
|
20
|
+
export function addGenre(params: AddGenreParams): TxThunk {
|
|
21
|
+
return (tx) => {
|
|
22
|
+
tx.add(
|
|
23
|
+
genreMod.addGenre({
|
|
24
|
+
package: params.partyGenrePackageId,
|
|
25
|
+
arguments: [params.partyId, params.capId, tx.object(params.genreId)],
|
|
26
|
+
}),
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RemoveGenreParams {
|
|
32
|
+
partyId: string;
|
|
33
|
+
capId: string;
|
|
34
|
+
/** The genre id to untag. */
|
|
35
|
+
genreId: string;
|
|
36
|
+
partyGenrePackageId: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Untags a genre from the party. Aborts on-chain if not present. */
|
|
40
|
+
export function removeGenre(params: RemoveGenreParams): TxThunk {
|
|
41
|
+
return (tx) => {
|
|
42
|
+
tx.add(
|
|
43
|
+
genreMod.removeGenre({
|
|
44
|
+
package: params.partyGenrePackageId,
|
|
45
|
+
arguments: [params.partyId, params.capId, params.genreId],
|
|
46
|
+
}),
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface ClearGenresParams {
|
|
52
|
+
partyId: string;
|
|
53
|
+
capId: string;
|
|
54
|
+
partyGenrePackageId: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Removes the party's entire genre set. No-op on-chain if none is set. */
|
|
58
|
+
export function clearGenres(params: ClearGenresParams): TxThunk {
|
|
59
|
+
return (tx) => {
|
|
60
|
+
tx.add(genreMod.clearGenres({ package: params.partyGenrePackageId, arguments: [params.partyId, params.capId] }));
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// The platform-link facade: attaches one independent `PlatformLink<Data>` per
|
|
5
|
+
// platform to a party via `party_platform_link`. The payload `Data` types live in
|
|
6
|
+
// their own packages (`party_social`, `party_music`, `party_pro_link`); this file
|
|
7
|
+
// drives all ~27 platforms from a single table (`PLATFORMS`) rather than 27×
|
|
8
|
+
// copy-paste. Each setter builds the link via the platform's constructor move-call
|
|
9
|
+
// (returning a `PlatformLink<…Data>`), then calls `set_link` with the matching
|
|
10
|
+
// `Data` type argument; clearers call `clear_link` with the same type argument.
|
|
11
|
+
// Only the native identifier is stored on-chain; the public URL is rebuilt from it.
|
|
12
|
+
|
|
13
|
+
import * as platformLinkMod from "../../contracts/party_platform_link/party_platform_link.ts";
|
|
14
|
+
import type { TxThunk } from "../transactions.ts";
|
|
15
|
+
import type { PlatformKey, PlatformLink } from "../types.ts";
|
|
16
|
+
|
|
17
|
+
/** Which payload package a platform's `Data` type + constructor live in. */
|
|
18
|
+
type PayloadPkgKind = "social" | "music" | "pro";
|
|
19
|
+
|
|
20
|
+
/** Everything needed to build, store, and rebuild one platform's link. */
|
|
21
|
+
export interface PlatformSpec {
|
|
22
|
+
key: PlatformKey;
|
|
23
|
+
/** Payload package the `Data` type + constructor live in. */
|
|
24
|
+
pkgKind: PayloadPkgKind;
|
|
25
|
+
/** Move module holding the constructor + `Data` type. */
|
|
26
|
+
module: "party_social" | "party_music" | "party_pro_link";
|
|
27
|
+
/** Constructor function (snake_case) — takes a single `String`, returns `PlatformLink<Data>`. */
|
|
28
|
+
ctor: string;
|
|
29
|
+
/** The `Data` type name (e.g. `InstagramData`). */
|
|
30
|
+
dataType: string;
|
|
31
|
+
/** Rebuilds the public URL from the stored native identifier. */
|
|
32
|
+
url: (value: string) => string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Every platform this SDK can link, keyed by `PlatformKey`. The single source of
|
|
37
|
+
* truth: setters, clearers, and the read-side URL/type mapping all derive from it.
|
|
38
|
+
*/
|
|
39
|
+
export const PLATFORMS: Record<PlatformKey, PlatformSpec> = {
|
|
40
|
+
// === Social (party_social) ===
|
|
41
|
+
x: { key: "x", pkgKind: "social", module: "party_social", ctor: "x", dataType: "XData", url: (v) => `https://x.com/${v}` },
|
|
42
|
+
instagram: { key: "instagram", pkgKind: "social", module: "party_social", ctor: "instagram", dataType: "InstagramData", url: (v) => `https://instagram.com/${v}` },
|
|
43
|
+
threads: { key: "threads", pkgKind: "social", module: "party_social", ctor: "threads", dataType: "ThreadsData", url: (v) => `https://www.threads.net/@${v}` },
|
|
44
|
+
tiktok: { key: "tiktok", pkgKind: "social", module: "party_social", ctor: "tiktok", dataType: "TikTokData", url: (v) => `https://www.tiktok.com/@${v}` },
|
|
45
|
+
youtube: { key: "youtube", pkgKind: "social", module: "party_social", ctor: "youtube", dataType: "YouTubeData", url: (v) => `https://youtube.com/@${v}` },
|
|
46
|
+
discord: { key: "discord", pkgKind: "social", module: "party_social", ctor: "discord", dataType: "DiscordData", url: (v) => `https://discord.gg/${v}` },
|
|
47
|
+
telegram: { key: "telegram", pkgKind: "social", module: "party_social", ctor: "telegram", dataType: "TelegramData", url: (v) => `https://t.me/${v}` },
|
|
48
|
+
reddit: { key: "reddit", pkgKind: "social", module: "party_social", ctor: "reddit", dataType: "RedditData", url: (v) => `https://reddit.com/user/${v}` },
|
|
49
|
+
twitch: { key: "twitch", pkgKind: "social", module: "party_social", ctor: "twitch", dataType: "TwitchData", url: (v) => `https://twitch.tv/${v}` },
|
|
50
|
+
facebook: { key: "facebook", pkgKind: "social", module: "party_social", ctor: "facebook", dataType: "FacebookData", url: (v) => `https://facebook.com/${v}` },
|
|
51
|
+
// === Music (party_music) ===
|
|
52
|
+
spotify: { key: "spotify", pkgKind: "music", module: "party_music", ctor: "spotify", dataType: "SpotifyData", url: (v) => `https://open.spotify.com/artist/${v}` },
|
|
53
|
+
bandcamp: { key: "bandcamp", pkgKind: "music", module: "party_music", ctor: "bandcamp", dataType: "BandcampData", url: (v) => `https://${v}.bandcamp.com` },
|
|
54
|
+
soundcloud: { key: "soundcloud", pkgKind: "music", module: "party_music", ctor: "soundcloud", dataType: "SoundCloudData", url: (v) => `https://soundcloud.com/${v}` },
|
|
55
|
+
appleMusic: { key: "appleMusic", pkgKind: "music", module: "party_music", ctor: "apple_music", dataType: "AppleMusicData", url: (v) => `https://music.apple.com/artist/${v}` },
|
|
56
|
+
deezer: { key: "deezer", pkgKind: "music", module: "party_music", ctor: "deezer", dataType: "DeezerData", url: (v) => `https://www.deezer.com/artist/${v}` },
|
|
57
|
+
tidal: { key: "tidal", pkgKind: "music", module: "party_music", ctor: "tidal", dataType: "TidalData", url: (v) => `https://tidal.com/artist/${v}` },
|
|
58
|
+
amazonMusic: { key: "amazonMusic", pkgKind: "music", module: "party_music", ctor: "amazon_music", dataType: "AmazonMusicData", url: (v) => `https://music.amazon.com/artists/${v}` },
|
|
59
|
+
audiomack: { key: "audiomack", pkgKind: "music", module: "party_music", ctor: "audiomack", dataType: "AudiomackData", url: (v) => `https://audiomack.com/${v}` },
|
|
60
|
+
// === Professional / industry (party_pro_link). URL-based payloads store a full URL. ===
|
|
61
|
+
website: { key: "website", pkgKind: "pro", module: "party_pro_link", ctor: "website", dataType: "WebsiteData", url: (v) => v },
|
|
62
|
+
bookingPage: { key: "bookingPage", pkgKind: "pro", module: "party_pro_link", ctor: "booking_page", dataType: "BookingPageData", url: (v) => v },
|
|
63
|
+
managementPage: { key: "managementPage", pkgKind: "pro", module: "party_pro_link", ctor: "management_page", dataType: "ManagementPageData", url: (v) => v },
|
|
64
|
+
publisherPage: { key: "publisherPage", pkgKind: "pro", module: "party_pro_link", ctor: "publisher_page", dataType: "PublisherPageData", url: (v) => v },
|
|
65
|
+
labelPage: { key: "labelPage", pkgKind: "pro", module: "party_pro_link", ctor: "label_page", dataType: "LabelPageData", url: (v) => v },
|
|
66
|
+
epk: { key: "epk", pkgKind: "pro", module: "party_pro_link", ctor: "epk", dataType: "EpkData", url: (v) => v },
|
|
67
|
+
patreon: { key: "patreon", pkgKind: "pro", module: "party_pro_link", ctor: "patreon", dataType: "PatreonData", url: (v) => `https://patreon.com/${v}` },
|
|
68
|
+
substack: { key: "substack", pkgKind: "pro", module: "party_pro_link", ctor: "substack", dataType: "SubstackData", url: (v) => `https://${v}.substack.com` },
|
|
69
|
+
kofi: { key: "kofi", pkgKind: "pro", module: "party_pro_link", ctor: "kofi", dataType: "KofiData", url: (v) => `https://ko-fi.com/${v}` },
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/** All platform keys, in table order. */
|
|
73
|
+
export const PLATFORM_KEYS = Object.keys(PLATFORMS) as PlatformKey[];
|
|
74
|
+
|
|
75
|
+
/** The package ids the platform-link facade binds (the facade + the three payload packages). */
|
|
76
|
+
export interface LinkPackageIds {
|
|
77
|
+
partyPlatformLinkPackageId: string;
|
|
78
|
+
partySocialPackageId: string;
|
|
79
|
+
partyMusicPackageId: string;
|
|
80
|
+
partyProLinkPackageId: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function payloadPackageId(spec: PlatformSpec, ids: LinkPackageIds): string {
|
|
84
|
+
switch (spec.pkgKind) {
|
|
85
|
+
case "social":
|
|
86
|
+
return ids.partySocialPackageId;
|
|
87
|
+
case "music":
|
|
88
|
+
return ids.partyMusicPackageId;
|
|
89
|
+
case "pro":
|
|
90
|
+
return ids.partyProLinkPackageId;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** The fully-qualified Move `Data` type for a platform (e.g. `0x…::party_social::InstagramData`). */
|
|
95
|
+
function dataTypeArg(spec: PlatformSpec, ids: LinkPackageIds): string {
|
|
96
|
+
return `${payloadPackageId(spec, ids)}::${spec.module}::${spec.dataType}`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface SetLinkParams extends LinkPackageIds {
|
|
100
|
+
partyId: string;
|
|
101
|
+
capId: string;
|
|
102
|
+
/** The platform-native identifier to store (handle / id / subdomain / full URL). */
|
|
103
|
+
value: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Sets (or replaces) a platform's link on the party. */
|
|
107
|
+
export function setLink(platform: PlatformKey, params: SetLinkParams): TxThunk {
|
|
108
|
+
return (tx) => {
|
|
109
|
+
const spec = PLATFORMS[platform];
|
|
110
|
+
const pkg = payloadPackageId(spec, params);
|
|
111
|
+
const link = tx.moveCall({
|
|
112
|
+
target: `${pkg}::${spec.module}::${spec.ctor}`,
|
|
113
|
+
arguments: [tx.pure.string(params.value)],
|
|
114
|
+
});
|
|
115
|
+
tx.add(
|
|
116
|
+
platformLinkMod.setLink({
|
|
117
|
+
package: params.partyPlatformLinkPackageId,
|
|
118
|
+
typeArguments: [dataTypeArg(spec, params)],
|
|
119
|
+
arguments: [params.partyId, params.capId, link],
|
|
120
|
+
}),
|
|
121
|
+
);
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface ClearLinkParams extends LinkPackageIds {
|
|
126
|
+
partyId: string;
|
|
127
|
+
capId: string;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Clears a platform's link from the party. No-op on-chain if unset. */
|
|
131
|
+
export function clearLink(platform: PlatformKey, params: ClearLinkParams): TxThunk {
|
|
132
|
+
return (tx) => {
|
|
133
|
+
const spec = PLATFORMS[platform];
|
|
134
|
+
tx.add(
|
|
135
|
+
platformLinkMod.clearLink({
|
|
136
|
+
package: params.partyPlatformLinkPackageId,
|
|
137
|
+
typeArguments: [dataTypeArg(spec, params)],
|
|
138
|
+
arguments: [params.partyId, params.capId],
|
|
139
|
+
}),
|
|
140
|
+
);
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// === Read helpers ===
|
|
145
|
+
|
|
146
|
+
// The Move `Data` type suffix (`<module>::<dataType>`) → platform key. The package
|
|
147
|
+
// id prefix varies, so match on the last two `::` segments (unique across the table).
|
|
148
|
+
const BY_MOVE_TYPE: Record<string, PlatformKey> = Object.fromEntries(
|
|
149
|
+
PLATFORM_KEYS.map((k) => [`${PLATFORMS[k].module}::${PLATFORMS[k].dataType}`, k]),
|
|
150
|
+
) as Record<string, PlatformKey>;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* The platform for a fully-qualified `Data` type argument, or null if unknown.
|
|
154
|
+
* @param dataType e.g. `0x…::party_social::InstagramData`.
|
|
155
|
+
*/
|
|
156
|
+
export function platformForDataType(dataType: string): PlatformKey | null {
|
|
157
|
+
const suffix = dataType.split("::").slice(-2).join("::");
|
|
158
|
+
return BY_MOVE_TYPE[suffix] ?? null;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Builds a public `PlatformLink` from a platform key and its stored native identifier. */
|
|
162
|
+
export function buildLink(platform: PlatformKey, value: string): PlatformLink {
|
|
163
|
+
return { platform, value, url: PLATFORMS[platform].url(value) };
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// === Bound builders (the client binds package ids, then exposes per-platform methods) ===
|
|
167
|
+
|
|
168
|
+
export type BoundSetLinkParams = Omit<SetLinkParams, keyof LinkPackageIds>;
|
|
169
|
+
export type BoundClearLinkParams = Omit<ClearLinkParams, keyof LinkPackageIds>;
|
|
170
|
+
|
|
171
|
+
/** Per-platform `setX` / `clearX` builders, keyed off the table so all ~27 are covered. */
|
|
172
|
+
export type LinkTxBuilders =
|
|
173
|
+
& { [K in PlatformKey as `set${Capitalize<K>}`]: (p: BoundSetLinkParams) => TxThunk }
|
|
174
|
+
& { [K in PlatformKey as `clear${Capitalize<K>}`]: (p: BoundClearLinkParams) => TxThunk };
|
|
175
|
+
|
|
176
|
+
/** Builds the per-platform link tx builders with `ids` pre-bound. */
|
|
177
|
+
export function linkTxBuilders(ids: LinkPackageIds): LinkTxBuilders {
|
|
178
|
+
const out: Record<string, unknown> = {};
|
|
179
|
+
for (const key of PLATFORM_KEYS) {
|
|
180
|
+
const cap = key.charAt(0).toUpperCase() + key.slice(1);
|
|
181
|
+
out[`set${cap}`] = (p: BoundSetLinkParams): TxThunk => setLink(key, { ...p, ...ids });
|
|
182
|
+
out[`clear${cap}`] = (p: BoundClearLinkParams): TxThunk => clearLink(key, { ...p, ...ids });
|
|
183
|
+
}
|
|
184
|
+
return out as LinkTxBuilders;
|
|
185
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// The `party_media` extension: a party's imagery, stored on-chain as a single
|
|
5
|
+
// Walrus *quilt* id. Individual images are quilt patches addressed by identifier
|
|
6
|
+
// ("avatar", "header", …) — those roles are a client convention, derived here
|
|
7
|
+
// off-chain, never stored on-chain. The write builder takes the quilt's base64url
|
|
8
|
+
// blob id (what `walrus store-quilt` prints) and converts it to the on-chain
|
|
9
|
+
// u256; the read helpers build aggregator URLs per identifier.
|
|
10
|
+
|
|
11
|
+
import { b64UrlToU256 } from "../internal.ts";
|
|
12
|
+
import * as mediaMod from "../../contracts/party_media/party_media.ts";
|
|
13
|
+
import type { TxThunk } from "../transactions.ts";
|
|
14
|
+
import type { Media } from "../types.ts";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Quilt patch identifiers party media uses, in role order. Uploaders store images
|
|
18
|
+
* under these identifiers; readers fetch by them. This is the whole "meaning" the
|
|
19
|
+
* chain defers to the client.
|
|
20
|
+
*/
|
|
21
|
+
export const MEDIA_IDENTIFIERS = { avatar: "avatar", header: "header" } as const;
|
|
22
|
+
export type MediaIdentifier = (typeof MEDIA_IDENTIFIERS)[keyof typeof MEDIA_IDENTIFIERS];
|
|
23
|
+
|
|
24
|
+
export interface SetMediaParams {
|
|
25
|
+
partyId: string;
|
|
26
|
+
capId: string;
|
|
27
|
+
/** Walrus quilt blob id (base64url), e.g. from `walrus store-quilt`. */
|
|
28
|
+
quiltId: string;
|
|
29
|
+
partyMediaPackageId: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Sets (or replaces) the party's media quilt. */
|
|
33
|
+
export function setMedia(params: SetMediaParams): TxThunk {
|
|
34
|
+
return (tx) => {
|
|
35
|
+
tx.add(
|
|
36
|
+
mediaMod.setMedia({
|
|
37
|
+
package: params.partyMediaPackageId,
|
|
38
|
+
arguments: [params.partyId, params.capId, BigInt(b64UrlToU256(params.quiltId))],
|
|
39
|
+
}),
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface ClearMediaParams {
|
|
45
|
+
partyId: string;
|
|
46
|
+
capId: string;
|
|
47
|
+
partyMediaPackageId: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Removes the party's media entirely. No-op on-chain if none is set. */
|
|
51
|
+
export function clearMedia(params: ClearMediaParams): TxThunk {
|
|
52
|
+
return (tx) => {
|
|
53
|
+
tx.add(mediaMod.clearMedia({ package: params.partyMediaPackageId, arguments: [params.partyId, params.capId] }));
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Aggregator URL for one image in a party's quilt, addressed by identifier. */
|
|
58
|
+
export function mediaImageUrl(aggregatorUrl: string, quiltId: string, identifier: string): string {
|
|
59
|
+
return `${aggregatorUrl.replace(/\/$/, "")}/v1/blobs/by-quilt-id/${quiltId}/${identifier}`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The avatar + header image URLs for a party's media, or null if unset. */
|
|
63
|
+
export function mediaUrls(
|
|
64
|
+
aggregatorUrl: string,
|
|
65
|
+
media: Media | null,
|
|
66
|
+
): { avatar: string; header: string } | null {
|
|
67
|
+
if (!media) return null;
|
|
68
|
+
return {
|
|
69
|
+
avatar: mediaImageUrl(aggregatorUrl, media.quiltId, MEDIA_IDENTIFIERS.avatar),
|
|
70
|
+
header: mediaImageUrl(aggregatorUrl, media.quiltId, MEDIA_IDENTIFIERS.header),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// The `party_profile` extension: an editable identity card attached to a Party.
|
|
5
|
+
// The builders hide the Option/vector plumbing and construct the validated
|
|
6
|
+
// `CountryCode` / `LanguageCode` values from raw ISO codes.
|
|
7
|
+
|
|
8
|
+
import * as profileMod from "../../contracts/party_profile/party_profile.ts";
|
|
9
|
+
import type { TxThunk } from "../transactions.ts";
|
|
10
|
+
|
|
11
|
+
const OPTION_NONE = "0x1::option::none";
|
|
12
|
+
const OPTION_SOME = "0x1::option::some";
|
|
13
|
+
|
|
14
|
+
export interface SetProfileParams {
|
|
15
|
+
partyId: string;
|
|
16
|
+
capId: string;
|
|
17
|
+
bioShort: string;
|
|
18
|
+
bioLong?: string;
|
|
19
|
+
/** ISO 3166-1 alpha-2 country code, e.g. "GB". */
|
|
20
|
+
country?: string;
|
|
21
|
+
/** ISO 639-1 language codes, e.g. ["en", "ja"]. */
|
|
22
|
+
languages?: string[];
|
|
23
|
+
partyProfilePackageId: string;
|
|
24
|
+
countryCodePackageId: string;
|
|
25
|
+
languageCodePackageId: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Sets (creates or replaces) a party's whole profile. */
|
|
29
|
+
export function setProfile(params: SetProfileParams): TxThunk {
|
|
30
|
+
return (tx) => {
|
|
31
|
+
const ccType = `${params.countryCodePackageId}::country_code::CountryCode`;
|
|
32
|
+
const country = params.country
|
|
33
|
+
? tx.moveCall({
|
|
34
|
+
target: OPTION_SOME,
|
|
35
|
+
typeArguments: [ccType],
|
|
36
|
+
arguments: [
|
|
37
|
+
tx.moveCall({
|
|
38
|
+
target: `${params.countryCodePackageId}::country_code::new`,
|
|
39
|
+
arguments: [tx.pure.string(params.country)],
|
|
40
|
+
}),
|
|
41
|
+
],
|
|
42
|
+
})
|
|
43
|
+
: tx.moveCall({ target: OPTION_NONE, typeArguments: [ccType], arguments: [] });
|
|
44
|
+
|
|
45
|
+
const lcType = `${params.languageCodePackageId}::language_code::LanguageCode`;
|
|
46
|
+
const languages = tx.makeMoveVec({
|
|
47
|
+
type: lcType,
|
|
48
|
+
elements: (params.languages ?? []).map((code) =>
|
|
49
|
+
tx.moveCall({
|
|
50
|
+
target: `${params.languageCodePackageId}::language_code::new`,
|
|
51
|
+
arguments: [tx.pure.string(code)],
|
|
52
|
+
}),
|
|
53
|
+
),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
tx.add(
|
|
57
|
+
profileMod.setProfile({
|
|
58
|
+
package: params.partyProfilePackageId,
|
|
59
|
+
arguments: [params.partyId, params.capId, params.bioShort, params.bioLong ?? null, country, languages],
|
|
60
|
+
}),
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface ClearProfileParams {
|
|
66
|
+
partyId: string;
|
|
67
|
+
capId: string;
|
|
68
|
+
partyProfilePackageId: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Removes a party's profile. No-op on-chain if none is set. */
|
|
72
|
+
export function clearProfile(params: ClearProfileParams): TxThunk {
|
|
73
|
+
return (tx) => {
|
|
74
|
+
tx.add(
|
|
75
|
+
profileMod.clearProfile({
|
|
76
|
+
package: params.partyProfilePackageId,
|
|
77
|
+
arguments: [params.partyId, params.capId],
|
|
78
|
+
}),
|
|
79
|
+
);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// The `party_roles` extension: the artist-type roles a party holds (artist,
|
|
5
|
+
// producer, DJ, …), a `VecSet<ArtistRole>` on the party. Roles are a closed enum
|
|
6
|
+
// with a `Custom(String)` escape hatch; the builders construct the right
|
|
7
|
+
// `ArtistRole` value via its constructor move-call, then add/remove it.
|
|
8
|
+
|
|
9
|
+
import * as rolesMod from "../../contracts/party_roles/party_roles.ts";
|
|
10
|
+
import type { TxThunk } from "../transactions.ts";
|
|
11
|
+
|
|
12
|
+
/** The canonical role variants (a fixed, typo-free set the frontend can render). */
|
|
13
|
+
export type CanonicalRole =
|
|
14
|
+
| "artist"
|
|
15
|
+
| "producer"
|
|
16
|
+
| "dj"
|
|
17
|
+
| "composer"
|
|
18
|
+
| "songwriter"
|
|
19
|
+
| "band"
|
|
20
|
+
| "label"
|
|
21
|
+
| "collective";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A role to add/remove: a canonical variant, or a user-defined `custom` name.
|
|
25
|
+
* Prefer a canonical variant when one fits.
|
|
26
|
+
*/
|
|
27
|
+
export type Role = { kind: CanonicalRole } | { kind: "custom"; name: string };
|
|
28
|
+
|
|
29
|
+
// Canonical `kind` → the generated constructor function name (all take no args).
|
|
30
|
+
const CANONICAL_CTORS = {
|
|
31
|
+
artist: rolesMod.artist,
|
|
32
|
+
producer: rolesMod.producer,
|
|
33
|
+
dj: rolesMod.dj,
|
|
34
|
+
composer: rolesMod.composer,
|
|
35
|
+
songwriter: rolesMod.songwriter,
|
|
36
|
+
band: rolesMod.band,
|
|
37
|
+
label: rolesMod.label,
|
|
38
|
+
collective: rolesMod.collective,
|
|
39
|
+
} as const;
|
|
40
|
+
|
|
41
|
+
/** Builds the `ArtistRole` value for a role via its constructor move-call. */
|
|
42
|
+
function buildRole(tx: Parameters<TxThunk>[0], role: Role, pkg: string) {
|
|
43
|
+
if (role.kind === "custom") {
|
|
44
|
+
return tx.add(rolesMod.custom({ package: pkg, arguments: [role.name] }));
|
|
45
|
+
}
|
|
46
|
+
return tx.add(CANONICAL_CTORS[role.kind]({ package: pkg }));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface AddRoleParams {
|
|
50
|
+
partyId: string;
|
|
51
|
+
capId: string;
|
|
52
|
+
role: Role;
|
|
53
|
+
partyRolesPackageId: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Adds a role to the party. Aborts on-chain if already held or the max is reached. */
|
|
57
|
+
export function addRole(params: AddRoleParams): TxThunk {
|
|
58
|
+
return (tx) => {
|
|
59
|
+
const role = buildRole(tx, params.role, params.partyRolesPackageId);
|
|
60
|
+
tx.add(
|
|
61
|
+
rolesMod.addRole({ package: params.partyRolesPackageId, arguments: [params.partyId, params.capId, role] }),
|
|
62
|
+
);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface RemoveRoleParams {
|
|
67
|
+
partyId: string;
|
|
68
|
+
capId: string;
|
|
69
|
+
role: Role;
|
|
70
|
+
partyRolesPackageId: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Removes a role from the party. Aborts on-chain if not held. */
|
|
74
|
+
export function removeRole(params: RemoveRoleParams): TxThunk {
|
|
75
|
+
return (tx) => {
|
|
76
|
+
const role = buildRole(tx, params.role, params.partyRolesPackageId);
|
|
77
|
+
tx.add(
|
|
78
|
+
rolesMod.removeRole({ package: params.partyRolesPackageId, arguments: [params.partyId, params.capId, role] }),
|
|
79
|
+
);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface ClearRolesParams {
|
|
84
|
+
partyId: string;
|
|
85
|
+
capId: string;
|
|
86
|
+
partyRolesPackageId: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Removes the party's entire role set. No-op on-chain if none is set. */
|
|
90
|
+
export function clearRoles(params: ClearRolesParams): TxThunk {
|
|
91
|
+
return (tx) => {
|
|
92
|
+
tx.add(rolesMod.clearRoles({ package: params.partyRolesPackageId, arguments: [params.partyId, params.capId] }));
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// The `party_tags` extension: free-form descriptor tags on a party, a
|
|
5
|
+
// `VecSet<String>`. Tags are stored exactly as given; normalization is a client
|
|
6
|
+
// concern.
|
|
7
|
+
|
|
8
|
+
import * as tagsMod from "../../contracts/party_tags/party_tags.ts";
|
|
9
|
+
import type { TxThunk } from "../transactions.ts";
|
|
10
|
+
|
|
11
|
+
export interface AddTagParams {
|
|
12
|
+
partyId: string;
|
|
13
|
+
capId: string;
|
|
14
|
+
tag: string;
|
|
15
|
+
partyTagsPackageId: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Adds a tag to the party. Aborts on-chain if empty, too long, duplicate, or the max is reached. */
|
|
19
|
+
export function addTag(params: AddTagParams): TxThunk {
|
|
20
|
+
return (tx) => {
|
|
21
|
+
tx.add(
|
|
22
|
+
tagsMod.addTag({ package: params.partyTagsPackageId, arguments: [params.partyId, params.capId, params.tag] }),
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface RemoveTagParams {
|
|
28
|
+
partyId: string;
|
|
29
|
+
capId: string;
|
|
30
|
+
tag: string;
|
|
31
|
+
partyTagsPackageId: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Removes a tag from the party. Aborts on-chain if not present. */
|
|
35
|
+
export function removeTag(params: RemoveTagParams): TxThunk {
|
|
36
|
+
return (tx) => {
|
|
37
|
+
tx.add(
|
|
38
|
+
tagsMod.removeTag({ package: params.partyTagsPackageId, arguments: [params.partyId, params.capId, params.tag] }),
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface ClearTagsParams {
|
|
44
|
+
partyId: string;
|
|
45
|
+
capId: string;
|
|
46
|
+
partyTagsPackageId: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Removes the party's entire tag set. No-op on-chain if none is set. */
|
|
50
|
+
export function clearTags(params: ClearTagsParams): TxThunk {
|
|
51
|
+
return (tx) => {
|
|
52
|
+
tx.add(tagsMod.clearTags({ package: params.partyTagsPackageId, arguments: [params.partyId, params.capId] }));
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Copyright (c) Miso Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
export * from "./types.ts";
|
|
5
|
+
export * from "./transactions.ts";
|
|
6
|
+
export * from "./queries.ts";
|
|
7
|
+
export * from "./client.ts";
|
|
8
|
+
export * from "./extensions/profile.ts";
|
|
9
|
+
export * from "./extensions/media.ts";
|
|
10
|
+
export * from "./extensions/roles.ts";
|
|
11
|
+
export * from "./extensions/tags.ts";
|
|
12
|
+
export * from "./extensions/genres.ts";
|
|
13
|
+
export * from "./extensions/ctas.ts";
|
|
14
|
+
export * from "./extensions/links.ts";
|