@flamingo-stack/openframe-frontend-core 0.0.591 → 0.0.592
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-BQE4HTDR.js → chunk-2JNCZDJR.js} +2 -2
- package/dist/{chunk-YEKPHSWC.cjs → chunk-3JOBM57M.cjs} +22 -22
- package/dist/{chunk-YEKPHSWC.cjs.map → chunk-3JOBM57M.cjs.map} +1 -1
- package/dist/{chunk-WKOJL6A2.cjs → chunk-5LJZWTOE.cjs} +10 -10
- package/dist/{chunk-WKOJL6A2.cjs.map → chunk-5LJZWTOE.cjs.map} +1 -1
- package/dist/{chunk-NXYOUBOL.cjs → chunk-5MHDMDPX.cjs} +21 -21
- package/dist/{chunk-NXYOUBOL.cjs.map → chunk-5MHDMDPX.cjs.map} +1 -1
- package/dist/{chunk-U2XRBHBX.js → chunk-6GMMR667.js} +9 -9
- package/dist/{chunk-WIMGAPVH.js → chunk-ASFEUMFW.js} +4 -4
- package/dist/{chunk-4UP2SGSO.js → chunk-AUA6OSU7.js} +3 -3
- package/dist/{chunk-YMAHVHCX.cjs → chunk-BZEWPW5A.cjs} +3 -3
- package/dist/{chunk-YMAHVHCX.cjs.map → chunk-BZEWPW5A.cjs.map} +1 -1
- package/dist/{chunk-SW3CZ2KS.cjs → chunk-COY57SZP.cjs} +129 -84
- package/dist/chunk-COY57SZP.cjs.map +1 -0
- package/dist/{chunk-VGBTCUPG.js → chunk-CRW4WRMH.js} +2 -2
- package/dist/{chunk-E455M3WJ.js → chunk-F543W3F2.js} +4 -4
- package/dist/{chunk-ZZF6Z7KB.cjs → chunk-FKXDDJEQ.cjs} +11 -11
- package/dist/{chunk-ZZF6Z7KB.cjs.map → chunk-FKXDDJEQ.cjs.map} +1 -1
- package/dist/{chunk-RGCBUNMJ.js → chunk-FSCQOWXI.js} +2 -2
- package/dist/{chunk-USDG6IWK.cjs → chunk-FVADHGDP.cjs} +7 -7
- package/dist/{chunk-USDG6IWK.cjs.map → chunk-FVADHGDP.cjs.map} +1 -1
- package/dist/{chunk-OKWGSJAI.js → chunk-GGQZBSFN.js} +1 -1
- package/dist/chunk-GGQZBSFN.js.map +1 -0
- package/dist/{chunk-RNXY35DZ.cjs → chunk-H64ZHSYR.cjs} +1 -1
- package/dist/chunk-H64ZHSYR.cjs.map +1 -0
- package/dist/{chunk-OS72RV57.cjs → chunk-HGEA6PW7.cjs} +3 -3
- package/dist/{chunk-OS72RV57.cjs.map → chunk-HGEA6PW7.cjs.map} +1 -1
- package/dist/{chunk-ZFHIMK4W.js → chunk-JIINHJIT.js} +5 -5
- package/dist/{chunk-CWO3YFVZ.js → chunk-LRQCKSZC.js} +2 -2
- package/dist/{chunk-LL6J6N76.js → chunk-LXD2QJFG.js} +3 -3
- package/dist/{chunk-2TJSDSXW.js → chunk-MOHSA65M.js} +2 -2
- package/dist/{chunk-JHVCH3CK.cjs → chunk-NEFNARFF.cjs} +6 -6
- package/dist/{chunk-JHVCH3CK.cjs.map → chunk-NEFNARFF.cjs.map} +1 -1
- package/dist/{chunk-XK7SLEZB.cjs → chunk-NICIJRZ4.cjs} +3 -3
- package/dist/{chunk-XK7SLEZB.cjs.map → chunk-NICIJRZ4.cjs.map} +1 -1
- package/dist/{chunk-LUWFLC3T.js → chunk-NYH3NVUF.js} +3 -3
- package/dist/{chunk-BOED5ISE.js → chunk-NZQYZKIN.js} +6 -6
- package/dist/{chunk-AZ4A4RBL.cjs → chunk-O4VGEJ7I.cjs} +60 -60
- package/dist/{chunk-AZ4A4RBL.cjs.map → chunk-O4VGEJ7I.cjs.map} +1 -1
- package/dist/{chunk-B7ZCBGUN.cjs → chunk-O4VZOA2Q.cjs} +3 -3
- package/dist/{chunk-B7ZCBGUN.cjs.map → chunk-O4VZOA2Q.cjs.map} +1 -1
- package/dist/{chunk-QVAKJB64.js → chunk-OO6AMBHV.js} +2 -2
- package/dist/{chunk-U3V4TPT5.js → chunk-R25AUM2R.js} +3 -3
- package/dist/{chunk-VGY7D6LG.cjs → chunk-STYNZ4QM.cjs} +3 -3
- package/dist/{chunk-VGY7D6LG.cjs.map → chunk-STYNZ4QM.cjs.map} +1 -1
- package/dist/{chunk-FHKP4H6N.cjs → chunk-TQMZFXWZ.cjs} +5 -5
- package/dist/{chunk-FHKP4H6N.cjs.map → chunk-TQMZFXWZ.cjs.map} +1 -1
- package/dist/{chunk-AMCARR6Y.cjs → chunk-V7RUX5CX.cjs} +15 -15
- package/dist/{chunk-AMCARR6Y.cjs.map → chunk-V7RUX5CX.cjs.map} +1 -1
- package/dist/{chunk-CXILZQFT.cjs → chunk-W2RUBABW.cjs} +19 -19
- package/dist/{chunk-CXILZQFT.cjs.map → chunk-W2RUBABW.cjs.map} +1 -1
- package/dist/{chunk-DKVNW2QD.cjs → chunk-WOGLPNK3.cjs} +3 -3
- package/dist/{chunk-DKVNW2QD.cjs.map → chunk-WOGLPNK3.cjs.map} +1 -1
- package/dist/{chunk-HV6MO4HG.cjs → chunk-WP3AVAMP.cjs} +37 -37
- package/dist/{chunk-HV6MO4HG.cjs.map → chunk-WP3AVAMP.cjs.map} +1 -1
- package/dist/{chunk-ZYA6274A.js → chunk-WVHQQ3NY.js} +87 -42
- package/dist/chunk-WVHQQ3NY.js.map +1 -0
- package/dist/{chunk-WMZ5AUTB.js → chunk-WZJOILPU.js} +2 -2
- package/dist/{chunk-ALTSOKHP.js → chunk-XHDBU5EI.js} +2 -2
- package/dist/{chunk-T6RY2MC6.js → chunk-XNGE5EE5.js} +8 -8
- package/dist/{chunk-5SJSG5RV.cjs → chunk-YBENO4XG.cjs} +8 -8
- package/dist/{chunk-5SJSG5RV.cjs.map → chunk-YBENO4XG.cjs.map} +1 -1
- package/dist/{chunk-OBJEFMOI.cjs → chunk-ZT2Z2BYH.cjs} +66 -66
- package/dist/{chunk-OBJEFMOI.cjs.map → chunk-ZT2Z2BYH.cjs.map} +1 -1
- package/dist/{chunk-BATTVHZT.js → chunk-ZZHHKE2Q.js} +3 -3
- package/dist/components/case-studies/index.cjs +10 -10
- package/dist/components/case-studies/index.js +4 -4
- package/dist/components/contact/index.cjs +5 -5
- package/dist/components/contact/index.js +4 -4
- package/dist/components/docs/index.cjs +8 -8
- package/dist/components/docs/index.js +7 -7
- package/dist/components/embeds/index.cjs +5 -5
- package/dist/components/embeds/index.js +4 -4
- package/dist/components/faq/index.cjs +6 -6
- package/dist/components/faq/index.js +5 -5
- package/dist/components/features/index.cjs +4 -4
- package/dist/components/features/index.js +3 -3
- package/dist/components/help-center-pages/index.cjs +27 -27
- package/dist/components/help-center-pages/index.js +18 -18
- package/dist/components/index.cjs +40 -40
- package/dist/components/index.js +18 -18
- package/dist/components/meeting-scheduler/index.cjs +31 -31
- package/dist/components/meeting-scheduler/index.js +5 -5
- package/dist/components/navigation/index.cjs +7 -7
- package/dist/components/navigation/index.js +6 -6
- package/dist/components/onboarding-guides/index.cjs +8 -8
- package/dist/components/onboarding-guides/index.js +7 -7
- package/dist/components/related-content/index.cjs +4 -4
- package/dist/components/related-content/index.js +3 -3
- package/dist/components/tickets/index.cjs +9 -9
- package/dist/components/tickets/index.js +8 -8
- package/dist/components/ui/data-table/data-table-body.d.ts +18 -1
- package/dist/components/ui/data-table/data-table-body.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-row.d.ts +8 -1
- package/dist/components/ui/data-table/data-table-row.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-skeleton.d.ts +8 -1
- package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
- package/dist/components/ui/data-table/index.d.ts +1 -1
- package/dist/components/ui/entity-image.d.ts +12 -1
- package/dist/components/ui/entity-image.d.ts.map +1 -1
- package/dist/components/ui/index.cjs +4 -4
- package/dist/components/ui/index.js +3 -3
- package/dist/hooks/index.cjs +3 -3
- package/dist/hooks/index.js +2 -2
- package/dist/index.cjs +8 -8
- package/dist/index.js +7 -7
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/search-params.cjs.map +1 -1
- package/dist/utils/search-params.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/data-table-row-height.test.tsx +139 -0
- package/src/__tests__/mlg-platform-leaves.test.ts +1 -1
- package/src/components/ui/data-table/data-table-body.tsx +37 -7
- package/src/components/ui/data-table/data-table-row.tsx +24 -6
- package/src/components/ui/data-table/data-table-skeleton.tsx +24 -3
- package/src/components/ui/entity-image.tsx +19 -3
- package/src/hooks/state/__tests__/use-api-params.test.ts +1 -1
- package/src/utils/search-params.ts +4 -4
- package/dist/chunk-OKWGSJAI.js.map +0 -1
- package/dist/chunk-RNXY35DZ.cjs.map +0 -1
- package/dist/chunk-SW3CZ2KS.cjs.map +0 -1
- package/dist/chunk-ZYA6274A.js.map +0 -1
- /package/dist/{chunk-BQE4HTDR.js.map → chunk-2JNCZDJR.js.map} +0 -0
- /package/dist/{chunk-U2XRBHBX.js.map → chunk-6GMMR667.js.map} +0 -0
- /package/dist/{chunk-WIMGAPVH.js.map → chunk-ASFEUMFW.js.map} +0 -0
- /package/dist/{chunk-4UP2SGSO.js.map → chunk-AUA6OSU7.js.map} +0 -0
- /package/dist/{chunk-VGBTCUPG.js.map → chunk-CRW4WRMH.js.map} +0 -0
- /package/dist/{chunk-E455M3WJ.js.map → chunk-F543W3F2.js.map} +0 -0
- /package/dist/{chunk-RGCBUNMJ.js.map → chunk-FSCQOWXI.js.map} +0 -0
- /package/dist/{chunk-ZFHIMK4W.js.map → chunk-JIINHJIT.js.map} +0 -0
- /package/dist/{chunk-CWO3YFVZ.js.map → chunk-LRQCKSZC.js.map} +0 -0
- /package/dist/{chunk-LL6J6N76.js.map → chunk-LXD2QJFG.js.map} +0 -0
- /package/dist/{chunk-2TJSDSXW.js.map → chunk-MOHSA65M.js.map} +0 -0
- /package/dist/{chunk-LUWFLC3T.js.map → chunk-NYH3NVUF.js.map} +0 -0
- /package/dist/{chunk-BOED5ISE.js.map → chunk-NZQYZKIN.js.map} +0 -0
- /package/dist/{chunk-QVAKJB64.js.map → chunk-OO6AMBHV.js.map} +0 -0
- /package/dist/{chunk-U3V4TPT5.js.map → chunk-R25AUM2R.js.map} +0 -0
- /package/dist/{chunk-WMZ5AUTB.js.map → chunk-WZJOILPU.js.map} +0 -0
- /package/dist/{chunk-ALTSOKHP.js.map → chunk-XHDBU5EI.js.map} +0 -0
- /package/dist/{chunk-T6RY2MC6.js.map → chunk-XNGE5EE5.js.map} +0 -0
- /package/dist/{chunk-BATTVHZT.js.map → chunk-ZZHHKE2Q.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/search-params.ts","../src/utils/embed-content-fetch.ts"],"sourcesContent":["/**\n * URL parameter schema engine — the ONE grammar for every URL/API integer,\n * the ONE omission rule, the ONE serializer.\n *\n * Hoisted out of `hooks/state/` so SERVER code (route handlers, DALs) and the\n * CLIENT hook parse the same URL with the same function: a param contract that\n * disagrees across the wire is the bug class this removes. JSX-free leaf with\n * its own `exports` subpath; `hooks/state/*` re-exports every name it used to own.\n */\n\n/** JavaScript types a URL parameter can carry. `int` is a whole number with a floor. */\nexport type JSType = 'string' | 'number' | 'int' | 'boolean' | 'array' | 'object';\n\n// ── The integer grammar ─────────────────────────────────────────────────────\n\nexport interface PositiveIntOptions {\n /** Smallest accepted value (default 1). Anything below falls back. */\n min?: number;\n /** Largest accepted value. Applied to the PARSED value AND to the fallback. */\n max?: number;\n}\n\n/**\n * THE integer grammar for URL params, env vars, and page sizes.\n *\n * `null`/`undefined`/`''` → fallback. Otherwise `Math.trunc(Number(raw))`, which\n * accepts `'12'`, `12`, `'12.9'` (→ 12) and `'0x10'` (→ 16), and rejects `'12abc'`\n * and `'abc'` (`NaN`) — the historical `parseInt` accepted `'12abc'` as 12 and\n * produced `NaN` for `'abc'`. A value below `min` falls back. The RESULT (parsed\n * value or fallback alike) is clamped to `max`, so \"never exceeds max\" has one owner.\n */\nexport function positiveInt<TFallback = number>(\n raw: string | number | null | undefined,\n fallback: TFallback,\n { min = 1, max }: PositiveIntOptions = {},\n): number | TFallback {\n // The fallback is returned AS GIVEN — capping only ever applies to a value\n // parsed out of the input, so a caller with no default (`null`) gets its\n // sentinel back untouched instead of `Math.min(null, max)`.\n const capped = (v: number) => (max == null ? v : Math.min(v, max));\n if (raw === null || raw === undefined || raw === '') {\n return typeof fallback === 'number' ? (capped(fallback) as number | TFallback) : fallback;\n }\n const n = Math.trunc(Number(raw));\n if (!Number.isFinite(n) || n < min) {\n return typeof fallback === 'number' ? (capped(fallback) as number | TFallback) : fallback;\n }\n return capped(n);\n}\n\n/** Ceilings every paged surface shares. */\nexport const PAGE_PARAM_LIMITS = { maxPage: 10_000, maxPageSize: 100 } as const;\n\n/** Total pages for a row count. Floors at 1, so an empty result is still \"page 1 of 1\". */\nexport function pageCount(total: number, pageSize: number): number {\n if (!Number.isFinite(total) || !Number.isFinite(pageSize) || pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(total / pageSize));\n}\n\n/** Clamp a requested page into `1..totalPages`. */\nexport function clampPageToTotal(page: number, totalPages: number): number {\n return Math.min(page, Math.max(1, totalPages));\n}\n\n// ── Schema ──────────────────────────────────────────────────────────────────\n\ntype OutputTypeMap = {\n string: string;\n number: number;\n int: number;\n boolean: boolean;\n array: string[];\n object: Record<string, unknown>;\n};\n\nexport type OutputTypeForJSType<T extends JSType> = OutputTypeMap[T];\n\nexport interface BaseParamConfig<T extends JSType = JSType> {\n type: T;\n default?: OutputTypeMap[T];\n required?: boolean;\n}\n\n/** An integer parameter with an optional floor and ceiling. */\nexport interface IntParamConfig extends BaseParamConfig<'int'> {\n min?: number;\n max?: number;\n}\n\nexport type ParamConfig<T extends JSType = JSType> = T extends 'int' ? IntParamConfig : BaseParamConfig<T>;\n\nexport type ParamSchema = Record<string, ParamConfig>;\n\n/** Identity helper that preserves literal types through a schema object. */\nexport function defineParamSchema<T extends ParamSchema>(schema: T): T {\n return schema;\n}\n\n/**\n * Build a `Record<K, V>` from a key tuple. Keeps `keyof` EXACT when spreading a\n * shared config across derived keys (an inline `Object.fromEntries` widens to\n * `Record<string, V>` and loses the key union).\n */\nexport function fromKeys<K extends string, V>(keys: readonly K[], value: V): Record<K, V> {\n return Object.fromEntries(keys.map(k => [k, value])) as Record<K, V>;\n}\n\n// ── Reading ─────────────────────────────────────────────────────────────────\n\n/** Anything a URL can be read from: `URLSearchParams`, Next's `searchParams`, or a plain record. */\nexport type ParamInput = URLSearchParams | Record<string, string | string[] | undefined> | null | undefined;\n\n/** THE first-value rule for a duplicated key (`?a=1&a=2` reads as `1`). */\nexport function firstParamValue(input: ParamInput, key: string): string | undefined {\n if (!input) return undefined;\n if (input instanceof URLSearchParams) return input.get(key) ?? undefined;\n const value = input[key];\n return Array.isArray(value) ? value[0] : value;\n}\n\n/** Every value for a key (arrays read repeated params, then a `,`-joined single value). */\nfunction allParamValues(input: ParamInput, key: string): string[] {\n if (!input) return [];\n const raw = input instanceof URLSearchParams ? input.getAll(key) : input[key];\n const list = Array.isArray(raw) ? raw : raw === undefined ? [] : [raw];\n if (list.length === 1 && list[0]?.includes(',')) return list[0].split(',').filter(Boolean);\n return list.filter(v => v !== undefined && v !== '');\n}\n\nexport interface ParseSchemaOptions {\n /**\n * What an ABSENT scalar with no declared `default` resolves to.\n * `'undefined'` (default) keeps today's behaviour; `'null'` is the explicit\n * \"this filter is unset\" spelling that survives JSON and `URLSearchParams`.\n */\n absent?: 'undefined' | 'null';\n}\n\nexport type AbsentValue<Opts extends ParseSchemaOptions | undefined> = Opts extends { absent: 'null' }\n ? null\n : undefined;\n\n/**\n * The parsed shape of a schema: keys with a `default` and every array key are\n * non-nullable; an undefaulted scalar carries the caller's absent value.\n */\nexport type InferParsedParams<TSchema extends ParamSchema, Absent = undefined> = {\n [K in keyof TSchema]: TSchema[K] extends { type: 'array' }\n ? string[]\n : TSchema[K] extends { default: infer D }\n ? D\n : TSchema[K]['type'] extends infer T\n ? T extends JSType\n ? OutputTypeForJSType<T> | Absent\n : never\n : never;\n};\n\nfunction coerceScalar(raw: string | undefined, config: ParamConfig): unknown {\n if (raw === undefined || raw === '') return undefined;\n switch (config.type) {\n case 'int': {\n const int = config as IntParamConfig;\n // ONE integer grammar, default or not. Without a declared default the\n // fallback is `undefined` (an unparseable value is absent), which\n // `positiveInt` returns untouched — the branch used to open-code the\n // truncation, the min floor and the max clamp a second time.\n return positiveInt<undefined>(raw, int.default as undefined, { min: int.min, max: int.max });\n }\n case 'number': {\n const n = Number(raw);\n return Number.isFinite(n) ? n : undefined;\n }\n case 'boolean':\n return raw === 'true' || raw === '1';\n case 'object':\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n default:\n return raw;\n }\n}\n\n/**\n * Parse a URL into a schema's shape. THE reader — the server route and the\n * client hook both call this, so a URL means exactly one thing.\n *\n * PRECEDENCE: an absent or empty SCALAR takes the declared `default` when there\n * is one, else the `absent` value. ARRAY keys never take `absent`: they are `[]`.\n */\nexport function parseSchemaParams<TSchema extends ParamSchema, Opts extends ParseSchemaOptions = Record<string, never>>(\n schema: TSchema,\n input: ParamInput,\n options?: Opts,\n): InferParsedParams<TSchema, AbsentValue<Opts>> {\n const absent = options?.absent === 'null' ? null : undefined;\n const out: Record<string, unknown> = {};\n for (const [key, config] of Object.entries(schema)) {\n if (config.type === 'array') {\n const values = allParamValues(input, key);\n out[key] = values.length > 0 ? values : ((config.default as string[] | undefined) ?? []);\n continue;\n }\n const coerced = coerceScalar(firstParamValue(input, key), config);\n out[key] = coerced !== undefined ? coerced : (config.default ?? absent);\n }\n return out as InferParsedParams<TSchema, AbsentValue<Opts>>;\n}\n\n// ── Writing ─────────────────────────────────────────────────────────────────\n\n/**\n * A schema entry OR a legacy flattened param (which spells its default\n * `defaultValue`).\n *\n * A UNION, not a bag of two optional fields: with only `default?` and\n * `defaultValue?` this is a WEAK TYPE, and TypeScript rejects any argument\n * sharing neither — including `{ type: 'string' }`, the single most common\n * schema entry there is. Naming the real config shapes fixes that without an\n * index signature, which `FlattenedParam` (an interface) could never satisfy.\n */\ntype OmissionConfig = ParamConfig | { default?: unknown; defaultValue?: unknown };\n\n/**\n * THE omission rule: `null`, `undefined`, `''`, `[]`, and a value equal to the\n * declared default are left out, so a URL only ever carries what differs.\n */\nexport function shouldIncludeInUrl(value: unknown, config: OmissionConfig | undefined): boolean {\n if (value === null || value === undefined) return false;\n if (Array.isArray(value) && value.length === 0) return false;\n if (value === '') return false;\n // `in` narrowing rather than a cast: the union's members genuinely differ —\n // a schema entry spells its default `default`, a flattened param spells it\n // `defaultValue`, and neither is obliged to carry the other's field.\n const fromDefault = config && 'default' in config ? config.default : undefined;\n const fromLegacy = config && 'defaultValue' in config ? config.defaultValue : undefined;\n const declared = fromDefault !== undefined ? fromDefault : fromLegacy;\n if (declared !== undefined && value === declared) return false;\n return true;\n}\n\nexport interface CreateSearchParamsOptions {\n /** Join arrays with this separator instead of repeating the key (`;` for the hub's list APIs). */\n arrayJoin?: string;\n}\n\n/** Build `URLSearchParams` from a value record (arrays repeat the key by default). */\nexport function createSearchParams(\n params: Record<string, unknown>,\n { arrayJoin }: CreateSearchParamsOptions = {},\n): URLSearchParams {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n // The emptiness half of the omission rule has ONE owner. (No config here:\n // callers that must also drop schema DEFAULTS filter through\n // `shouldIncludeInUrl` with the config first — see `serializeSchemaParams`.)\n if (!shouldIncludeInUrl(value, undefined)) continue;\n if (Array.isArray(value)) {\n // Empty ELEMENTS are dropped, and an array that filters to nothing is\n // absent (a cleared multi-select must not leave `?tags=` behind).\n const items = value.filter(v => v !== null && v !== undefined && v !== '');\n if (items.length === 0) continue;\n if (arrayJoin) search.set(key, items.join(arrayJoin));\n else for (const item of items) search.append(key, String(item));\n continue;\n }\n if (typeof value === 'object') {\n search.set(key, JSON.stringify(value));\n continue;\n }\n search.set(key, String(value));\n }\n return search;\n}\n\n/** Serialize params to a query string, omitting everything `shouldIncludeInUrl` rejects. */\nexport function serializeSchemaParams<TSchema extends ParamSchema>(\n schema: TSchema,\n params: Record<string, unknown>,\n options?: CreateSearchParamsOptions,\n): string {\n const kept: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (shouldIncludeInUrl(value, schema[key])) kept[key] = value;\n }\n return createSearchParams(kept, options).toString();\n}\n\n/** Append a query string to a path, or return the path unchanged when it is empty. */\nexport function withQuery(path: string, queryString: string | null | undefined): string {\n return queryString ? `${path}?${queryString}` : path;\n}\n","'use client';\n\n/**\n * `contentFetch` — the fetch the lib's SELF-FETCHING content surfaces use:\n * roadmap (list + vote + per-task refresh), delivery, product releases,\n * onboarding guides (catalog + detail), legal docs, and the release-detail\n * injected roadmap/delivery sections.\n *\n * It deliberately reuses the SINGLE embed-auth knob — the registered\n * `EmbedAuthAdapter` — instead of introducing a second registration:\n * - adapter registered (host opted into embedded auth, e.g. openframe-frontend\n * for its embedded chat) → route through `embedAuthedFetch`, so content GETs/\n * POSTs carry the SAME bearer/cookie + 401-refresh as the chat.\n * - no adapter (the public hub, or the embedding example whose proxy injects\n * auth server-side) → a plain, byte-for-byte unchanged `fetch`.\n *\n * So a host wires auth ONCE (the chat adapter) and content inherits it; there is\n * no content-specific fetcher to configure.\n */\n\nimport { embedAuthedFetch, hasEmbedAuthAdapter } from './embed-authed-fetch';\n\nexport const contentFetch: typeof fetch = (input, init) => {\n if (!hasEmbedAuthAdapter()) return fetch(input, init);\n // embedAuthedFetch takes a string url; coerce the broader `fetch` input shape\n // (content surfaces always pass strings, but handle URL/Request defensively).\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n return embedAuthedFetch(url, init);\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-RNXY35DZ.cjs","../src/utils/search-params.ts","../src/utils/embed-content-fetch.ts"],"names":[],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-RNXY35DZ.cjs","sourcesContent":[null,"/**\n * URL parameter schema engine — the ONE grammar for every URL/API integer,\n * the ONE omission rule, the ONE serializer.\n *\n * Hoisted out of `hooks/state/` so SERVER code (route handlers, DALs) and the\n * CLIENT hook parse the same URL with the same function: a param contract that\n * disagrees across the wire is the bug class this removes. JSX-free leaf with\n * its own `exports` subpath; `hooks/state/*` re-exports every name it used to own.\n */\n\n/** JavaScript types a URL parameter can carry. `int` is a whole number with a floor. */\nexport type JSType = 'string' | 'number' | 'int' | 'boolean' | 'array' | 'object';\n\n// ── The integer grammar ─────────────────────────────────────────────────────\n\nexport interface PositiveIntOptions {\n /** Smallest accepted value (default 1). Anything below falls back. */\n min?: number;\n /** Largest accepted value. Applied to the PARSED value AND to the fallback. */\n max?: number;\n}\n\n/**\n * THE integer grammar for URL params, env vars, and page sizes.\n *\n * `null`/`undefined`/`''` → fallback. Otherwise `Math.trunc(Number(raw))`, which\n * accepts `'12'`, `12`, `'12.9'` (→ 12) and `'0x10'` (→ 16), and rejects `'12abc'`\n * and `'abc'` (`NaN`) — the historical `parseInt` accepted `'12abc'` as 12 and\n * produced `NaN` for `'abc'`. A value below `min` falls back. The RESULT (parsed\n * value or fallback alike) is clamped to `max`, so \"never exceeds max\" has one owner.\n */\nexport function positiveInt<TFallback = number>(\n raw: string | number | null | undefined,\n fallback: TFallback,\n { min = 1, max }: PositiveIntOptions = {},\n): number | TFallback {\n // The fallback is returned AS GIVEN — capping only ever applies to a value\n // parsed out of the input, so a caller with no default (`null`) gets its\n // sentinel back untouched instead of `Math.min(null, max)`.\n const capped = (v: number) => (max == null ? v : Math.min(v, max));\n if (raw === null || raw === undefined || raw === '') {\n return typeof fallback === 'number' ? (capped(fallback) as number | TFallback) : fallback;\n }\n const n = Math.trunc(Number(raw));\n if (!Number.isFinite(n) || n < min) {\n return typeof fallback === 'number' ? (capped(fallback) as number | TFallback) : fallback;\n }\n return capped(n);\n}\n\n/** Ceilings every paged surface shares. */\nexport const PAGE_PARAM_LIMITS = { maxPage: 10_000, maxPageSize: 100 } as const;\n\n/** Total pages for a row count. Floors at 1, so an empty result is still \"page 1 of 1\". */\nexport function pageCount(total: number, pageSize: number): number {\n if (!Number.isFinite(total) || !Number.isFinite(pageSize) || pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(total / pageSize));\n}\n\n/** Clamp a requested page into `1..totalPages`. */\nexport function clampPageToTotal(page: number, totalPages: number): number {\n return Math.min(page, Math.max(1, totalPages));\n}\n\n// ── Schema ──────────────────────────────────────────────────────────────────\n\ntype OutputTypeMap = {\n string: string;\n number: number;\n int: number;\n boolean: boolean;\n array: string[];\n object: Record<string, unknown>;\n};\n\nexport type OutputTypeForJSType<T extends JSType> = OutputTypeMap[T];\n\nexport interface BaseParamConfig<T extends JSType = JSType> {\n type: T;\n default?: OutputTypeMap[T];\n required?: boolean;\n}\n\n/** An integer parameter with an optional floor and ceiling. */\nexport interface IntParamConfig extends BaseParamConfig<'int'> {\n min?: number;\n max?: number;\n}\n\nexport type ParamConfig<T extends JSType = JSType> = T extends 'int' ? IntParamConfig : BaseParamConfig<T>;\n\nexport type ParamSchema = Record<string, ParamConfig>;\n\n/** Identity helper that preserves literal types through a schema object. */\nexport function defineParamSchema<T extends ParamSchema>(schema: T): T {\n return schema;\n}\n\n/**\n * Build a `Record<K, V>` from a key tuple. Keeps `keyof` EXACT when spreading a\n * shared config across derived keys (an inline `Object.fromEntries` widens to\n * `Record<string, V>` and loses the key union).\n */\nexport function fromKeys<K extends string, V>(keys: readonly K[], value: V): Record<K, V> {\n return Object.fromEntries(keys.map(k => [k, value])) as Record<K, V>;\n}\n\n// ── Reading ─────────────────────────────────────────────────────────────────\n\n/** Anything a URL can be read from: `URLSearchParams`, Next's `searchParams`, or a plain record. */\nexport type ParamInput = URLSearchParams | Record<string, string | string[] | undefined> | null | undefined;\n\n/** THE first-value rule for a duplicated key (`?a=1&a=2` reads as `1`). */\nexport function firstParamValue(input: ParamInput, key: string): string | undefined {\n if (!input) return undefined;\n if (input instanceof URLSearchParams) return input.get(key) ?? undefined;\n const value = input[key];\n return Array.isArray(value) ? value[0] : value;\n}\n\n/** Every value for a key (arrays read repeated params, then a `,`-joined single value). */\nfunction allParamValues(input: ParamInput, key: string): string[] {\n if (!input) return [];\n const raw = input instanceof URLSearchParams ? input.getAll(key) : input[key];\n const list = Array.isArray(raw) ? raw : raw === undefined ? [] : [raw];\n if (list.length === 1 && list[0]?.includes(',')) return list[0].split(',').filter(Boolean);\n return list.filter(v => v !== undefined && v !== '');\n}\n\nexport interface ParseSchemaOptions {\n /**\n * What an ABSENT scalar with no declared `default` resolves to.\n * `'undefined'` (default) keeps today's behaviour; `'null'` is the explicit\n * \"this filter is unset\" spelling that survives JSON and `URLSearchParams`.\n */\n absent?: 'undefined' | 'null';\n}\n\nexport type AbsentValue<Opts extends ParseSchemaOptions | undefined> = Opts extends { absent: 'null' }\n ? null\n : undefined;\n\n/**\n * The parsed shape of a schema: keys with a `default` and every array key are\n * non-nullable; an undefaulted scalar carries the caller's absent value.\n */\nexport type InferParsedParams<TSchema extends ParamSchema, Absent = undefined> = {\n [K in keyof TSchema]: TSchema[K] extends { type: 'array' }\n ? string[]\n : TSchema[K] extends { default: infer D }\n ? D\n : TSchema[K]['type'] extends infer T\n ? T extends JSType\n ? OutputTypeForJSType<T> | Absent\n : never\n : never;\n};\n\nfunction coerceScalar(raw: string | undefined, config: ParamConfig): unknown {\n if (raw === undefined || raw === '') return undefined;\n switch (config.type) {\n case 'int': {\n const int = config as IntParamConfig;\n // ONE integer grammar, default or not. Without a declared default the\n // fallback is `undefined` (an unparseable value is absent), which\n // `positiveInt` returns untouched — the branch used to open-code the\n // truncation, the min floor and the max clamp a second time.\n return positiveInt<undefined>(raw, int.default as undefined, { min: int.min, max: int.max });\n }\n case 'number': {\n const n = Number(raw);\n return Number.isFinite(n) ? n : undefined;\n }\n case 'boolean':\n return raw === 'true' || raw === '1';\n case 'object':\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n default:\n return raw;\n }\n}\n\n/**\n * Parse a URL into a schema's shape. THE reader — the server route and the\n * client hook both call this, so a URL means exactly one thing.\n *\n * PRECEDENCE: an absent or empty SCALAR takes the declared `default` when there\n * is one, else the `absent` value. ARRAY keys never take `absent`: they are `[]`.\n */\nexport function parseSchemaParams<TSchema extends ParamSchema, Opts extends ParseSchemaOptions = Record<string, never>>(\n schema: TSchema,\n input: ParamInput,\n options?: Opts,\n): InferParsedParams<TSchema, AbsentValue<Opts>> {\n const absent = options?.absent === 'null' ? null : undefined;\n const out: Record<string, unknown> = {};\n for (const [key, config] of Object.entries(schema)) {\n if (config.type === 'array') {\n const values = allParamValues(input, key);\n out[key] = values.length > 0 ? values : ((config.default as string[] | undefined) ?? []);\n continue;\n }\n const coerced = coerceScalar(firstParamValue(input, key), config);\n out[key] = coerced !== undefined ? coerced : (config.default ?? absent);\n }\n return out as InferParsedParams<TSchema, AbsentValue<Opts>>;\n}\n\n// ── Writing ─────────────────────────────────────────────────────────────────\n\n/**\n * A schema entry OR a legacy flattened param (which spells its default\n * `defaultValue`).\n *\n * A UNION, not a bag of two optional fields: with only `default?` and\n * `defaultValue?` this is a WEAK TYPE, and TypeScript rejects any argument\n * sharing neither — including `{ type: 'string' }`, the single most common\n * schema entry there is. Naming the real config shapes fixes that without an\n * index signature, which `FlattenedParam` (an interface) could never satisfy.\n */\ntype OmissionConfig = ParamConfig | { default?: unknown; defaultValue?: unknown };\n\n/**\n * THE omission rule: `null`, `undefined`, `''`, `[]`, and a value equal to the\n * declared default are left out, so a URL only ever carries what differs.\n */\nexport function shouldIncludeInUrl(value: unknown, config: OmissionConfig | undefined): boolean {\n if (value === null || value === undefined) return false;\n if (Array.isArray(value) && value.length === 0) return false;\n if (value === '') return false;\n // `in` narrowing rather than a cast: the union's members genuinely differ —\n // a schema entry spells its default `default`, a flattened param spells it\n // `defaultValue`, and neither is obliged to carry the other's field.\n const fromDefault = config && 'default' in config ? config.default : undefined;\n const fromLegacy = config && 'defaultValue' in config ? config.defaultValue : undefined;\n const declared = fromDefault !== undefined ? fromDefault : fromLegacy;\n if (declared !== undefined && value === declared) return false;\n return true;\n}\n\nexport interface CreateSearchParamsOptions {\n /** Join arrays with this separator instead of repeating the key (`;` for the hub's list APIs). */\n arrayJoin?: string;\n}\n\n/** Build `URLSearchParams` from a value record (arrays repeat the key by default). */\nexport function createSearchParams(\n params: Record<string, unknown>,\n { arrayJoin }: CreateSearchParamsOptions = {},\n): URLSearchParams {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n // The emptiness half of the omission rule has ONE owner. (No config here:\n // callers that must also drop schema DEFAULTS filter through\n // `shouldIncludeInUrl` with the config first — see `serializeSchemaParams`.)\n if (!shouldIncludeInUrl(value, undefined)) continue;\n if (Array.isArray(value)) {\n // Empty ELEMENTS are dropped, and an array that filters to nothing is\n // absent (a cleared multi-select must not leave `?tags=` behind).\n const items = value.filter(v => v !== null && v !== undefined && v !== '');\n if (items.length === 0) continue;\n if (arrayJoin) search.set(key, items.join(arrayJoin));\n else for (const item of items) search.append(key, String(item));\n continue;\n }\n if (typeof value === 'object') {\n search.set(key, JSON.stringify(value));\n continue;\n }\n search.set(key, String(value));\n }\n return search;\n}\n\n/** Serialize params to a query string, omitting everything `shouldIncludeInUrl` rejects. */\nexport function serializeSchemaParams<TSchema extends ParamSchema>(\n schema: TSchema,\n params: Record<string, unknown>,\n options?: CreateSearchParamsOptions,\n): string {\n const kept: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (shouldIncludeInUrl(value, schema[key])) kept[key] = value;\n }\n return createSearchParams(kept, options).toString();\n}\n\n/** Append a query string to a path, or return the path unchanged when it is empty. */\nexport function withQuery(path: string, queryString: string | null | undefined): string {\n return queryString ? `${path}?${queryString}` : path;\n}\n","'use client';\n\n/**\n * `contentFetch` — the fetch the lib's SELF-FETCHING content surfaces use:\n * roadmap (list + vote + per-task refresh), delivery, product releases,\n * onboarding guides (catalog + detail), legal docs, and the release-detail\n * injected roadmap/delivery sections.\n *\n * It deliberately reuses the SINGLE embed-auth knob — the registered\n * `EmbedAuthAdapter` — instead of introducing a second registration:\n * - adapter registered (host opted into embedded auth, e.g. openframe-frontend\n * for its embedded chat) → route through `embedAuthedFetch`, so content GETs/\n * POSTs carry the SAME bearer/cookie + 401-refresh as the chat.\n * - no adapter (the public hub, or the embedding example whose proxy injects\n * auth server-side) → a plain, byte-for-byte unchanged `fetch`.\n *\n * So a host wires auth ONCE (the chat adapter) and content inherits it; there is\n * no content-specific fetcher to configure.\n */\n\nimport { embedAuthedFetch, hasEmbedAuthAdapter } from './embed-authed-fetch';\n\nexport const contentFetch: typeof fetch = (input, init) => {\n if (!hasEmbedAuthAdapter()) return fetch(input, init);\n // embedAuthedFetch takes a string url; coerce the broader `fetch` input shape\n // (content surfaces always pass strings, but handle URL/Request defensively).\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n return embedAuthedFetch(url, init);\n};\n"]}
|