From feae3dc482be1bf3dace6d8b7a887b59db4db798 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 19 Feb 2025 13:05:42 +0100 Subject: [PATCH 1/2] fix(source): type export via rollup plugin by using the correct input (#122) * fix typeexport via rollup plugin by using the correct input The rollup plugin dts requires a d.ts tree as input not the txs sources. This change points the plugin into the right direction and removes the type export hacks. * corrected types path apparently this was not properly adjusted accross the board when moving the folder * fix rollup config properly export types * use export * where needed Since we now export types alongside with defintions we use the `export * from` syntax to simplify things * export types alongside with interfaces export types so we can properly use them in external projects alongside the exported function/module/... * fix type-problems uncovered by utopia-map When including types properly in the utopia-map several missing typings showed up. * fix typing fix an inhereted type * dummy restructure code to properly be able to compile things we are not allowed to have unsed parameters/props * assigne types to category types --- package.json | 2 +- rollup.config.js | 5 +-- src/Components/AppShell/AppShell.tsx | 2 + src/Components/AppShell/NavBar.tsx | 2 +- src/Components/AppShell/index.tsx | 2 +- src/Components/Auth/index.tsx | 2 +- src/Components/Auth/useAuth.tsx | 3 ++ src/Components/Gaming/Quests.tsx | 2 +- src/Components/Map/Layer.tsx | 5 +++ src/Components/Map/Permissions.tsx | 19 ++++---- .../Controls/GratitudeControl.tsx | 2 +- .../ItemPopupComponents/TextView.tsx | 8 +++- src/Components/Map/index.tsx | 4 +- src/Components/Profile/ProfileForm.tsx | 2 +- src/Components/Profile/UserSettings.tsx | 2 +- src/Components/Profile/index.tsx | 2 +- .../Templates/OverlayItemsIndexPage.tsx | 4 ++ src/index.tsx | 45 +++---------------- src/types/AssetsApi.d.ts | 3 ++ src/types/Item.d.ts | 3 ++ src/types/ItemType.d.ts | 6 ++- src/types/ItemsApi.d.ts | 3 ++ src/types/LayerProps.d.ts | 3 ++ src/types/Permission.d.ts | 3 ++ src/types/Tag.d.ts | 3 ++ src/types/UserApi.d.ts | 3 ++ src/types/UserItem.d.ts | 3 ++ src/types/index.ts | 9 ---- tsconfig.json | 4 +- 29 files changed, 82 insertions(+), 74 deletions(-) delete mode 100644 src/types/index.ts diff --git a/package.json b/package.json index c1f20ccd..e73f5764 100644 --- a/package.json +++ b/package.json @@ -113,8 +113,8 @@ "imports": { "#components/*": "./src/Components/*", "#utils/*": "./src/Utils/*", + "#types/*": "./src/types/*", "#src/*": "./src/*", - "#types/*": "./types/*", "#root/*": "./*" } } diff --git a/rollup.config.js b/rollup.config.js index 5f4a811b..0370b6cc 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -76,17 +76,16 @@ export default [ ], }, { - input: 'src/index.tsx', + input: 'dist/types/src/index.d.ts', output: [{ file: 'dist/index.d.ts', format: 'es' }], plugins: [ aliasConfig, dts({ - respectExternal: true, compilerOptions: { skipLibCheck: true, }, }), ], - external: [/\.css$/, /\.d\.ts$/], // ✅ `.d.ts` als extern behandeln + external: [/\.css$/], //, /\.d\.ts$/ }, ] diff --git a/src/Components/AppShell/AppShell.tsx b/src/Components/AppShell/AppShell.tsx index be88baba..9db9aadd 100644 --- a/src/Components/AppShell/AppShell.tsx +++ b/src/Components/AppShell/AppShell.tsx @@ -4,6 +4,8 @@ import { SetAppState } from './SetAppState' import type { AssetsApi } from '#types/AssetsApi' +export type { AssetsApi } from '#types/AssetsApi' + /** * @category AppShell */ diff --git a/src/Components/AppShell/NavBar.tsx b/src/Components/AppShell/NavBar.tsx index 08971877..36ecee76 100644 --- a/src/Components/AppShell/NavBar.tsx +++ b/src/Components/AppShell/NavBar.tsx @@ -3,7 +3,7 @@ import { useEffect, useRef, useState } from 'react' import { Link, useLocation } from 'react-router-dom' import { toast } from 'react-toastify' -import { useAuth } from '#components/Auth' +import { useAuth } from '#components/Auth/useAuth' import { useItems } from '#components/Map/hooks/useItems' import type { Item } from '#types/Item' diff --git a/src/Components/AppShell/index.tsx b/src/Components/AppShell/index.tsx index 839a969c..72464ef5 100644 --- a/src/Components/AppShell/index.tsx +++ b/src/Components/AppShell/index.tsx @@ -1,4 +1,4 @@ -export { AppShell } from './AppShell' +export * from './AppShell' export { SideBar } from './SideBar' export { Content } from './Content' export { Sitemap } from './Sitemap' diff --git a/src/Components/Auth/index.tsx b/src/Components/Auth/index.tsx index 2a53f98d..c8fe3b90 100644 --- a/src/Components/Auth/index.tsx +++ b/src/Components/Auth/index.tsx @@ -1,4 +1,4 @@ -export { AuthProvider, useAuth } from './useAuth' +export { AuthProvider, UserApi, UserItem } from './useAuth' export { LoginPage } from './LoginPage' export { SignupPage } from './SignupPage' export { RequestPasswordPage } from './RequestPasswordPage' diff --git a/src/Components/Auth/useAuth.tsx b/src/Components/Auth/useAuth.tsx index 1cbba54c..ffde8af5 100644 --- a/src/Components/Auth/useAuth.tsx +++ b/src/Components/Auth/useAuth.tsx @@ -8,6 +8,9 @@ import { createContext, useState, useContext, useEffect } from 'react' import type { UserApi } from '#types/UserApi' import type { UserItem } from '#types/UserItem' +export type { UserApi } from '#types/UserApi' +export type { UserItem } from '#types/UserItem' + interface AuthProviderProps { userApi: UserApi children?: React.ReactNode diff --git a/src/Components/Gaming/Quests.tsx b/src/Components/Gaming/Quests.tsx index 07fa54c1..2d14488d 100644 --- a/src/Components/Gaming/Quests.tsx +++ b/src/Components/Gaming/Quests.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react' -import { useAuth } from '#components/Auth' +import { useAuth } from '#components/Auth/useAuth' import { useItems } from '#components/Map/hooks/useItems' import { useQuestsOpen, useSetQuestOpen } from './hooks/useQuests' diff --git a/src/Components/Map/Layer.tsx b/src/Components/Map/Layer.tsx index 01ce5946..a5071cb7 100644 --- a/src/Components/Map/Layer.tsx +++ b/src/Components/Map/Layer.tsx @@ -27,6 +27,11 @@ import type { Tag } from '#types/Tag' import type { Popup } from 'leaflet' import type { ReactElement, ReactNode } from 'react' +export type { Item } from '#types/Item' +export type { LayerProps } from '#types/LayerProps' +export type { Tag } from '#types/Tag' +export type { Popup } from 'leaflet' + /** * @category Map */ diff --git a/src/Components/Map/Permissions.tsx b/src/Components/Map/Permissions.tsx index 47a61a1c..4091319b 100644 --- a/src/Components/Map/Permissions.tsx +++ b/src/Components/Map/Permissions.tsx @@ -1,6 +1,6 @@ import { useEffect } from 'react' -import { useAuth } from '#components/Auth' +import { useAuth } from '#components/Auth/useAuth' import { useSetPermissionData, useSetPermissionApi, useSetAdminRole } from './hooks/usePermissions' @@ -8,17 +8,20 @@ import type { ItemsApi } from '#types/ItemsApi' import type { Permission } from '#types/Permission' /** - * @category Map + * @category Types */ -export function Permissions({ - data, - api, - adminRole, -}: { +export interface PermissionsProps { data?: Permission[] api?: ItemsApi adminRole?: string -}) { +} +export type { Permission } from '#types/Permission' +export type { ItemsApi } from '#types/ItemsApi' + +/** + * @category Map + */ +export function Permissions({ data, api, adminRole }: PermissionsProps) { const setPermissionData = useSetPermissionData() const setPermissionApi = useSetPermissionApi() const setAdminRole = useSetAdminRole() diff --git a/src/Components/Map/Subcomponents/Controls/GratitudeControl.tsx b/src/Components/Map/Subcomponents/Controls/GratitudeControl.tsx index 873c06e1..473151b0 100644 --- a/src/Components/Map/Subcomponents/Controls/GratitudeControl.tsx +++ b/src/Components/Map/Subcomponents/Controls/GratitudeControl.tsx @@ -1,6 +1,6 @@ import { useNavigate } from 'react-router-dom' -import { useAuth } from '#components/Auth' +import { useAuth } from '#components/Auth/useAuth' export const GratitudeControl = () => { const navigate = useNavigate() diff --git a/src/Components/Map/Subcomponents/ItemPopupComponents/TextView.tsx b/src/Components/Map/Subcomponents/ItemPopupComponents/TextView.tsx index 27bb83a2..e33684d3 100644 --- a/src/Components/Map/Subcomponents/ItemPopupComponents/TextView.tsx +++ b/src/Components/Map/Subcomponents/ItemPopupComponents/TextView.tsx @@ -27,12 +27,14 @@ export const TextView = ({ text, truncate = false, rawText, + itemTextField, }: { item?: Item - itemId: string + itemId?: string text?: string truncate?: boolean rawText?: string + itemTextField?: string }) => { if (item) { text = item.text @@ -40,6 +42,8 @@ export const TextView = ({ } const tags = useTags() const addFilterTag = useAddFilterTag() + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const itemTextFieldDummy = itemTextField let innerText = '' let replacedText = '' @@ -125,7 +129,7 @@ export const TextView = ({ }: { children: string tag: Tag - itemId: string + itemId?: string }) => { return ( { const [loading, setLoading] = useState(false) const [addItemPopupType, setAddItemPopupType] = useState('') + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const parameterFieldDummy = parameterField const tabRef = useRef(null) diff --git a/src/index.tsx b/src/index.tsx index 1446e5a5..0e6c5864 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,43 +1,12 @@ import './index.css' -export { - UtopiaMap, - Layer, - Tags, - Permissions, - ItemForm, - ItemView, - PopupTextAreaInput, - PopupStartEndInput, - PopupTextInput, - PopupButton, - TextView, - StartEndView, - PopupCheckboxInput, -} from './Components/Map' -export { AppShell, Content, SideBar, Sitemap } from './Components/AppShell' -export { - AuthProvider, - LoginPage, - SignupPage, - RequestPasswordPage, - SetNewPasswordPage, -} from './Components/Auth' -export { UserSettings, ProfileView, ProfileForm } from './Components/Profile' -export { Quests, Modal } from './Components/Gaming' -export { - TitleCard, - CardPage, - MapOverlayPage, - OverlayItemsIndexPage, - MoonCalendar, - SelectUser, - AttestationForm, - MarketView, -} from './Components/Templates' -export { TextInput, TextAreaInput, SelectBox } from './Components/Input' - -export * from './types' +export * from './Components/Map' +export * from './Components/AppShell' +export * from './Components/Auth' +export * from './Components/Profile' +export * from './Components/Gaming' +export * from './Components/Templates' +export * from './Components/Input' declare global { interface Window { diff --git a/src/types/AssetsApi.d.ts b/src/types/AssetsApi.d.ts index f2005016..7a8e9e77 100644 --- a/src/types/AssetsApi.d.ts +++ b/src/types/AssetsApi.d.ts @@ -1,3 +1,6 @@ +/** + * @category Types + */ export interface AssetsApi { upload(file: Blob, title: string): Promise<{ id: string }> url: string diff --git a/src/types/Item.d.ts b/src/types/Item.d.ts index 8723732c..4e84e992 100644 --- a/src/types/Item.d.ts +++ b/src/types/Item.d.ts @@ -15,6 +15,9 @@ interface GalleryItem { } } +/** + * @category Types + */ export interface Item { id: string name: string diff --git a/src/types/ItemType.d.ts b/src/types/ItemType.d.ts index 9a4f621c..df56aff7 100644 --- a/src/types/ItemType.d.ts +++ b/src/types/ItemType.d.ts @@ -2,14 +2,18 @@ import type { Key } from 'react' export interface ItemType { name: string + show_name_input: boolean + show_profile_button: boolean show_start_end: boolean + show_start_end_input: boolean show_text: boolean + show_text_input: boolean + custom_text: string // eslint-disable-next-line @typescript-eslint/no-explicit-any profileTemplate: { collection: string | number; id: Key | null | undefined; item: any }[] offers_and_needs: boolean icon_as_labels: unknown relations: boolean template: string - show_start_end_input: boolean questlog: boolean } diff --git a/src/types/ItemsApi.d.ts b/src/types/ItemsApi.d.ts index 54553c1e..e20b2ed8 100644 --- a/src/types/ItemsApi.d.ts +++ b/src/types/ItemsApi.d.ts @@ -1,3 +1,6 @@ +/** + * @category Types + */ export interface ItemsApi { getItems(): Promise getItem?(id: string): Promise diff --git a/src/types/LayerProps.d.ts b/src/types/LayerProps.d.ts index fef17678..e1b94b8b 100644 --- a/src/types/LayerProps.d.ts +++ b/src/types/LayerProps.d.ts @@ -3,6 +3,9 @@ import type { ItemFormPopupProps } from './ItemFormPopupProps' import type { ItemsApi } from './ItemsApi' import type { ItemType } from './ItemType' +/** + * @category Types + */ export interface LayerProps { id?: string data?: Item[] diff --git a/src/types/Permission.d.ts b/src/types/Permission.d.ts index 57067fee..871558a2 100644 --- a/src/types/Permission.d.ts +++ b/src/types/Permission.d.ts @@ -1,6 +1,9 @@ import type { PermissionAction } from './PermissionAction' import type { PermissionCondition } from './PermissionCondition' +/** + * @category Types + */ export interface Permission { id?: string policy?: { name: string } diff --git a/src/types/Tag.d.ts b/src/types/Tag.d.ts index 1dc7c5a9..0999d7cd 100644 --- a/src/types/Tag.d.ts +++ b/src/types/Tag.d.ts @@ -1,3 +1,6 @@ +/** + * @category Types + */ export interface Tag { color: string id: string diff --git a/src/types/UserApi.d.ts b/src/types/UserApi.d.ts index 6c36cd4e..a35e079d 100644 --- a/src/types/UserApi.d.ts +++ b/src/types/UserApi.d.ts @@ -1,5 +1,8 @@ import type { UserItem } from './UserItem' +/** + * @category Types + */ export interface UserApi { register(email: string, password: string, userName: string): Promise login(email: string, password: string): Promise diff --git a/src/types/UserItem.d.ts b/src/types/UserItem.d.ts index 1d28817e..68ccb8d7 100644 --- a/src/types/UserItem.d.ts +++ b/src/types/UserItem.d.ts @@ -1,5 +1,8 @@ import type { Profile } from './Profile' +/** + * @category Types + */ export interface UserItem { id?: string // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/types/index.ts b/src/types/index.ts deleted file mode 100644 index 42cb2117..00000000 --- a/src/types/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type { ItemsApi } from './ItemsApi' -export type { Tag } from './Tag' -export type { Item } from './Item' -export type { Permission } from './Permission' -export type { LayerProps } from './LayerProps' -export type { UserApi } from './UserApi' -export type { UserItem } from './UserItem' -export type { UtopiaMapProps } from './UtopiaMapProps' -export type { AssetsApi } from './AssetsApi' diff --git a/tsconfig.json b/tsconfig.json index 69322b8e..2a66fedf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,15 +22,15 @@ "paths": { "#components/*": ["./src/Components/*"], "#utils/*": ["./src/Utils/*"], - "#src/*": ["./src/*"], "#types/*": ["./src/types/*"], + "#src/*": ["./src/*"], "#root/*": ["./*"] } }, "include": ["src", "vite.config.ts", "setupTest.ts", "cypress.config.ts", "cypress/support/commands.ts", "cypress/support/component.ts"], "exclude": ["node_modules", "dist", "example", "rollup.config.mjss"], "typeRoots": [ - "./types", + "./src/types", "./node_modules/@types/" ] } From 1b5df933132a7fee61cd1082c8a5835d144b7c25 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 19 Feb 2025 15:05:39 +0100 Subject: [PATCH 2/2] fix example2 (#137) for some reason this stopped working on maaster. --- examples/2-static-layers/package-lock.json | 8 ++++ examples/2-static-layers/package.json | 1 + examples/2-static-layers/src/App.tsx | 48 ++++++++++++++++++++- examples/2-static-layers/src/sample-data.ts | 14 +++--- 4 files changed, 63 insertions(+), 8 deletions(-) diff --git a/examples/2-static-layers/package-lock.json b/examples/2-static-layers/package-lock.json index 4d45be8f..19098ea6 100644 --- a/examples/2-static-layers/package-lock.json +++ b/examples/2-static-layers/package-lock.json @@ -13,6 +13,7 @@ }, "devDependencies": { "@eslint/js": "^9.17.0", + "@types/geojson": "^7946.0.16", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "@vitejs/plugin-react": "^4.3.4", @@ -1270,6 +1271,13 @@ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", diff --git a/examples/2-static-layers/package.json b/examples/2-static-layers/package.json index bea0e3fd..10a22e20 100644 --- a/examples/2-static-layers/package.json +++ b/examples/2-static-layers/package.json @@ -15,6 +15,7 @@ }, "devDependencies": { "@eslint/js": "^9.17.0", + "@types/geojson": "^7946.0.16", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/2-static-layers/src/App.tsx b/examples/2-static-layers/src/App.tsx index bba8bfed..8ed144cc 100644 --- a/examples/2-static-layers/src/App.tsx +++ b/examples/2-static-layers/src/App.tsx @@ -1,6 +1,40 @@ import { UtopiaMap, Layer } from "utopia-ui" import { events, places } from "./sample-data" +const itemTypeEvent = { + name: "event", + show_name_input: false, + show_profile_button: false, + show_start_end: false, + show_start_end_input: false, + show_text: false, + show_text_input: false, + custom_text: "", + profileTemplate: [], + offers_and_needs: false, + icon_as_labels: null, + relations: false, + template: "TODO", + questlog: false, +} + +const itemTypePlace = { + name: "event", + show_name_input: false, + show_profile_button: false, + show_start_end: false, + show_start_end_input: false, + show_text: false, + show_text_input: false, + custom_text: "", + profileTemplate: [], + offers_and_needs: false, + icon_as_labels: null, + relations: false, + template: "TODO", + questlog: false, +} + function App() { return ( @@ -9,13 +43,23 @@ function App() { markerIcon='calendar' markerShape='square' markerDefaultColor='#700' - data={events} /> + data={events} + menuIcon="calendar" + menuColor="#700" + menuText="events" + itemType={itemTypeEvent} + /> + data={places} + menuIcon="point" + menuColor="#007" + menuText="places" + itemType={itemTypePlace} + /> ) } diff --git a/examples/2-static-layers/src/sample-data.ts b/examples/2-static-layers/src/sample-data.ts index ae57855b..8f2682d4 100644 --- a/examples/2-static-layers/src/sample-data.ts +++ b/examples/2-static-layers/src/sample-data.ts @@ -1,22 +1,24 @@ +import { Point } from "geojson"; + export const places = [{ - "id": 51, + "id": "51", "name": "Stadtgemüse", "text": "Stadtgemüse Fulda ist eine Gemüsegärtnerei in Maberzell, die es sich zur Aufgabe gemacht hat, die Stadt und seine Bewohner:innen mit regionalem, frischem und natürlich angebautem Gemüse mittels Gemüsekisten zu versorgen. Es gibt also jede Woche, von Frühjahr bis Herbst, angepasst an die Saison eine Kiste mit schmackhaftem und frischem Gemüse für euch, welche ihr direkt vor Ort abholen könnt. \r\n\r\nhttps://stadtgemuese-fulda.de", - "position": { "type": "Point", "coordinates": [9.632435, 50.560342] }, + "position": { "type": "Point", "coordinates": [9.632435, 50.560342] } as Point, }, { - "id": 166, + "id": "166", "name": "Weidendom", "text": "free camping", - "position": { "type": "Point", "coordinates": [9.438793, 50.560112] }, + "position": { "type": "Point", "coordinates": [9.438793, 50.560112] } as Point, }]; export const events = [ { - "id": 423, + "id": "423", "name": "Hackathon", "text": "still in progress", - "position": { "type": "Point", "coordinates": [10.5, 51.62] }, + "position": { "type": "Point", "coordinates": [10.5, 51.62] } as Point, "start": "2022-03-25T12:00:00", "end": "2022-05-12T12:00:00", }