diff --git a/actions/deleteLeaflet.ts b/actions/deleteLeaflet.ts index 55534656..d6108def 100644 --- a/actions/deleteLeaflet.ts +++ b/actions/deleteLeaflet.ts @@ -16,6 +16,52 @@ import { supabaseServerClient } from "supabase/serverClient"; export async function deleteLeaflet(permission_token: PermissionToken) { const client = await pool.connect(); const db = drizzle(client); + + // Get the current user's identity + let identity = await getIdentityData(); + + // Check publication and document ownership in one query + let { data: tokenData } = await supabaseServerClient + .from("permission_tokens") + .select(` + id, + leaflets_in_publications(publication, publications!inner(identity_did)), + leaflets_to_documents(document, documents!inner(uri)) + `) + .eq("id", permission_token.id) + .single(); + + if (tokenData) { + // Check if leaflet is in a publication + const leafletInPubs = tokenData.leaflets_in_publications || []; + if (leafletInPubs.length > 0) { + if (!identity) { + throw new Error("Unauthorized: You must be logged in to delete a leaflet in a publication"); + } + const isOwner = leafletInPubs.some( + (pub: any) => pub.publications.identity_did === identity.atp_did + ); + if (!isOwner) { + throw new Error("Unauthorized: You must own the publication to delete this leaflet"); + } + } + + // Check if there's a standalone published document + const leafletDocs = tokenData.leaflets_to_documents || []; + if (leafletDocs.length > 0) { + if (!identity) { + throw new Error("Unauthorized: You must be logged in to delete a published leaflet"); + } + for (let leafletDoc of leafletDocs) { + const docUri = leafletDoc.documents?.uri; + // Extract the DID from the document URI (format: at://did:plc:xxx/...) + if (docUri && !docUri.includes(identity.atp_did)) { + throw new Error("Unauthorized: You must own the published document to delete this leaflet"); + } + } + } + } + await db.transaction(async (tx) => { let [token] = await tx .select() diff --git a/app/(home-pages)/home/LeafletList/LeafletOptions.tsx b/app/(home-pages)/home/LeafletList/LeafletOptions.tsx index 58287b02..2afc85ca 100644 --- a/app/(home-pages)/home/LeafletList/LeafletOptions.tsx +++ b/app/(home-pages)/home/LeafletList/LeafletOptions.tsx @@ -86,9 +86,15 @@ const DefaultOptions = (props: { const pubStatus = useLeafletPublicationStatus(); const toaster = useToaster(); const { setArchived } = useArchiveMutations(); + const { identity } = useIdentityData(); const tokenId = pubStatus?.token.id; const itemType = pubStatus?.draftInPublication ? "Draft" : "Leaflet"; + // Check if this is a published post/document and if user is the owner + const isPublishedPostOwner = + !!identity?.atp_did && !!pubStatus?.documentUri?.includes(identity.atp_did); + const canDelete = !pubStatus?.documentUri || isPublishedPostOwner; + return ( <> @@ -133,12 +139,14 @@ const DefaultOptions = (props: { {!props.archived ? " Archive" : "Unarchive"} {itemType} - { - e.preventDefault(); - props.setState("areYouSure"); - }} - /> + {canDelete && ( + { + e.preventDefault(); + props.setState("areYouSure"); + }} + /> + )} ); }; -- 2.51.2 From 76114016051316cb47c5cc902e0682a127524a17 Mon Sep 17 00:00:00 2001 From: celine Date: Wed, 3 Dec 2025 14:57:51 -0500 Subject: [PATCH 2/8] fixing a big ol oopsie in our pub empty state in the sidebar --- components/ActionBar/Publications.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ActionBar/Publications.tsx b/components/ActionBar/Publications.tsx index 4299146c..304f9ad4 100644 --- a/components/ActionBar/Publications.tsx +++ b/components/ActionBar/Publications.tsx @@ -151,7 +151,7 @@ export const PubListEmptyContent = (props: { compact?: boolean }) => {
Publish on AT Proto
- {identity && !identity.atp_did ? ( + {identity && identity.atp_did ? ( // has ATProto account and no pubs <>
-- 2.51.2 From 35f03066f567871e0088a4972ecf8b60d9189ae7 Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Wed, 3 Dec 2025 18:34:38 -0500 Subject: [PATCH 3/8] fix type error and lint --- actions/deleteLeaflet.ts | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/actions/deleteLeaflet.ts b/actions/deleteLeaflet.ts index d6108def..73c700a2 100644 --- a/actions/deleteLeaflet.ts +++ b/actions/deleteLeaflet.ts @@ -23,11 +23,13 @@ export async function deleteLeaflet(permission_token: PermissionToken) { // Check publication and document ownership in one query let { data: tokenData } = await supabaseServerClient .from("permission_tokens") - .select(` + .select( + ` id, leaflets_in_publications(publication, publications!inner(identity_did)), leaflets_to_documents(document, documents!inner(uri)) - `) + `, + ) .eq("id", permission_token.id) .single(); @@ -36,13 +38,17 @@ export async function deleteLeaflet(permission_token: PermissionToken) { const leafletInPubs = tokenData.leaflets_in_publications || []; if (leafletInPubs.length > 0) { if (!identity) { - throw new Error("Unauthorized: You must be logged in to delete a leaflet in a publication"); + throw new Error( + "Unauthorized: You must be logged in to delete a leaflet in a publication", + ); } const isOwner = leafletInPubs.some( - (pub: any) => pub.publications.identity_did === identity.atp_did + (pub: any) => pub.publications.identity_did === identity.atp_did, ); if (!isOwner) { - throw new Error("Unauthorized: You must own the publication to delete this leaflet"); + throw new Error( + "Unauthorized: You must own the publication to delete this leaflet", + ); } } @@ -50,13 +56,17 @@ export async function deleteLeaflet(permission_token: PermissionToken) { const leafletDocs = tokenData.leaflets_to_documents || []; if (leafletDocs.length > 0) { if (!identity) { - throw new Error("Unauthorized: You must be logged in to delete a published leaflet"); + throw new Error( + "Unauthorized: You must be logged in to delete a published leaflet", + ); } for (let leafletDoc of leafletDocs) { const docUri = leafletDoc.documents?.uri; // Extract the DID from the document URI (format: at://did:plc:xxx/...) - if (docUri && !docUri.includes(identity.atp_did)) { - throw new Error("Unauthorized: You must own the published document to delete this leaflet"); + if (docUri && identity.atp_did && !docUri.includes(identity.atp_did)) { + throw new Error( + "Unauthorized: You must own the published document to delete this leaflet", + ); } } } -- 2.51.2 From 91f9c3d4b76ba18307b98dfc320d34bd75f5a866 Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Wed, 3 Dec 2025 19:55:05 -0500 Subject: [PATCH 4/8] update nextjs --- package-lock.json | 90 ++++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 51 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index d63df567..2cc0b212 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "linkifyjs": "^4.2.0", "luxon": "^3.7.2", "multiformats": "^13.3.2", - "next": "16.0.3", + "next": "^16.0.7", "pg": "^8.16.3", "prosemirror-commands": "^1.5.2", "prosemirror-inputrules": "^1.4.0", @@ -2734,9 +2734,10 @@ } }, "node_modules/@next/env": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.3.tgz", - "integrity": "sha512-IqgtY5Vwsm14mm/nmQaRMmywCU+yyMIYfk3/MHZ2ZTJvwVbBn3usZnjMi1GacrMVzVcAxJShTCpZlPs26EdEjQ==" + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.7.tgz", + "integrity": "sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==", + "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { "version": "16.0.3", @@ -2804,12 +2805,13 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.3.tgz", - "integrity": "sha512-MOnbd92+OByu0p6QBAzq1ahVWzF6nyfiH07dQDez4/Nku7G249NjxDVyEfVhz8WkLiOEU+KFVnqtgcsfP2nLXg==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.7.tgz", + "integrity": "sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2819,12 +2821,13 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.3.tgz", - "integrity": "sha512-i70C4O1VmbTivYdRlk+5lj9xRc2BlK3oUikt3yJeHT1unL4LsNtN7UiOhVanFdc7vDAgZn1tV/9mQwMkWOJvHg==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.7.tgz", + "integrity": "sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2834,12 +2837,13 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.3.tgz", - "integrity": "sha512-O88gCZ95sScwD00mn/AtalyCoykhhlokxH/wi1huFK+rmiP5LAYVs/i2ruk7xST6SuXN4NI5y4Xf5vepb2jf6A==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.7.tgz", + "integrity": "sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2849,12 +2853,13 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.3.tgz", - "integrity": "sha512-CEErFt78S/zYXzFIiv18iQCbRbLgBluS8z1TNDQoyPi8/Jr5qhR3e8XHAIxVxPBjDbEMITprqELVc5KTfFj0gg==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.7.tgz", + "integrity": "sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2864,12 +2869,13 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.3.tgz", - "integrity": "sha512-Tc3i+nwt6mQ+Dwzcri/WNDj56iWdycGVh5YwwklleClzPzz7UpfaMw1ci7bLl6GRYMXhWDBfe707EXNjKtiswQ==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.7.tgz", + "integrity": "sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2879,12 +2885,13 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.3.tgz", - "integrity": "sha512-zTh03Z/5PBBPdTurgEtr6nY0vI9KR9Ifp/jZCcHlODzwVOEKcKRBtQIGrkc7izFgOMuXDEJBmirwpGqdM/ZixA==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.7.tgz", + "integrity": "sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2894,12 +2901,13 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.3.tgz", - "integrity": "sha512-Jc1EHxtZovcJcg5zU43X3tuqzl/sS+CmLgjRP28ZT4vk869Ncm2NoF8qSTaL99gh6uOzgM99Shct06pSO6kA6g==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.7.tgz", + "integrity": "sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -2909,12 +2917,13 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.3.tgz", - "integrity": "sha512-N7EJ6zbxgIYpI/sWNzpVKRMbfEGgsWuOIvzkML7wxAAZhPk1Msxuo/JDu1PKjWGrAoOLaZcIX5s+/pF5LIbBBg==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.7.tgz", + "integrity": "sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -15108,11 +15117,12 @@ } }, "node_modules/next": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/next/-/next-16.0.3.tgz", - "integrity": "sha512-Ka0/iNBblPFcIubTA1Jjh6gvwqfjrGq1Y2MTI5lbjeLIAfmC+p5bQmojpRZqgHHVu5cG4+qdIiwXiBSm/8lZ3w==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.7.tgz", + "integrity": "sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==", + "license": "MIT", "dependencies": { - "@next/env": "16.0.3", + "@next/env": "16.0.7", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -15125,14 +15135,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.0.3", - "@next/swc-darwin-x64": "16.0.3", - "@next/swc-linux-arm64-gnu": "16.0.3", - "@next/swc-linux-arm64-musl": "16.0.3", - "@next/swc-linux-x64-gnu": "16.0.3", - "@next/swc-linux-x64-musl": "16.0.3", - "@next/swc-win32-arm64-msvc": "16.0.3", - "@next/swc-win32-x64-msvc": "16.0.3", + "@next/swc-darwin-arm64": "16.0.7", + "@next/swc-darwin-x64": "16.0.7", + "@next/swc-linux-arm64-gnu": "16.0.7", + "@next/swc-linux-arm64-musl": "16.0.7", + "@next/swc-linux-x64-gnu": "16.0.7", + "@next/swc-linux-x64-musl": "16.0.7", + "@next/swc-win32-arm64-msvc": "16.0.7", + "@next/swc-win32-x64-msvc": "16.0.7", "sharp": "^0.34.4" }, "peerDependencies": { diff --git a/package.json b/package.json index 3a5b8ca4..ef2bc74c 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "linkifyjs": "^4.2.0", "luxon": "^3.7.2", "multiformats": "^13.3.2", - "next": "16.0.3", + "next": "^16.0.7", "pg": "^8.16.3", "prosemirror-commands": "^1.5.2", "prosemirror-inputrules": "^1.4.0", -- 2.51.2 From 989e0e1ea98788bba1573a14c5b1b5acc1d55b7f Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Thu, 4 Dec 2025 16:45:29 -0500 Subject: [PATCH 5/8] add tags index and search function --- .../20251204120000_add_tags_support.sql | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 supabase/migrations/20251204120000_add_tags_support.sql diff --git a/supabase/migrations/20251204120000_add_tags_support.sql b/supabase/migrations/20251204120000_add_tags_support.sql new file mode 100644 index 00000000..2596c674 --- /dev/null +++ b/supabase/migrations/20251204120000_add_tags_support.sql @@ -0,0 +1,30 @@ +-- Create GIN index on the tags array in the JSONB data field +-- This allows efficient querying of documents by tag +CREATE INDEX IF NOT EXISTS idx_documents_tags + ON "public"."documents" USING gin ((data->'tags')); + +-- Function to search and aggregate tags from documents +-- This does the aggregation in the database rather than fetching all documents +CREATE OR REPLACE FUNCTION search_tags(search_query text) +RETURNS TABLE (name text, document_count bigint) AS $$ +BEGIN + RETURN QUERY + SELECT + LOWER(tag::text) as name, + COUNT(DISTINCT d.uri) as document_count + FROM + "public"."documents" d, + jsonb_array_elements_text(d.data->'tags') as tag + WHERE + CASE + WHEN search_query = '' THEN true + ELSE LOWER(tag::text) LIKE '%' || search_query || '%' + END + GROUP BY + LOWER(tag::text) + ORDER BY + COUNT(DISTINCT d.uri) DESC, + LOWER(tag::text) ASC + LIMIT 20; +END; +$$ LANGUAGE plpgsql STABLE; -- 2.51.2 From 221abd040f65f6925dfa10eabc2e3c74993ef114 Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Thu, 4 Dec 2025 16:54:49 -0500 Subject: [PATCH 6/8] add search_tags rpc function --- supabase/database.types.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/supabase/database.types.ts b/supabase/database.types.ts index 43d56b03..5477c61a 100644 --- a/supabase/database.types.ts +++ b/supabase/database.types.ts @@ -1158,6 +1158,15 @@ export type Database = { } Returns: Database["public"]["CompositeTypes"]["pull_result"] } + search_tags: { + Args: { + search_query: string + } + Returns: { + name: string + document_count: number + }[] + } } Enums: { rsvp_status: "GOING" | "NOT_GOING" | "MAYBE" -- 2.51.2 From 3b9f80fffd077edc3f55497b073d7e72010cbf5f Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Thu, 4 Dec 2025 18:07:58 -0500 Subject: [PATCH 7/8] update metadata tables to support tags --- .../20251204130000_add_tags_to_drafts.sql | 7 ++++ ...51204140000_update_pull_data_with_tags.sql | 38 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 supabase/migrations/20251204130000_add_tags_to_drafts.sql create mode 100644 supabase/migrations/20251204140000_update_pull_data_with_tags.sql diff --git a/supabase/migrations/20251204130000_add_tags_to_drafts.sql b/supabase/migrations/20251204130000_add_tags_to_drafts.sql new file mode 100644 index 00000000..91667f74 --- /dev/null +++ b/supabase/migrations/20251204130000_add_tags_to_drafts.sql @@ -0,0 +1,7 @@ +-- Add tags column to leaflets_in_publications for publication drafts +ALTER TABLE "public"."leaflets_in_publications" +ADD COLUMN "tags" text[] DEFAULT ARRAY[]::text[]; + +-- Add tags column to leaflets_to_documents for standalone document drafts +ALTER TABLE "public"."leaflets_to_documents" +ADD COLUMN "tags" text[] DEFAULT ARRAY[]::text[]; diff --git a/supabase/migrations/20251204140000_update_pull_data_with_tags.sql b/supabase/migrations/20251204140000_update_pull_data_with_tags.sql new file mode 100644 index 00000000..9b55bff4 --- /dev/null +++ b/supabase/migrations/20251204140000_update_pull_data_with_tags.sql @@ -0,0 +1,38 @@ +set check_function_bodies = off; + +CREATE OR REPLACE FUNCTION public.pull_data(token_id uuid, client_group_id text) + RETURNS pull_result + LANGUAGE plpgsql +AS $function$DECLARE + result pull_result; +BEGIN + -- Get client group data as JSON array + SELECT json_agg(row_to_json(rc)) + FROM replicache_clients rc + WHERE rc.client_group = client_group_id + INTO result.client_groups; + + -- Get facts as JSON array + SELECT json_agg(row_to_json(f)) + FROM permission_tokens pt, + get_facts(pt.root_entity) f + WHERE pt.id = token_id + INTO result.facts; + + -- Get publication data - try leaflets_in_publications first, then leaflets_to_documents + SELECT json_agg(row_to_json(lip)) + FROM leaflets_in_publications lip + WHERE lip.leaflet = token_id + INTO result.publications; + + -- If no publication data found, try leaflets_to_documents (for standalone documents) + IF result.publications IS NULL THEN + SELECT json_agg(row_to_json(ltd)) + FROM leaflets_to_documents ltd + WHERE ltd.leaflet = token_id + INTO result.publications; + END IF; + + RETURN result; +END;$function$ +; -- 2.51.2 From 3c39d5b40a8f44b985c298952765be5c796d64f4 Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Thu, 4 Dec 2025 18:49:00 -0500 Subject: [PATCH 8/8] update react --- package-lock.json | 16 ++++++++++++---- package.json | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2cc0b212..295b2715 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,6 +48,7 @@ "inngest": "^3.40.1", "ioredis": "^5.6.1", "katex": "^0.16.22", + "l": "^0.6.0", "linkifyjs": "^4.2.0", "luxon": "^3.7.2", "multiformats": "^13.3.2", @@ -59,7 +60,7 @@ "prosemirror-model": "^1.21.0", "prosemirror-schema-basic": "^1.2.2", "prosemirror-state": "^1.4.3", - "react": "19.2.0", + "react": "19.2.1", "react-aria-components": "^1.8.0", "react-day-picker": "^9.3.0", "react-dom": "19.2.0", @@ -13369,6 +13370,12 @@ "json-buffer": "3.0.1" } }, + "node_modules/l": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/l/-/l-0.6.0.tgz", + "integrity": "sha512-rB5disIyfKRBQ1xcedByHCcAmPWy2NPnjWo5u4mVVIPtathROHyfHjkloqSBT49mLnSRnupkpoIUOFCL7irCVQ==", + "license": "MIT" + }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -16331,9 +16338,10 @@ } }, "node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", + "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } diff --git a/package.json b/package.json index ef2bc74c..4c3c8e7b 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "inngest": "^3.40.1", "ioredis": "^5.6.1", "katex": "^0.16.22", + "l": "^0.6.0", "linkifyjs": "^4.2.0", "luxon": "^3.7.2", "multiformats": "^13.3.2", @@ -69,7 +70,7 @@ "prosemirror-model": "^1.21.0", "prosemirror-schema-basic": "^1.2.2", "prosemirror-state": "^1.4.3", - "react": "19.2.0", + "react": "19.2.1", "react-aria-components": "^1.8.0", "react-day-picker": "^9.3.0", "react-dom": "19.2.0",