From dff0a8a2d6c16e58960668201d3c631f62be6d52 Mon Sep 17 00:00:00 2001 From: babayaga Date: Thu, 29 Jan 2026 17:59:43 +0100 Subject: [PATCH] pm server - shared --- packages/kbot/dev-kbot.code-workspace | 3 + packages/shared/dist/competitors/schemas.d.ts | 968 ++++++++++++++++++ packages/shared/dist/competitors/schemas.js | 251 +++++ packages/shared/dist/index.d.ts | 1 + packages/shared/dist/index.js | 2 + packages/shared/dist/map.d.ts | 39 + packages/shared/dist/map.js | 102 ++ packages/shared/package-lock.json | 151 +++ packages/shared/package.json | 22 + packages/shared/src/competitors/schemas.ts | 332 ++++++ packages/shared/src/index.ts | 1 + packages/shared/src/map.ts | 111 ++ packages/shared/tsconfig.json | 20 + 13 files changed, 2003 insertions(+) create mode 100644 packages/shared/dist/competitors/schemas.d.ts create mode 100644 packages/shared/dist/competitors/schemas.js create mode 100644 packages/shared/dist/index.d.ts create mode 100644 packages/shared/dist/index.js create mode 100644 packages/shared/dist/map.d.ts create mode 100644 packages/shared/dist/map.js create mode 100644 packages/shared/package-lock.json create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/competitors/schemas.ts create mode 100644 packages/shared/src/index.ts create mode 100644 packages/shared/src/map.ts create mode 100644 packages/shared/tsconfig.json diff --git a/packages/kbot/dev-kbot.code-workspace b/packages/kbot/dev-kbot.code-workspace index 5116974e..b7d64821 100644 --- a/packages/kbot/dev-kbot.code-workspace +++ b/packages/kbot/dev-kbot.code-workspace @@ -8,6 +8,9 @@ }, { "path": "../cad" + }, + { + "path": "../tasks" } ], "settings": {} diff --git a/packages/shared/dist/competitors/schemas.d.ts b/packages/shared/dist/competitors/schemas.d.ts new file mode 100644 index 00000000..6cc46a14 --- /dev/null +++ b/packages/shared/dist/competitors/schemas.d.ts @@ -0,0 +1,968 @@ +import { z } from 'zod/v4'; +import { ZodMetaMap } from '../map.js'; +export declare const CompetitorSchema: z.ZodObject<{ + place_id: z.ZodString; + title: z.ZodString; + description: z.ZodNullable>; + address: z.ZodNullable>; + gps_coordinates: z.ZodNullable>>; + phone: z.ZodNullable>; + website: z.ZodNullable>; + operating_hours: z.ZodNullable>>; + thumbnail: z.ZodNullable>; + types: z.ZodNullable>>; + continent: z.ZodNullable>; + country: z.ZodNullable>; + city: z.ZodNullable>; + updated_at: z.ZodNullable>; + raw_data: z.ZodNullable>>; +}, z.core.$strip>; +export declare const GpsCoordinatesSchema: z.ZodObject<{ + latitude: z.ZodNumber; + longitude: z.ZodNumber; +}, z.core.$strip>; +export declare const OperatingHoursSchema: z.ZodObject<{ + sunday: z.ZodString; + monday: z.ZodString; + tuesday: z.ZodString; + wednesday: z.ZodString; + thursday: z.ZodString; + friday: z.ZodString; + saturday: z.ZodString; +}, z.core.$strip>; +export declare const AccessibilityExtensionSchema: z.ZodObject<{ + accessibility: z.ZodArray; +}, z.core.$strip>; +export declare const CrowdExtensionSchema: z.ZodObject<{ + crowd: z.ZodArray; +}, z.core.$strip>; +export declare const ExtensionsSchema: z.ZodArray; +}, z.core.$strip>, z.ZodObject<{ + crowd: z.ZodArray; +}, z.core.$strip>]>>; +export declare const AdministrativeAreaFullSchema: z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + isoName: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + isoCode: z.ZodString; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; +}, z.core.$strip>; +export declare const AdministrativeAreaMinimalSchema: z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; +}, z.core.$strip>; +export declare const AdministrativeAreaWithWikidataSchema: z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; +}, z.core.$strip>; +export declare const AdministrativeAreaWithGeonameSchema: z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; +}, z.core.$strip>; +export declare const InformativeAreaFullSchema: z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + isoName: z.ZodString; + order: z.ZodNumber; + isoCode: z.ZodString; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; +}, z.core.$strip>; +export declare const InformativeAreaBasicSchema: z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; +}, z.core.$strip>; +export declare const InformativeAreaWithGeonameSchema: z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; +}, z.core.$strip>; +export declare const InformativeAreaWithWikidataSchema: z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; +}, z.core.$strip>; +export declare const InformativeAreaMinimalSchema: z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; +}, z.core.$strip>; +export declare const LocalityInfoSchema: z.ZodObject<{ + administrative: z.ZodArray, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>]>>; + informative: z.ZodArray, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>]>>; +}, z.core.$strip>; +export declare const GeoSchema: z.ZodObject<{ + latitude: z.ZodNumber; + longitude: z.ZodNumber; + localityLanguageRequested: z.ZodString; + continent: z.ZodString; + continentCode: z.ZodString; + countryName: z.ZodString; + countryCode: z.ZodString; + principalSubdivision: z.ZodString; + principalSubdivisionCode: z.ZodString; + city: z.ZodString; + locality: z.ZodString; + postcode: z.ZodString; + plusCode: z.ZodString; + localityInfo: z.ZodObject<{ + administrative: z.ZodArray, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>]>>; + informative: z.ZodArray, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>]>>; + }, z.core.$strip>; +}, z.core.$strip>; +export declare const SearchMetadataSchema: z.ZodObject<{ + id: z.ZodString; + status: z.ZodString; + json_endpoint: z.ZodString; + created_at: z.ZodString; + processed_at: z.ZodString; + google_maps_photos_url: z.ZodString; + raw_html_file: z.ZodString; + prettify_html_file: z.ZodString; + total_time_taken: z.ZodNumber; +}, z.core.$strip>; +export declare const SearchParametersSchema: z.ZodObject<{ + engine: z.ZodString; + data_id: z.ZodString; + hl: z.ZodString; +}, z.core.$strip>; +export declare const CategorySchema: z.ZodObject<{ + title: z.ZodString; + id: z.ZodString; +}, z.core.$strip>; +export declare const PhotoSchema: z.ZodObject<{ + thumbnail: z.ZodString; + image: z.ZodString; + photo_meta_serpapi_link: z.ZodString; +}, z.core.$strip>; +export declare const SerpapiPaginationSchema: z.ZodObject<{ + next: z.ZodString; + next_page_token: z.ZodString; +}, z.core.$strip>; +export declare const GoogleMediaSchema: z.ZodObject<{ + search_metadata: z.ZodObject<{ + id: z.ZodString; + status: z.ZodString; + json_endpoint: z.ZodString; + created_at: z.ZodString; + processed_at: z.ZodString; + google_maps_photos_url: z.ZodString; + raw_html_file: z.ZodString; + prettify_html_file: z.ZodString; + total_time_taken: z.ZodNumber; + }, z.core.$strip>; + search_parameters: z.ZodObject<{ + engine: z.ZodString; + data_id: z.ZodString; + hl: z.ZodString; + }, z.core.$strip>; + categories: z.ZodArray>; + photos: z.ZodArray>; + serpapi_pagination: z.ZodObject<{ + next: z.ZodString; + next_page_token: z.ZodString; + }, z.core.$strip>; +}, z.core.$strip>; +export declare const LocationSchema: z.ZodObject<{ + position: z.ZodOptional; + title: z.ZodOptional; + description: z.ZodOptional; + place_id: z.ZodOptional; + data_id: z.ZodOptional; + data_cid: z.ZodOptional; + reviews_link: z.ZodOptional; + photos_link: z.ZodOptional; + gps_coordinates: z.ZodOptional>; + place_id_search: z.ZodOptional; + provider_id: z.ZodOptional; + type: z.ZodOptional; + types: z.ZodOptional>; + type_id: z.ZodOptional; + type_ids: z.ZodOptional>; + address: z.ZodOptional; + open_state: z.ZodOptional; + hours: z.ZodOptional; + operating_hours: z.ZodOptional>; + phone: z.ZodOptional; + website: z.ZodOptional; + extensions: z.ZodOptional; + }, z.core.$strip>, z.ZodObject<{ + crowd: z.ZodArray; + }, z.core.$strip>]>>>; + thumbnail: z.ZodOptional; + serpapi_thumbnail: z.ZodOptional; + page: z.ZodOptional; + geo: z.ZodOptional, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>]>>; + informative: z.ZodArray, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>]>>; + }, z.core.$strip>; + }, z.core.$strip>>; + meta: z.ZodOptional>; + google_media: z.ZodOptional; + search_parameters: z.ZodObject<{ + engine: z.ZodString; + data_id: z.ZodString; + hl: z.ZodString; + }, z.core.$strip>; + categories: z.ZodArray>; + photos: z.ZodArray>; + serpapi_pagination: z.ZodObject<{ + next: z.ZodString; + next_page_token: z.ZodString; + }, z.core.$strip>; + }, z.core.$strip>>; +}, z.core.$strip>; +export declare const CompetitorSchemaFull: z.ZodObject<{ + place_id: z.ZodString; + title: z.ZodString; + address: z.ZodNullable>; + gps_coordinates: z.ZodNullable>>; + phone: z.ZodNullable>; + website: z.ZodNullable>; + operating_hours: z.ZodNullable>>; + thumbnail: z.ZodNullable>; + types: z.ZodNullable>>; + raw_data: z.ZodNullable; + title: z.ZodOptional; + description: z.ZodOptional; + place_id: z.ZodOptional; + data_id: z.ZodOptional; + data_cid: z.ZodOptional; + reviews_link: z.ZodOptional; + photos_link: z.ZodOptional; + gps_coordinates: z.ZodOptional>; + place_id_search: z.ZodOptional; + provider_id: z.ZodOptional; + type: z.ZodOptional; + types: z.ZodOptional>; + type_id: z.ZodOptional; + type_ids: z.ZodOptional>; + address: z.ZodOptional; + open_state: z.ZodOptional; + hours: z.ZodOptional; + operating_hours: z.ZodOptional>; + phone: z.ZodOptional; + website: z.ZodOptional; + extensions: z.ZodOptional; + }, z.core.$strip>, z.ZodObject<{ + crowd: z.ZodArray; + }, z.core.$strip>]>>>; + thumbnail: z.ZodOptional; + serpapi_thumbnail: z.ZodOptional; + page: z.ZodOptional; + geo: z.ZodOptional, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>]>>; + informative: z.ZodArray, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>]>>; + }, z.core.$strip>; + }, z.core.$strip>>; + meta: z.ZodOptional>; + google_media: z.ZodOptional; + search_parameters: z.ZodObject<{ + engine: z.ZodString; + data_id: z.ZodString; + hl: z.ZodString; + }, z.core.$strip>; + categories: z.ZodArray>; + photos: z.ZodArray>; + serpapi_pagination: z.ZodObject<{ + next: z.ZodString; + next_page_token: z.ZodString; + }, z.core.$strip>; + }, z.core.$strip>>; + }, z.core.$strip>>>; + continent: z.ZodNullable>; + country: z.ZodNullable>; + city: z.ZodNullable>; + updated_at: z.ZodNullable>; +}, z.core.$strip>; +export declare const CompetitorResponseSchema: z.ZodObject<{ + message: z.ZodString; + data: z.ZodOptional>; + gps_coordinates: z.ZodNullable>>; + phone: z.ZodNullable>; + website: z.ZodNullable>; + operating_hours: z.ZodNullable>>; + thumbnail: z.ZodNullable>; + types: z.ZodNullable>>; + raw_data: z.ZodNullable; + title: z.ZodOptional; + description: z.ZodOptional; + place_id: z.ZodOptional; + data_id: z.ZodOptional; + data_cid: z.ZodOptional; + reviews_link: z.ZodOptional; + photos_link: z.ZodOptional; + gps_coordinates: z.ZodOptional>; + place_id_search: z.ZodOptional; + provider_id: z.ZodOptional; + type: z.ZodOptional; + types: z.ZodOptional>; + type_id: z.ZodOptional; + type_ids: z.ZodOptional>; + address: z.ZodOptional; + open_state: z.ZodOptional; + hours: z.ZodOptional; + operating_hours: z.ZodOptional>; + phone: z.ZodOptional; + website: z.ZodOptional; + extensions: z.ZodOptional; + }, z.core.$strip>, z.ZodObject<{ + crowd: z.ZodArray; + }, z.core.$strip>]>>>; + thumbnail: z.ZodOptional; + serpapi_thumbnail: z.ZodOptional; + page: z.ZodOptional; + geo: z.ZodOptional, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>]>>; + informative: z.ZodArray, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>]>>; + }, z.core.$strip>; + }, z.core.$strip>>; + meta: z.ZodOptional>; + google_media: z.ZodOptional; + search_parameters: z.ZodObject<{ + engine: z.ZodString; + data_id: z.ZodString; + hl: z.ZodString; + }, z.core.$strip>; + categories: z.ZodArray>; + photos: z.ZodArray>; + serpapi_pagination: z.ZodObject<{ + next: z.ZodString; + next_page_token: z.ZodString; + }, z.core.$strip>; + }, z.core.$strip>>; + }, z.core.$strip>>>; + continent: z.ZodNullable>; + country: z.ZodNullable>; + city: z.ZodNullable>; + updated_at: z.ZodNullable>; + }, z.core.$strip>>>; +}, z.core.$strip>; +export declare const CompetitorDetailResponseSchema: z.ZodObject<{ + message: z.ZodString; + data: z.ZodOptional>; + gps_coordinates: z.ZodNullable>>; + phone: z.ZodNullable>; + website: z.ZodNullable>; + operating_hours: z.ZodNullable>>; + thumbnail: z.ZodNullable>; + types: z.ZodNullable>>; + raw_data: z.ZodNullable; + title: z.ZodOptional; + description: z.ZodOptional; + place_id: z.ZodOptional; + data_id: z.ZodOptional; + data_cid: z.ZodOptional; + reviews_link: z.ZodOptional; + photos_link: z.ZodOptional; + gps_coordinates: z.ZodOptional>; + place_id_search: z.ZodOptional; + provider_id: z.ZodOptional; + type: z.ZodOptional; + types: z.ZodOptional>; + type_id: z.ZodOptional; + type_ids: z.ZodOptional>; + address: z.ZodOptional; + open_state: z.ZodOptional; + hours: z.ZodOptional; + operating_hours: z.ZodOptional>; + phone: z.ZodOptional; + website: z.ZodOptional; + extensions: z.ZodOptional; + }, z.core.$strip>, z.ZodObject<{ + crowd: z.ZodArray; + }, z.core.$strip>]>>>; + thumbnail: z.ZodOptional; + serpapi_thumbnail: z.ZodOptional; + page: z.ZodOptional; + geo: z.ZodOptional, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + adminLevel: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>]>>; + informative: z.ZodArray, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + geonameId: z.ZodNumber; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + description: z.ZodString; + order: z.ZodNumber; + wikidataId: z.ZodString; + }, z.core.$strip>, z.ZodObject<{ + name: z.ZodString; + order: z.ZodNumber; + }, z.core.$strip>]>>; + }, z.core.$strip>; + }, z.core.$strip>>; + meta: z.ZodOptional>; + google_media: z.ZodOptional; + search_parameters: z.ZodObject<{ + engine: z.ZodString; + data_id: z.ZodString; + hl: z.ZodString; + }, z.core.$strip>; + categories: z.ZodArray>; + photos: z.ZodArray>; + serpapi_pagination: z.ZodObject<{ + next: z.ZodString; + next_page_token: z.ZodString; + }, z.core.$strip>; + }, z.core.$strip>>; + }, z.core.$strip>>>; + continent: z.ZodNullable>; + country: z.ZodNullable>; + city: z.ZodNullable>; + updated_at: z.ZodNullable>; + }, z.core.$strip>>; +}, z.core.$strip>; +export type Competitor = z.infer; +export type CompetitorResponse = z.infer; +export type CompetitorDetailResponse = z.infer; +export type CompetitorFull = z.infer; +export type OptionsSchemaMeta = Record; +export declare const CompetitorRequestSchemaMap: () => ZodMetaMap; +export declare const CompetitorRequestSchema: any; +export declare const CompetitorUISchema: Record; +export type LocationType = z.infer; +export type CompetitorRequest = z.infer; diff --git a/packages/shared/dist/competitors/schemas.js b/packages/shared/dist/competitors/schemas.js new file mode 100644 index 00000000..2d2365af --- /dev/null +++ b/packages/shared/dist/competitors/schemas.js @@ -0,0 +1,251 @@ +import { z } from 'zod/v4'; +import { ZodMetaMap } from '../map.js'; +import { extendZodWithOpenApi } from '@hono/zod-openapi'; +extendZodWithOpenApi(z); +export const CompetitorSchema = z.object({ + place_id: z.string(), + title: z.string(), + description: z.string().optional().nullable(), + address: z.string().optional().nullable(), + gps_coordinates: z.object({ + latitude: z.number(), + longitude: z.number(), + }).optional().nullable(), + phone: z.string().optional().nullable(), + website: z.string().optional().nullable(), + operating_hours: z.record(z.string(), z.any()).optional().nullable(), + thumbnail: z.string().optional().nullable(), + types: z.array(z.string()).optional().nullable(), + continent: z.string().optional().nullable(), + country: z.string().optional().nullable(), + city: z.string().optional().nullable(), + updated_at: z.string().optional().nullable(), + raw_data: z.record(z.string(), z.any()).optional().nullable() +}); +// Shared schemas +export const GpsCoordinatesSchema = z.object({ + latitude: z.number(), + longitude: z.number() +}); +export const OperatingHoursSchema = z.object({ + sunday: z.string(), + monday: z.string(), + tuesday: z.string(), + wednesday: z.string(), + thursday: z.string(), + friday: z.string(), + saturday: z.string() +}); +// Extension schemas +export const AccessibilityExtensionSchema = z.object({ + accessibility: z.array(z.string()) +}); +export const CrowdExtensionSchema = z.object({ + crowd: z.array(z.string()) +}); +export const ExtensionsSchema = z.array(z.union([AccessibilityExtensionSchema, CrowdExtensionSchema])); +// Locality info schemas +export const AdministrativeAreaFullSchema = z.object({ + name: z.string(), + description: z.string(), + isoName: z.string(), + order: z.number(), + adminLevel: z.number(), + isoCode: z.string(), + wikidataId: z.string(), + geonameId: z.number() +}); +export const AdministrativeAreaMinimalSchema = z.object({ + name: z.string(), + order: z.number(), + adminLevel: z.number() +}); +export const AdministrativeAreaWithWikidataSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number(), + adminLevel: z.number(), + wikidataId: z.string() +}); +export const AdministrativeAreaWithGeonameSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number(), + adminLevel: z.number(), + wikidataId: z.string(), + geonameId: z.number() +}); +export const InformativeAreaFullSchema = z.object({ + name: z.string(), + description: z.string(), + isoName: z.string(), + order: z.number(), + isoCode: z.string(), + wikidataId: z.string(), + geonameId: z.number() +}); +export const InformativeAreaBasicSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number() +}); +export const InformativeAreaWithGeonameSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number(), + wikidataId: z.string(), + geonameId: z.number() +}); +export const InformativeAreaWithWikidataSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number(), + wikidataId: z.string() +}); +export const InformativeAreaMinimalSchema = z.object({ + name: z.string(), + order: z.number() +}); +export const LocalityInfoSchema = z.object({ + administrative: z.array(z.union([ + AdministrativeAreaFullSchema, + AdministrativeAreaMinimalSchema, + AdministrativeAreaWithWikidataSchema, + AdministrativeAreaWithGeonameSchema + ])), + informative: z.array(z.union([ + InformativeAreaFullSchema, + InformativeAreaBasicSchema, + InformativeAreaWithGeonameSchema, + InformativeAreaWithWikidataSchema, + InformativeAreaMinimalSchema + ])) +}); +// Geo schema +export const GeoSchema = z.object({ + latitude: z.number(), + longitude: z.number(), + localityLanguageRequested: z.string(), + continent: z.string(), + continentCode: z.string(), + countryName: z.string(), + countryCode: z.string(), + principalSubdivision: z.string(), + principalSubdivisionCode: z.string(), + city: z.string(), + locality: z.string(), + postcode: z.string(), + plusCode: z.string(), + localityInfo: LocalityInfoSchema +}); +// Google Media schemas +export const SearchMetadataSchema = z.object({ + id: z.string(), + status: z.string(), + json_endpoint: z.string(), + created_at: z.string(), + processed_at: z.string(), + google_maps_photos_url: z.string(), + raw_html_file: z.string(), + prettify_html_file: z.string(), + total_time_taken: z.number() +}); +export const SearchParametersSchema = z.object({ + engine: z.string(), + data_id: z.string(), + hl: z.string() +}); +export const CategorySchema = z.object({ + title: z.string(), + id: z.string() +}); +export const PhotoSchema = z.object({ + thumbnail: z.string(), + image: z.string(), + photo_meta_serpapi_link: z.string() +}); +export const SerpapiPaginationSchema = z.object({ + next: z.string(), + next_page_token: z.string() +}); +export const GoogleMediaSchema = z.object({ + search_metadata: SearchMetadataSchema, + search_parameters: SearchParametersSchema, + categories: z.array(CategorySchema), + photos: z.array(PhotoSchema), + serpapi_pagination: SerpapiPaginationSchema +}); +// Raw data schema +export const LocationSchema = z.object({ + position: z.number(), + title: z.string(), + description: z.string(), + place_id: z.string(), + data_id: z.string(), + data_cid: z.string(), + reviews_link: z.string(), + photos_link: z.string(), + gps_coordinates: GpsCoordinatesSchema, + place_id_search: z.string(), + provider_id: z.string(), + type: z.string(), + types: z.array(z.string()), + type_id: z.string(), + type_ids: z.array(z.string()), + address: z.string(), + open_state: z.string(), + hours: z.string(), + operating_hours: OperatingHoursSchema, + phone: z.string(), + website: z.string(), + extensions: ExtensionsSchema, + thumbnail: z.string(), + serpapi_thumbnail: z.string(), + page: z.number(), + geo: GeoSchema, + meta: z.record(z.string(), z.any()), + google_media: GoogleMediaSchema +}).partial(); +// Main CompetitorSchemaFull +export const CompetitorSchemaFull = z.object({ + place_id: z.string(), + title: z.string(), + address: z.string().optional().nullable(), + gps_coordinates: GpsCoordinatesSchema.optional().nullable(), + phone: z.string().optional().nullable(), + website: z.string().optional().nullable(), + operating_hours: OperatingHoursSchema.optional().nullable(), + thumbnail: z.string().optional().nullable(), + types: z.array(z.string()).optional().nullable(), + raw_data: LocationSchema.optional().nullable(), + continent: z.string().optional().nullable(), + country: z.string().optional().nullable(), + city: z.string().optional().nullable(), + updated_at: z.string().optional().nullable() +}); +export const CompetitorResponseSchema = z.object({ + message: z.string(), + data: z.array(CompetitorSchemaFull).optional(), +}); +export const CompetitorDetailResponseSchema = z.object({ + message: z.string(), + data: CompetitorSchemaFull.optional(), +}); +let schemaMap; +export const CompetitorRequestSchemaMap = () => { + schemaMap = ZodMetaMap.create(); + schemaMap.add('location', z.string().default('dresden, germany'), { 'ui:group': 'Search Parameters' }) + .add('query', z.string().default('plastichub'), { 'ui:group': 'Search Parameters' }) + .add('filterCity', z.string().optional(), { 'ui:group': 'Filters' }) + .add('filterContinent', z.string().optional(), { 'ui:group': 'Filters' }) + .add('filterCountry', z.string().optional(), { 'ui:group': 'Filters' }) + .add('filterType', z.string().optional(), { 'ui:group': 'Filters' }) + .add('excludedTypes', z.array(z.string()).optional(), { 'ui:group': 'Filters' }) + .add('concurrency', z.string().optional().default('5'), { 'ui:group': 'Settings' }) + .add('refresh', z.boolean().optional().default(false), { 'ui:group': 'Settings' }) + .add('limit', z.string().optional().default('250'), { 'ui:group': 'Settings' }); + return schemaMap; +}; +export const CompetitorRequestSchema = CompetitorRequestSchemaMap().root(); +export const CompetitorUISchema = CompetitorRequestSchemaMap().getUISchema(); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wZXRpdG9ycy9zY2hlbWFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFMUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV6RCxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV4QixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3JDLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ3BCLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2pCLFdBQVcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzdDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3pDLGVBQWUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3RCLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO1FBQ3BCLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0tBQ3hCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDeEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdkMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDekMsZUFBZSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FB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 \ No newline at end of file diff --git a/packages/shared/dist/index.d.ts b/packages/shared/dist/index.d.ts new file mode 100644 index 00000000..caaf7304 --- /dev/null +++ b/packages/shared/dist/index.d.ts @@ -0,0 +1 @@ +export * from './competitors/schemas.js'; diff --git a/packages/shared/dist/index.js b/packages/shared/dist/index.js new file mode 100644 index 00000000..fa1380f4 --- /dev/null +++ b/packages/shared/dist/index.js @@ -0,0 +1,2 @@ +export * from './competitors/schemas.js'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywwQkFBMEIsQ0FBQyJ9 \ No newline at end of file diff --git a/packages/shared/dist/map.d.ts b/packages/shared/dist/map.d.ts new file mode 100644 index 00000000..56bc91f3 --- /dev/null +++ b/packages/shared/dist/map.d.ts @@ -0,0 +1,39 @@ +import { ZodObject, ZodTypeAny } from 'zod/v4'; +export declare class ZodMetaMap> { + private fieldMap; + /** + * Adds a Zod schema under a specific key (property name), + * optionally attaching typed metadata. + * + * @param key - The name of the property in the root object. + * @param schema - The Zod schema for that property. + * @param metadata - Optional metadata object (type MetaType). + */ + add(key: string, schema: T, metadata?: MetaType): this; + /** + * Builds and returns a root Zod object + * that combines all properties which were added. + */ + root(): ZodObject>; + /** + * Retrieves the metadata for a specific key, if any. + */ + getMetadata(key: string): MetaType | undefined; + /** + * Static factory method: creates a SchemaMetaManager + * while letting you optionally specify the MetaType. + * + * Usage: + * const manager = SchemaMetaManager.create(); + */ + static create>(): ZodMetaMap; + /** + * Returns a basic UiSchema object that RJSF can use to render form controls. + * + * - Adds a top-level "ui:submitButtonOptions" (example). + * - For each field, we set `ui:title` (uppercase key), + * `ui:description` (from Zod's .describe() if available), + * and a naive placeholder from the default value (if parse(undefined) succeeds). + */ + getUISchema(): Record; +} diff --git a/packages/shared/dist/map.js b/packages/shared/dist/map.js new file mode 100644 index 00000000..ef75c509 --- /dev/null +++ b/packages/shared/dist/map.js @@ -0,0 +1,102 @@ +import { z } from 'zod/v4'; +/* +* Manages a collection of Zod schema properties + * and combines them into a single Zod object schema. + * + * @template MetaType The type of metadata you want to store for each field. + * Defaults to Record if not provided. + */ +export class ZodMetaMap { + fieldMap = new Map(); + /** + * Adds a Zod schema under a specific key (property name), + * optionally attaching typed metadata. + * + * @param key - The name of the property in the root object. + * @param schema - The Zod schema for that property. + * @param metadata - Optional metadata object (type MetaType). + */ + add(key, schema, metadata) { + this.fieldMap.set(key, { schema, metadata }); + return this; + } + /** + * Builds and returns a root Zod object + * that combines all properties which were added. + */ + root() { + const shape = {}; + for (const [key, { schema }] of this.fieldMap.entries()) { + shape[key] = schema; + } + return z.object(shape); + } + /** + * Retrieves the metadata for a specific key, if any. + */ + getMetadata(key) { + return this.fieldMap.get(key)?.metadata; + } + /** + * Static factory method: creates a SchemaMetaManager + * while letting you optionally specify the MetaType. + * + * Usage: + * const manager = SchemaMetaManager.create(); + */ + static create() { + return new ZodMetaMap(); + } + /** + * Returns a basic UiSchema object that RJSF can use to render form controls. + * + * - Adds a top-level "ui:submitButtonOptions" (example). + * - For each field, we set `ui:title` (uppercase key), + * `ui:description` (from Zod's .describe() if available), + * and a naive placeholder from the default value (if parse(undefined) succeeds). + */ + getUISchema() { + // Start with some top-level UI schema config (optional) + const uiSchema = { + 'ui:submitButtonOptions': { + props: { + disabled: false, + className: 'btn btn-info', + }, + norender: false, + submitText: 'Submit', + }, + }; + for (const [key, { schema }] of this.fieldMap.entries()) { + let fieldUi = {}; + // Use the Zod description if available + // (Accessing `._def.description` is private/hacky, but commonly done.) + const sAny = schema; + if (sAny?._def?.description) { + fieldUi['ui:description'] = sAny._def.description; + } + // RJSF usually reads 'title' from JSON schema. But if you want + // to override it in UI schema, you can do so: + fieldUi['ui:title'] = key + .replace(/([A-Z])/g, ' $1') // insert space before capital letters + .replace(/^./, (str) => str.toUpperCase()) // capitalize the first letter + .trim(); + // If the Zod schema allows a default, we can parse(undefined) to get it. + try { + const defaultVal = schema.parse(undefined); + // There's no official 'ui:default' in RJSF, but you could do a placeholder: + fieldUi['ui:placeholder'] = defaultVal; + } + catch { + // no default + } + fieldUi = { + ...fieldUi, + ...this.getMetadata(key), + }; + uiSchema[key] = fieldUi; + } + return uiSchema; + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUF5QixNQUFNLFFBQVEsQ0FBQztBQUNsRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNYLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFHdkIsQ0FBQztJQUVKOzs7Ozs7O09BT0c7SUFDSCxHQUFHLENBQXVCLEdBQVcsRUFBRSxNQUFTLEVBQUUsUUFBbUI7UUFDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUk7UUFDQSxNQUFNLEtBQUssR0FBK0IsRUFBRSxDQUFDO1FBQzdDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3RELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDeEIsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsR0FBVztRQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLE1BQU07UUFDVCxPQUFPLElBQUksVUFBVSxFQUFNLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxXQUFXO1FBQ1Asd0RBQXdEO1FBQ3hELE1BQU0sUUFBUSxHQUE0QjtZQUN0Qyx3QkFBd0IsRUFBRTtnQkFDdEIsS0FBSyxFQUFFO29CQUNILFFBQVEsRUFBRSxLQUFLO29CQUNmLFNBQVMsRUFBRSxjQUFjO2lCQUM1QjtnQkFDRCxRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsUUFBUTthQUN2QjtTQUNKLENBQUM7UUFFRixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN0RCxJQUFJLE9BQU8sR0FBNEIsRUFBRSxDQUFDO1lBQzFDLHVDQUF1QztZQUN2Qyx1RUFBdUU7WUFDdkUsTUFBTSxJQUFJLEdBQUcsTUFBYSxDQUFDO1lBQzNCLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDdEQsQ0FBQztZQUVELCtEQUErRDtZQUMvRCw4Q0FBOEM7WUFDOUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUc7aUJBQ3BCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsc0NBQXNDO2lCQUNqRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyw4QkFBOEI7aUJBQ3hFLElBQUksRUFBRSxDQUFDO1lBRVoseUVBQXlFO1lBQ3pFLElBQUksQ0FBQztnQkFDRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzQyw0RUFBNEU7Z0JBQzVFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUMzQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNMLGFBQWE7WUFDakIsQ0FBQztZQUNELE9BQU8sR0FBRztnQkFDTixHQUFHLE9BQU87Z0JBQ1YsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQzthQUMzQixDQUFBO1lBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKIn0= \ No newline at end of file diff --git a/packages/shared/package-lock.json b/packages/shared/package-lock.json new file mode 100644 index 00000000..bdab49e4 --- /dev/null +++ b/packages/shared/package-lock.json @@ -0,0 +1,151 @@ +{ + "name": "@polymech/shared", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@polymech/shared", + "version": "1.0.0", + "dependencies": { + "@hono/zod-openapi": "^1.1.5", + "@polymech/commons": "file:../../../polymech-mono/packages/commons" + }, + "devDependencies": { + "typescript": "^5.0.0", + "zod": "^4.1.12" + } + }, + "../../../polymech-mono/packages/commons": { + "name": "@polymech/commons", + "version": "0.2.6", + "license": "BSD", + "dependencies": { + "@polymech/core": "file:../core", + "@polymech/fs": "file:../fs", + "@repo/typescript-config": "file:../typescript-config", + "@schemastore/package": "^0.0.10", + "env-var": "^7.5.0", + "glob": "^10.4.5", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^10.3.0", + "normalize-url": "^8.0.1", + "p-map": "^7.0.3", + "p-throttle": "^4.1.1", + "regedit": "^5.1.4", + "tslog": "^3.3.3", + "tsup": "^2.0.3", + "yargs": "^17.7.2", + "zod": "^3.24.3", + "zod-to-json-schema": "^3.24.5", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "pm-cli": "dist/main.js" + }, + "devDependencies": { + "@types/node": "^22.12.0", + "typescript": "^5.7.3" + } + }, + "node_modules/@asteasolutions/zod-to-openapi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@asteasolutions/zod-to-openapi/-/zod-to-openapi-8.1.0.tgz", + "integrity": "sha512-tQFxVs05J/6QXXqIzj6rTRk3nj1HFs4pe+uThwE95jL5II2JfpVXkK+CqkO7aT0Do5AYqO6LDrKpleLUFXgY+g==", + "license": "MIT", + "dependencies": { + "openapi3-ts": "^4.1.2" + }, + "peerDependencies": { + "zod": "^4.0.0" + } + }, + "node_modules/@hono/zod-openapi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@hono/zod-openapi/-/zod-openapi-1.1.5.tgz", + "integrity": "sha512-EAnY6ad4yt/MUKHx716BEGGOXSl5d0/FOLozOYB/pmSEFq07qrzefKFtBEMAgd3hlpJXjH+4lwgTtlAo+BGBgQ==", + "license": "MIT", + "dependencies": { + "@asteasolutions/zod-to-openapi": "^8.1.0", + "@hono/zod-validator": "^0.7.4", + "openapi3-ts": "^4.5.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "hono": ">=4.3.6", + "zod": "^4.0.0" + } + }, + "node_modules/@hono/zod-validator": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@hono/zod-validator/-/zod-validator-0.7.5.tgz", + "integrity": "sha512-n4l4hutkfYU07PzRUHBOVzUEn38VSfrh+UVE5d0w4lyfWDOEhzxIupqo5iakRiJL44c3vTuFJBvcmUl8b9agIA==", + "license": "MIT", + "peerDependencies": { + "hono": ">=3.9.0", + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/@polymech/commons": { + "resolved": "../../../polymech-mono/packages/commons", + "link": true + }, + "node_modules/hono": { + "version": "4.10.6", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.10.6.tgz", + "integrity": "sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/openapi3-ts": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.5.0.tgz", + "integrity": "sha512-jaL+HgTq2Gj5jRcfdutgRGLosCy/hT8sQf6VOy+P+g36cZOjI1iukdPnijC+4CmeRzg/jEllJUboEic2FhxhtQ==", + "license": "MIT", + "dependencies": { + "yaml": "^2.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 00000000..8bdb671c --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,22 @@ +{ + "name": "@polymech/shared", + "version": "1.0.0", + "main": "dist/index.js", + "type": "module", + "types": "dist/index.d.ts", + "exports": { + ".": "./dist/index.js" + }, + "scripts": { + "build": "tsc", + "dev": "tsc -w" + }, + "devDependencies": { + "typescript": "^5.0.0", + "zod": "^4.1.12" + }, + "dependencies": { + "@hono/zod-openapi": "^1.1.5", + "@polymech/commons": "file:../../../polymech-mono/packages/commons" + } +} diff --git a/packages/shared/src/competitors/schemas.ts b/packages/shared/src/competitors/schemas.ts new file mode 100644 index 00000000..57b0dd03 --- /dev/null +++ b/packages/shared/src/competitors/schemas.ts @@ -0,0 +1,332 @@ +import { z } from 'zod/v4' + +import { ZodMetaMap } from '../map.js'; + +import { extendZodWithOpenApi } from '@hono/zod-openapi'; + +extendZodWithOpenApi(z); + +export const CompetitorSchema = z.object({ + place_id: z.string(), + title: z.string(), + description: z.string().optional().nullable(), + address: z.string().optional().nullable(), + gps_coordinates: z.object({ + latitude: z.number(), + longitude: z.number(), + }).optional().nullable(), + phone: z.string().optional().nullable(), + website: z.string().optional().nullable(), + operating_hours: z.record(z.string(), z.any()).optional().nullable(), + thumbnail: z.string().optional().nullable(), + types: z.array(z.string()).optional().nullable(), + continent: z.string().optional().nullable(), + country: z.string().optional().nullable(), + city: z.string().optional().nullable(), + updated_at: z.string().optional().nullable(), + raw_data: z.record(z.string(), z.any()).optional().nullable() +}) + +// Shared schemas +export const GpsCoordinatesSchema = z.object({ + latitude: z.number(), + longitude: z.number() +}) + +export const OperatingHoursSchema = z.object({ + sunday: z.string(), + monday: z.string(), + tuesday: z.string(), + wednesday: z.string(), + thursday: z.string(), + friday: z.string(), + saturday: z.string() +}) + +// Extension schemas +export const AccessibilityExtensionSchema = z.object({ + accessibility: z.array(z.string()) +}) + +export const CrowdExtensionSchema = z.object({ + crowd: z.array(z.string()) +}) + +export const ExtensionsSchema = z.array( + z.union([AccessibilityExtensionSchema, CrowdExtensionSchema]) +) + +// Locality info schemas +export const AdministrativeAreaFullSchema = z.object({ + name: z.string(), + description: z.string(), + isoName: z.string(), + order: z.number(), + adminLevel: z.number(), + isoCode: z.string(), + wikidataId: z.string(), + geonameId: z.number() +}) + +export const AdministrativeAreaMinimalSchema = z.object({ + name: z.string(), + order: z.number(), + adminLevel: z.number() +}) + +export const AdministrativeAreaWithWikidataSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number(), + adminLevel: z.number(), + wikidataId: z.string() +}) + +export const AdministrativeAreaWithGeonameSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number(), + adminLevel: z.number(), + wikidataId: z.string(), + geonameId: z.number() +}) + +export const InformativeAreaFullSchema = z.object({ + name: z.string(), + description: z.string(), + isoName: z.string(), + order: z.number(), + isoCode: z.string(), + wikidataId: z.string(), + geonameId: z.number() +}) + +export const InformativeAreaBasicSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number() +}) + +export const InformativeAreaWithGeonameSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number(), + wikidataId: z.string(), + geonameId: z.number() +}) + +export const InformativeAreaWithWikidataSchema = z.object({ + name: z.string(), + description: z.string(), + order: z.number(), + wikidataId: z.string() +}) + +export const InformativeAreaMinimalSchema = z.object({ + name: z.string(), + order: z.number() +}) + +export const LocalityInfoSchema = z.object({ + administrative: z.array( + z.union([ + AdministrativeAreaFullSchema, + AdministrativeAreaMinimalSchema, + AdministrativeAreaWithWikidataSchema, + AdministrativeAreaWithGeonameSchema + ]) + ), + informative: z.array( + z.union([ + InformativeAreaFullSchema, + InformativeAreaBasicSchema, + InformativeAreaWithGeonameSchema, + InformativeAreaWithWikidataSchema, + InformativeAreaMinimalSchema + ]) + ) +}) + +// Geo schema +export const GeoSchema = z.object({ + latitude: z.number(), + longitude: z.number(), + localityLanguageRequested: z.string(), + continent: z.string(), + continentCode: z.string(), + countryName: z.string(), + countryCode: z.string(), + principalSubdivision: z.string(), + principalSubdivisionCode: z.string(), + city: z.string(), + locality: z.string(), + postcode: z.string(), + plusCode: z.string(), + localityInfo: LocalityInfoSchema +}) + +// Google Media schemas +export const SearchMetadataSchema = z.object({ + id: z.string(), + status: z.string(), + json_endpoint: z.string(), + created_at: z.string(), + processed_at: z.string(), + google_maps_photos_url: z.string(), + raw_html_file: z.string(), + prettify_html_file: z.string(), + total_time_taken: z.number() +}) + +export const SearchParametersSchema = z.object({ + engine: z.string(), + data_id: z.string(), + hl: z.string() +}) + +export const CategorySchema = z.object({ + title: z.string(), + id: z.string() +}) + +export const PhotoSchema = z.object({ + thumbnail: z.string(), + image: z.string(), + photo_meta_serpapi_link: z.string() +}) + +export const SerpapiPaginationSchema = z.object({ + next: z.string(), + next_page_token: z.string() +}) + +export const GoogleMediaSchema = z.object({ + search_metadata: SearchMetadataSchema, + search_parameters: SearchParametersSchema, + categories: z.array(CategorySchema), + photos: z.array(PhotoSchema), + serpapi_pagination: SerpapiPaginationSchema +}) + +// Raw data schema +export const LocationSchema = z.object({ + position: z.number(), + title: z.string(), + description: z.string(), + place_id: z.string(), + data_id: z.string(), + data_cid: z.string(), + reviews_link: z.string(), + photos_link: z.string(), + gps_coordinates: GpsCoordinatesSchema, + place_id_search: z.string(), + provider_id: z.string(), + type: z.string(), + types: z.array(z.string()), + type_id: z.string(), + type_ids: z.array(z.string()), + address: z.string(), + open_state: z.string(), + hours: z.string(), + operating_hours: OperatingHoursSchema, + phone: z.string(), + website: z.string(), + extensions: ExtensionsSchema, + thumbnail: z.string(), + serpapi_thumbnail: z.string(), + page: z.number(), + geo: GeoSchema, + meta: z.record(z.string(), z.any()), + google_media: GoogleMediaSchema +}).partial() + +// Main CompetitorSchemaFull +export const CompetitorSchemaFull = z.object({ + place_id: z.string(), + title: z.string(), + address: z.string().optional().nullable(), + gps_coordinates: GpsCoordinatesSchema.optional().nullable(), + phone: z.string().optional().nullable(), + website: z.string().optional().nullable(), + operating_hours: OperatingHoursSchema.optional().nullable(), + thumbnail: z.string().optional().nullable(), + types: z.array(z.string()).optional().nullable(), + raw_data: LocationSchema.optional().nullable(), + continent: z.string().optional().nullable(), + country: z.string().optional().nullable(), + city: z.string().optional().nullable(), + updated_at: z.string().optional().nullable() +}) + + +export const CompetitorResponseSchema = z.object({ + message: z.string(), + data: z.array(CompetitorSchemaFull).optional(), +}) + +export const CompetitorDetailResponseSchema = z.object({ + message: z.string(), + data: CompetitorSchemaFull.optional(), +}) + +export type Competitor = z.infer; +export type CompetitorResponse = z.infer; +export type CompetitorDetailResponse = z.infer; +export type CompetitorFull = z.infer; + + +export type OptionsSchemaMeta = Record + +let schemaMap: ZodMetaMap; + +export const CompetitorRequestSchemaMap = () => { + schemaMap = ZodMetaMap.create() + schemaMap.add( + 'location', + z.string().default('dresden, germany') as any + , { 'ui:group': 'Search Parameters' }) + .add( + 'query', + z.string().default('plastichub') as any + , { 'ui:group': 'Search Parameters' }) + .add( + 'filterCity', + z.string().optional() as any + , { 'ui:group': 'Filters' }) + .add( + 'filterContinent', + z.string().optional() as any + , { 'ui:group': 'Filters' }) + .add( + 'filterCountry', + z.string().optional() as any + , { 'ui:group': 'Filters' }) + .add( + 'filterType', + z.string().optional() as any + , { 'ui:group': 'Filters' }) + .add( + 'excludedTypes', + z.array(z.string()).optional() as any + , { 'ui:group': 'Filters' }) + .add( + 'concurrency', + z.string().optional().default('5') as any + , { 'ui:group': 'Settings' }) + .add( + 'refresh', + z.boolean().optional().default(false) as any + , { 'ui:group': 'Settings' }) + .add( + 'limit', + z.string().optional().default('250') as any + , { 'ui:group': 'Settings' }) + + return schemaMap; +} + +export const CompetitorRequestSchema = CompetitorRequestSchemaMap().root() as any; +export const CompetitorUISchema = CompetitorRequestSchemaMap().getUISchema(); +export type LocationType = z.infer; +export type CompetitorRequest = z.infer; + diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 00000000..19a969ef --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1 @@ +export * from './competitors/schemas.js'; diff --git a/packages/shared/src/map.ts b/packages/shared/src/map.ts new file mode 100644 index 00000000..c31f0445 --- /dev/null +++ b/packages/shared/src/map.ts @@ -0,0 +1,111 @@ +import { z, ZodObject, ZodTypeAny } from 'zod/v4'; +/* +* Manages a collection of Zod schema properties + * and combines them into a single Zod object schema. + * + * @template MetaType The type of metadata you want to store for each field. + * Defaults to Record if not provided. + */ +export class ZodMetaMap> { + private fieldMap = new Map< + string, + { schema: ZodTypeAny; metadata?: MetaType } + >(); + + /** + * Adds a Zod schema under a specific key (property name), + * optionally attaching typed metadata. + * + * @param key - The name of the property in the root object. + * @param schema - The Zod schema for that property. + * @param metadata - Optional metadata object (type MetaType). + */ + add(key: string, schema: T, metadata?: MetaType): this { + this.fieldMap.set(key, { schema, metadata }); + return this; + } + + /** + * Builds and returns a root Zod object + * that combines all properties which were added. + */ + root(): ZodObject> { + const shape: Record = {}; + for (const [key, { schema }] of this.fieldMap.entries()) { + shape[key] = schema; + } + return z.object(shape); + } + + /** + * Retrieves the metadata for a specific key, if any. + */ + getMetadata(key: string): MetaType | undefined { + return this.fieldMap.get(key)?.metadata; + } + + /** + * Static factory method: creates a SchemaMetaManager + * while letting you optionally specify the MetaType. + * + * Usage: + * const manager = SchemaMetaManager.create(); + */ + static create>(): ZodMetaMap { + return new ZodMetaMap(); + } + + /** + * Returns a basic UiSchema object that RJSF can use to render form controls. + * + * - Adds a top-level "ui:submitButtonOptions" (example). + * - For each field, we set `ui:title` (uppercase key), + * `ui:description` (from Zod's .describe() if available), + * and a naive placeholder from the default value (if parse(undefined) succeeds). + */ + getUISchema(): Record { + // Start with some top-level UI schema config (optional) + const uiSchema: Record = { + 'ui:submitButtonOptions': { + props: { + disabled: false, + className: 'btn btn-info', + }, + norender: false, + submitText: 'Submit', + }, + }; + + for (const [key, { schema }] of this.fieldMap.entries()) { + let fieldUi: Record = {}; + // Use the Zod description if available + // (Accessing `._def.description` is private/hacky, but commonly done.) + const sAny = schema as any; + if (sAny?._def?.description) { + fieldUi['ui:description'] = sAny._def.description; + } + + // RJSF usually reads 'title' from JSON schema. But if you want + // to override it in UI schema, you can do so: + fieldUi['ui:title'] = key + .replace(/([A-Z])/g, ' $1') // insert space before capital letters + .replace(/^./, (str) => str.toUpperCase()) // capitalize the first letter + .trim(); + + // If the Zod schema allows a default, we can parse(undefined) to get it. + try { + const defaultVal = schema.parse(undefined); + // There's no official 'ui:default' in RJSF, but you could do a placeholder: + fieldUi['ui:placeholder'] = defaultVal; + } catch { + // no default + } + fieldUi = { + ...fieldUi, + ...this.getMetadata(key), + } + uiSchema[key] = fieldUi; + } + return uiSchema; + } +} diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 00000000..172b69a3 --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "declaration": true, + "moduleResolution": "NodeNext", + "outDir": "./dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "inlineSourceMap": true, + "experimentalDecorators": true + }, + "include": [ + "src/**/*" + ], + "files": [ + "src/index.ts" + ] +} \ No newline at end of file