moonflower 1.2.0 → 1.3.1
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/cli/entry.cjs +1 -1
- package/dist/cli/cli.cjs +2 -0
- package/dist/cli/cli.cjs.map +1 -0
- package/dist/cli/cli.d.ts +2 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.mjs +62 -0
- package/dist/cli/cli.mjs.map +1 -0
- package/dist/cli/prettyprint.cjs +2 -0
- package/dist/cli/prettyprint.cjs.map +1 -0
- package/dist/cli/prettyprint.d.ts +5 -0
- package/dist/cli/prettyprint.d.ts.map +1 -0
- package/dist/cli/prettyprint.mjs +15 -0
- package/dist/cli/prettyprint.mjs.map +1 -0
- package/dist/errors/UserFacingErrors.cjs +1 -1
- package/dist/errors/UserFacingErrors.cjs.map +1 -1
- package/dist/errors/UserFacingErrors.d.ts +27 -0
- package/dist/errors/UserFacingErrors.d.ts.map +1 -1
- package/dist/errors/UserFacingErrors.mjs +67 -13
- package/dist/errors/UserFacingErrors.mjs.map +1 -1
- package/dist/hooks/usePathParams.cjs +1 -1
- package/dist/hooks/usePathParams.cjs.map +1 -1
- package/dist/hooks/usePathParams.d.ts.map +1 -1
- package/dist/hooks/usePathParams.mjs +20 -27
- package/dist/hooks/usePathParams.mjs.map +1 -1
- package/dist/hooks/useQueryParams.cjs +1 -1
- package/dist/hooks/useQueryParams.cjs.map +1 -1
- package/dist/hooks/useQueryParams.d.ts +4 -3
- package/dist/hooks/useQueryParams.d.ts.map +1 -1
- package/dist/hooks/useQueryParams.mjs +24 -33
- package/dist/hooks/useQueryParams.mjs.map +1 -1
- package/dist/hooks/useRequestBody.cjs +1 -1
- package/dist/hooks/useRequestBody.cjs.map +1 -1
- package/dist/hooks/useRequestBody.d.ts +4 -3
- package/dist/hooks/useRequestBody.d.ts.map +1 -1
- package/dist/hooks/useRequestBody.mjs +23 -34
- package/dist/hooks/useRequestBody.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +64 -55
- package/dist/node_modules/zod/index.cjs +2 -0
- package/dist/node_modules/zod/index.cjs.map +1 -0
- package/dist/node_modules/zod/index.mjs +6 -0
- package/dist/node_modules/zod/index.mjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/checks.cjs +2 -0
- package/dist/node_modules/zod/v4/classic/checks.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/checks.mjs +34 -0
- package/dist/node_modules/zod/v4/classic/checks.mjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/coerce.cjs +2 -0
- package/dist/node_modules/zod/v4/classic/coerce.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/coerce.mjs +26 -0
- package/dist/node_modules/zod/v4/classic/coerce.mjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/compat.cjs +2 -0
- package/dist/node_modules/zod/v4/classic/compat.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/compat.mjs +35 -0
- package/dist/node_modules/zod/v4/classic/compat.mjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/errors.cjs +2 -0
- package/dist/node_modules/zod/v4/classic/errors.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/errors.mjs +41 -0
- package/dist/node_modules/zod/v4/classic/errors.mjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/external.cjs +2 -0
- package/dist/node_modules/zod/v4/classic/external.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/external.mjs +260 -0
- package/dist/node_modules/zod/v4/classic/external.mjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/from-json-schema.cjs +2 -0
- package/dist/node_modules/zod/v4/classic/from-json-schema.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/from-json-schema.mjs +287 -0
- package/dist/node_modules/zod/v4/classic/from-json-schema.mjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/iso.cjs +2 -0
- package/dist/node_modules/zod/v4/classic/iso.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/iso.mjs +40 -0
- package/dist/node_modules/zod/v4/classic/iso.mjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/parse.cjs +2 -0
- package/dist/node_modules/zod/v4/classic/parse.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/parse.mjs +19 -0
- package/dist/node_modules/zod/v4/classic/parse.mjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/schemas.cjs +2 -0
- package/dist/node_modules/zod/v4/classic/schemas.cjs.map +1 -0
- package/dist/node_modules/zod/v4/classic/schemas.mjs +912 -0
- package/dist/node_modules/zod/v4/classic/schemas.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/api.cjs +2 -0
- package/dist/node_modules/zod/v4/core/api.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/api.mjs +1110 -0
- package/dist/node_modules/zod/v4/core/api.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/checks.cjs +2 -0
- package/dist/node_modules/zod/v4/core/checks.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/checks.mjs +421 -0
- package/dist/node_modules/zod/v4/core/checks.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/core.cjs +2 -0
- package/dist/node_modules/zod/v4/core/core.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/core.mjs +62 -0
- package/dist/node_modules/zod/v4/core/core.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/doc.cjs +4 -0
- package/dist/node_modules/zod/v4/core/doc.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/doc.mjs +27 -0
- package/dist/node_modules/zod/v4/core/doc.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/errors.cjs +3 -0
- package/dist/node_modules/zod/v4/core/errors.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/errors.mjs +89 -0
- package/dist/node_modules/zod/v4/core/errors.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/index.cjs +2 -0
- package/dist/node_modules/zod/v4/core/index.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/index.mjs +293 -0
- package/dist/node_modules/zod/v4/core/index.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/json-schema-generator.cjs +2 -0
- package/dist/node_modules/zod/v4/core/json-schema-generator.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/json-schema-generator.mjs +66 -0
- package/dist/node_modules/zod/v4/core/json-schema-generator.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.cjs +2 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.mjs +346 -0
- package/dist/node_modules/zod/v4/core/json-schema-processors.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/json-schema.cjs +2 -0
- package/dist/node_modules/zod/v4/core/json-schema.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/json-schema.mjs +2 -0
- package/dist/node_modules/zod/v4/core/json-schema.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/parse.cjs +2 -0
- package/dist/node_modules/zod/v4/core/parse.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/parse.mjs +75 -0
- package/dist/node_modules/zod/v4/core/parse.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/regexes.cjs +2 -0
- package/dist/node_modules/zod/v4/core/regexes.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/regexes.mjs +94 -0
- package/dist/node_modules/zod/v4/core/regexes.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/registries.cjs +2 -0
- package/dist/node_modules/zod/v4/core/registries.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/registries.mjs +44 -0
- package/dist/node_modules/zod/v4/core/registries.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/schemas.cjs +36 -0
- package/dist/node_modules/zod/v4/core/schemas.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/schemas.mjs +1319 -0
- package/dist/node_modules/zod/v4/core/schemas.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.cjs +4 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.mjs +244 -0
- package/dist/node_modules/zod/v4/core/to-json-schema.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/util.cjs +2 -0
- package/dist/node_modules/zod/v4/core/util.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/util.mjs +523 -0
- package/dist/node_modules/zod/v4/core/util.mjs.map +1 -0
- package/dist/node_modules/zod/v4/core/versions.cjs +2 -0
- package/dist/node_modules/zod/v4/core/versions.cjs.map +1 -0
- package/dist/node_modules/zod/v4/core/versions.mjs +9 -0
- package/dist/node_modules/zod/v4/core/versions.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ar.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ar.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ar.mjs +87 -0
- package/dist/node_modules/zod/v4/locales/ar.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/az.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/az.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/az.mjs +87 -0
- package/dist/node_modules/zod/v4/locales/az.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/be.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/be.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/be.mjs +129 -0
- package/dist/node_modules/zod/v4/locales/be.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/bg.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/bg.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/bg.mjs +98 -0
- package/dist/node_modules/zod/v4/locales/bg.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ca.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ca.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ca.mjs +88 -0
- package/dist/node_modules/zod/v4/locales/ca.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/cs.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/cs.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/cs.mjs +91 -0
- package/dist/node_modules/zod/v4/locales/cs.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/da.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/da.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/da.mjs +94 -0
- package/dist/node_modules/zod/v4/locales/da.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/de.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/de.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/de.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/de.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/en.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/en.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/en.mjs +91 -0
- package/dist/node_modules/zod/v4/locales/en.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/eo.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/eo.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/eo.mjs +90 -0
- package/dist/node_modules/zod/v4/locales/eo.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/es.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/es.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/es.mjs +111 -0
- package/dist/node_modules/zod/v4/locales/es.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/fa.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/fa.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/fa.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/fa.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/fi.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/fi.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/fi.mjs +91 -0
- package/dist/node_modules/zod/v4/locales/fi.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/fr-CA.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/fr-CA.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/fr-CA.mjs +87 -0
- package/dist/node_modules/zod/v4/locales/fr-CA.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/fr.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/fr.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/fr.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/fr.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/he.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/he.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/he.mjs +152 -0
- package/dist/node_modules/zod/v4/locales/he.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/hu.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/hu.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/hu.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/hu.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/hy.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/hy.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/hy.mjs +130 -0
- package/dist/node_modules/zod/v4/locales/hy.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/id.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/id.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/id.mjs +87 -0
- package/dist/node_modules/zod/v4/locales/id.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/index.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/index.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/index.mjs +101 -0
- package/dist/node_modules/zod/v4/locales/index.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/is.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/is.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/is.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/is.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/it.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/it.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/it.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/it.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ja.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ja.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ja.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/ja.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ka.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ka.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ka.mjs +92 -0
- package/dist/node_modules/zod/v4/locales/ka.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/kh.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/kh.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/kh.mjs +8 -0
- package/dist/node_modules/zod/v4/locales/kh.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/km.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/km.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/km.mjs +90 -0
- package/dist/node_modules/zod/v4/locales/km.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ko.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ko.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ko.mjs +87 -0
- package/dist/node_modules/zod/v4/locales/ko.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/lt.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/lt.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/lt.mjs +178 -0
- package/dist/node_modules/zod/v4/locales/lt.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/mk.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/mk.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/mk.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/mk.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ms.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ms.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ms.mjs +88 -0
- package/dist/node_modules/zod/v4/locales/ms.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/nl.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/nl.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/nl.mjs +88 -0
- package/dist/node_modules/zod/v4/locales/nl.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/no.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/no.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/no.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/no.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ota.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ota.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ota.mjs +90 -0
- package/dist/node_modules/zod/v4/locales/ota.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/pl.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/pl.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/pl.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/pl.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ps.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ps.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ps.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/ps.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/pt.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/pt.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/pt.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/pt.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ru.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ru.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ru.mjs +129 -0
- package/dist/node_modules/zod/v4/locales/ru.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/sl.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/sl.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/sl.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/sl.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/sv.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/sv.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/sv.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/sv.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ta.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ta.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ta.mjs +90 -0
- package/dist/node_modules/zod/v4/locales/ta.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/th.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/th.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/th.mjs +90 -0
- package/dist/node_modules/zod/v4/locales/th.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/tr.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/tr.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/tr.mjs +87 -0
- package/dist/node_modules/zod/v4/locales/tr.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ua.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ua.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ua.mjs +8 -0
- package/dist/node_modules/zod/v4/locales/ua.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/uk.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/uk.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/uk.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/uk.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ur.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/ur.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/ur.mjs +90 -0
- package/dist/node_modules/zod/v4/locales/ur.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/uz.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/uz.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/uz.mjs +90 -0
- package/dist/node_modules/zod/v4/locales/uz.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/vi.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/vi.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/vi.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/vi.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/yo.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/yo.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/yo.mjs +89 -0
- package/dist/node_modules/zod/v4/locales/yo.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/zh-CN.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/zh-CN.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/zh-CN.mjs +90 -0
- package/dist/node_modules/zod/v4/locales/zh-CN.mjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/zh-TW.cjs +2 -0
- package/dist/node_modules/zod/v4/locales/zh-TW.cjs.map +1 -0
- package/dist/node_modules/zod/v4/locales/zh-TW.mjs +87 -0
- package/dist/node_modules/zod/v4/locales/zh-TW.mjs.map +1 -0
- package/dist/openapi/analyzerModule/analyzerModule.cjs +1 -1
- package/dist/openapi/analyzerModule/analyzerModule.cjs.map +1 -1
- package/dist/openapi/analyzerModule/analyzerModule.d.ts.map +1 -1
- package/dist/openapi/analyzerModule/analyzerModule.mjs +42 -42
- package/dist/openapi/analyzerModule/analyzerModule.mjs.map +1 -1
- package/dist/openapi/analyzerModule/nodeParsers.cjs +1 -1
- package/dist/openapi/analyzerModule/nodeParsers.cjs.map +1 -1
- package/dist/openapi/analyzerModule/nodeParsers.d.ts +1 -0
- package/dist/openapi/analyzerModule/nodeParsers.d.ts.map +1 -1
- package/dist/openapi/analyzerModule/nodeParsers.mjs +261 -206
- package/dist/openapi/analyzerModule/nodeParsers.mjs.map +1 -1
- package/dist/openapi/analyzerModule/parseEndpoint.cjs +1 -1
- package/dist/openapi/analyzerModule/parseEndpoint.cjs.map +1 -1
- package/dist/openapi/analyzerModule/parseEndpoint.d.ts.map +1 -1
- package/dist/openapi/analyzerModule/parseEndpoint.mjs +62 -62
- package/dist/openapi/analyzerModule/parseEndpoint.mjs.map +1 -1
- package/dist/openapi/analyzerModule/test/TestCase.d.ts +9 -0
- package/dist/openapi/analyzerModule/test/TestCase.d.ts.map +1 -0
- package/dist/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.d.ts +2 -0
- package/dist/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.d.ts.map +1 -0
- package/dist/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.data.d.ts +2 -0
- package/dist/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.data.d.ts.map +1 -0
- package/dist/openapi/initOpenApiEngine.cjs +1 -1
- package/dist/openapi/initOpenApiEngine.cjs.map +1 -1
- package/dist/openapi/initOpenApiEngine.d.ts +7 -2
- package/dist/openapi/initOpenApiEngine.d.ts.map +1 -1
- package/dist/openapi/initOpenApiEngine.mjs +13 -7
- package/dist/openapi/initOpenApiEngine.mjs.map +1 -1
- package/dist/openapi/manager/OpenApiManager.cjs +1 -1
- package/dist/openapi/manager/OpenApiManager.cjs.map +1 -1
- package/dist/openapi/manager/OpenApiManager.d.ts +4 -0
- package/dist/openapi/manager/OpenApiManager.d.ts.map +1 -1
- package/dist/openapi/manager/OpenApiManager.mjs +11 -2
- package/dist/openapi/manager/OpenApiManager.mjs.map +1 -1
- package/dist/openapi/router/OpenApiRouter.cjs +1 -1
- package/dist/openapi/router/OpenApiRouter.cjs.map +1 -1
- package/dist/openapi/router/OpenApiRouter.d.ts.map +1 -1
- package/dist/openapi/router/OpenApiRouter.mjs +9 -6
- package/dist/openapi/router/OpenApiRouter.mjs.map +1 -1
- package/dist/utils/getValueAsNullableString.cjs +2 -0
- package/dist/utils/getValueAsNullableString.cjs.map +1 -0
- package/dist/utils/getValueAsNullableString.d.ts +2 -0
- package/dist/utils/getValueAsNullableString.d.ts.map +1 -0
- package/dist/utils/getValueAsNullableString.mjs +7 -0
- package/dist/utils/getValueAsNullableString.mjs.map +1 -0
- package/dist/utils/validationMessages.cjs +1 -1
- package/dist/utils/validationMessages.cjs.map +1 -1
- package/dist/utils/validationMessages.d.ts +1 -1
- package/dist/utils/validationMessages.d.ts.map +1 -1
- package/dist/utils/validationMessages.mjs +8 -8
- package/dist/utils/validationMessages.mjs.map +1 -1
- package/dist/validators/types.d.ts +4 -0
- package/dist/validators/types.d.ts.map +1 -1
- package/dist/validators/validateMissingParams.cjs +2 -0
- package/dist/validators/validateMissingParams.cjs.map +1 -0
- package/dist/validators/validateMissingParams.d.ts +7 -0
- package/dist/validators/validateMissingParams.d.ts.map +1 -0
- package/dist/validators/validateMissingParams.mjs +17 -0
- package/dist/validators/validateMissingParams.mjs.map +1 -0
- package/dist/validators/validateParam.cjs +2 -0
- package/dist/validators/validateParam.cjs.map +1 -0
- package/dist/validators/validateParam.d.ts +8 -0
- package/dist/validators/validateParam.d.ts.map +1 -0
- package/dist/validators/validateParam.mjs +41 -0
- package/dist/validators/validateParam.mjs.map +1 -0
- package/package.json +12 -5
- package/{cli → src/cli}/cli.ts +26 -6
- package/{cli → src/cli}/prettyprint.ts +2 -2
- package/src/errors/UserFacingErrors.ts +54 -0
- package/src/hooks/usePathParams.spec.ts +27 -0
- package/src/hooks/usePathParams.ts +5 -13
- package/src/hooks/useQueryParams.spec.ts +99 -0
- package/src/hooks/useQueryParams.ts +16 -25
- package/src/hooks/useRequestBody.spec.ts +99 -0
- package/src/hooks/useRequestBody.ts +16 -35
- package/src/openapi/analyzerModule/analyzerModule.ts +2 -3
- package/src/openapi/analyzerModule/nodeParsers.ts +113 -8
- package/src/openapi/analyzerModule/parseEndpoint.ts +2 -2
- package/src/openapi/analyzerModule/test/TestCase.ts +8 -0
- package/src/openapi/analyzerModule/test/openApiAnalyzer.spec.data.ts +9 -0
- package/src/openapi/analyzerModule/test/openApiAnalyzer.spec.ts +21 -0
- package/src/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.data.ts +87 -0
- package/src/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.ts +178 -0
- package/src/openapi/initOpenApiEngine.ts +48 -6
- package/src/openapi/manager/OpenApiManager.ts +16 -0
- package/src/openapi/router/OpenApiRouter.ts +6 -1
- package/src/test/app.spec.ts +27 -0
- package/src/utils/getValueAsNullableString.ts +8 -0
- package/src/utils/validationMessages.ts +4 -0
- package/src/validators/types.ts +5 -0
- package/src/validators/validateMissingParams.ts +27 -0
- package/src/validators/validateParam.ts +69 -0
- package/vite.config.ts +3 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateMissingParams.mjs","sources":["../../src/validators/validateMissingParams.ts"],"sourcesContent":["import z from 'zod'\n\nimport { ValidationError } from '../errors/UserFacingErrors'\nimport { getMissingParamMessage } from '../utils/validationMessages'\nimport { MaybeOptionalValidatorUnion, Validator } from './types'\n\nexport function validateMissingParams<ValidatorsT extends Record<string, MaybeOptionalValidatorUnion>>(\n\tparams: { name: string; validator: Pick<Validator<unknown>, 'description' | 'errorMessage'> }[],\n\tprovidedParams: Record<string, unknown>,\n\tvalidators: ValidatorsT,\n\tsuffix: 'body' | 'query' | 'path',\n) {\n\tconst missingParams = params.filter((param) => {\n\t\tlet isOptional = validators[param.name].optional\n\t\tif (validators[param.name] instanceof z.ZodType) {\n\t\t\tisOptional = (validators[param.name] as z.ZodType).safeParse(undefined).success\n\t\t}\n\n\t\treturn providedParams[param.name] === undefined && !isOptional\n\t})\n\n\tif (missingParams.length > 0) {\n\t\tthrow new ValidationError(\n\t\t\t`Missing ${suffix} params: ${missingParams.map((param) => getMissingParamMessage(param)).join(', ')}`,\n\t\t)\n\t}\n}\n"],"names":["validateMissingParams","params","providedParams","validators","suffix","missingParams","param","isOptional","z","ValidationError","getMissingParamMessage"],"mappings":";;;AAMO,SAASA,EACfC,GACAC,GACAC,GACAC,GACC;AACD,QAAMC,IAAgBJ,EAAO,OAAO,CAACK,MAAU;AAC9C,QAAIC,IAAaJ,EAAWG,EAAM,IAAI,EAAE;AACxC,WAAIH,EAAWG,EAAM,IAAI,aAAaE,EAAE,YACvCD,IAAcJ,EAAWG,EAAM,IAAI,EAAgB,UAAU,MAAS,EAAE,UAGlEJ,EAAeI,EAAM,IAAI,MAAM,UAAa,CAACC;AAAA,EAAA,CACpD;AAEG,MAAAF,EAAc,SAAS;AAC1B,UAAM,IAAII;AAAA,MACT,WAAWL,CAAM,YAAYC,EAAc,IAAI,CAACC,MAAUI,EAAuBJ,CAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,IACpG;AAEF;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../node_modules/zod/v4/classic/external.cjs"),a=require("../utils/getValueAsNullableString.cjs"),c=require("../node_modules/zod/v4/classic/errors.cjs");function o(e,r){try{const t=s(e,r),n=l(e,r),u=f(e,n);return{validated:t&&u,parsedValue:n,exception:null}}catch(t){return{validated:!1,parsedValue:null,exception:p(t)}}}function s(e,r){return"prevalidate"in e&&typeof e.prevalidate=="function"?e.prevalidate(a.getValueAsNullableString(r)):!0}function l(e,r){if(e instanceof i.ZodType){const t=(()=>{try{return typeof r=="string"?JSON.parse(r):r}catch{return r}})();return e.parse(t)}return e.parse(a.getValueAsNullableString(r))}function f(e,r){return"validate"in e&&typeof e.validate=="function"?e.validate(r):!0}function p(e){return e instanceof c.ZodError?i.treeifyError(e).errors.join("; ").replace("Invalid input: ",""):"Validation failed"}exports.validateParam=o;
|
|
2
|
+
//# sourceMappingURL=validateParam.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParam.cjs","sources":["../../src/validators/validateParam.ts"],"sourcesContent":["import z, { ZodError } from 'zod'\n\nimport { getValueAsNullableString } from '../utils/getValueAsNullableString'\nimport { ValidatorUnion } from './types'\n\nexport function validateParam(\n\tvalidator: ValidatorUnion,\n\tvalue: string | number | boolean | object | null,\n): {\n\tvalidated: boolean\n\tparsedValue: unknown\n\texception: string | null\n} {\n\ttry {\n\t\tconst prevalidatorSuccess = runPrevalidator(validator, value)\n\t\tconst parsedValue = runParser(validator, value)\n\t\tconst validatorSuccess = runValidator(validator, parsedValue)\n\n\t\treturn {\n\t\t\tvalidated: prevalidatorSuccess && validatorSuccess,\n\t\t\tparsedValue,\n\t\t\texception: null,\n\t\t}\n\t} catch (error) {\n\t\tconst exception = getErrorMessage(error)\n\t\treturn { validated: false, parsedValue: null, exception }\n\t}\n}\n\nfunction runPrevalidator(validator: ValidatorUnion, value: string | number | boolean | object | null) {\n\t// Legacy validator\n\tif ('prevalidate' in validator && typeof validator.prevalidate === 'function') {\n\t\treturn validator.prevalidate(getValueAsNullableString(value))\n\t}\n\t// Zod (skip)\n\treturn true\n}\n\nfunction runParser(validator: ValidatorUnion, value: string | number | boolean | object | null) {\n\t// Zod validator\n\tif (validator instanceof z.ZodType) {\n\t\tconst coercedValue = (() => {\n\t\t\ttry {\n\t\t\t\treturn typeof value === 'string' ? JSON.parse(value) : value\n\t\t\t} catch {\n\t\t\t\treturn value\n\t\t\t}\n\t\t})()\n\t\treturn validator.parse(coercedValue)\n\t}\n\t// Legacy validator\n\treturn validator.parse(getValueAsNullableString(value))\n}\n\nfunction runValidator(validator: ValidatorUnion, parsedValue: unknown) {\n\t// Legacy validator\n\tif ('validate' in validator && typeof validator.validate === 'function') {\n\t\treturn validator.validate(parsedValue)\n\t}\n\t// Zod (skip)\n\treturn true\n}\n\nfunction getErrorMessage(error: unknown) {\n\tif (error instanceof ZodError) {\n\t\treturn z.treeifyError(error).errors.join('; ').replace('Invalid input: ', '')\n\t}\n\treturn 'Validation failed'\n}\n"],"names":["validateParam","validator","value","prevalidatorSuccess","runPrevalidator","parsedValue","runParser","validatorSuccess","runValidator","error","getErrorMessage","getValueAsNullableString","z","coercedValue","ZodError"],"mappings":"yPAKgB,SAAAA,EACfC,EACAC,EAKC,CACG,GAAA,CACG,MAAAC,EAAsBC,EAAgBH,EAAWC,CAAK,EACtDG,EAAcC,EAAUL,EAAWC,CAAK,EACxCK,EAAmBC,EAAaP,EAAWI,CAAW,EAErD,MAAA,CACN,UAAWF,GAAuBI,EAClC,YAAAF,EACA,UAAW,IACZ,QACQI,EAAO,CAEf,MAAO,CAAE,UAAW,GAAO,YAAa,KAAM,UAD5BC,EAAgBD,CAAK,CACiB,CAAA,CAE1D,CAEA,SAASL,EAAgBH,EAA2BC,EAAkD,CAErG,MAAI,gBAAiBD,GAAa,OAAOA,EAAU,aAAgB,WAC3DA,EAAU,YAAYU,EAAyB,yBAAAT,CAAK,CAAC,EAGtD,EACR,CAEA,SAASI,EAAUL,EAA2BC,EAAkD,CAE3F,GAAAD,aAAqBW,EAAE,QAAS,CACnC,MAAMC,GAAgB,IAAM,CACvB,GAAA,CACH,OAAO,OAAOX,GAAU,SAAW,KAAK,MAAMA,CAAK,EAAIA,CAAA,MAChD,CACA,OAAAA,CAAA,CACR,GACE,EACI,OAAAD,EAAU,MAAMY,CAAY,CAAA,CAGpC,OAAOZ,EAAU,MAAMU,EAAyB,yBAAAT,CAAK,CAAC,CACvD,CAEA,SAASM,EAAaP,EAA2BI,EAAsB,CAEtE,MAAI,aAAcJ,GAAa,OAAOA,EAAU,UAAa,WACrDA,EAAU,SAASI,CAAW,EAG/B,EACR,CAEA,SAASK,EAAgBD,EAAgB,CACxC,OAAIA,aAAiBK,EAAAA,SACbF,EAAE,aAAaH,CAAK,EAAE,OAAO,KAAK,IAAI,EAAE,QAAQ,kBAAmB,EAAE,EAEtE,mBACR"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ValidatorUnion } from './types';
|
|
2
|
+
|
|
3
|
+
export declare function validateParam(validator: ValidatorUnion, value: string | number | boolean | object | null): {
|
|
4
|
+
validated: boolean;
|
|
5
|
+
parsedValue: unknown;
|
|
6
|
+
exception: string | null;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=validateParam.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParam.d.ts","sourceRoot":"","sources":["../../src/validators/validateParam.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAExC,wBAAgB,aAAa,CAC5B,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAC9C;IACF,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,CAeA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as i from "../node_modules/zod/v4/classic/external.mjs";
|
|
2
|
+
import { getValueAsNullableString as o } from "../utils/getValueAsNullableString.mjs";
|
|
3
|
+
import { ZodError as u } from "../node_modules/zod/v4/classic/errors.mjs";
|
|
4
|
+
function m(r, e) {
|
|
5
|
+
try {
|
|
6
|
+
const t = c(r, e), n = s(r, e), a = f(r, n);
|
|
7
|
+
return {
|
|
8
|
+
validated: t && a,
|
|
9
|
+
parsedValue: n,
|
|
10
|
+
exception: null
|
|
11
|
+
};
|
|
12
|
+
} catch (t) {
|
|
13
|
+
return { validated: !1, parsedValue: null, exception: p(t) };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function c(r, e) {
|
|
17
|
+
return "prevalidate" in r && typeof r.prevalidate == "function" ? r.prevalidate(o(e)) : !0;
|
|
18
|
+
}
|
|
19
|
+
function s(r, e) {
|
|
20
|
+
if (r instanceof i.ZodType) {
|
|
21
|
+
const t = (() => {
|
|
22
|
+
try {
|
|
23
|
+
return typeof e == "string" ? JSON.parse(e) : e;
|
|
24
|
+
} catch {
|
|
25
|
+
return e;
|
|
26
|
+
}
|
|
27
|
+
})();
|
|
28
|
+
return r.parse(t);
|
|
29
|
+
}
|
|
30
|
+
return r.parse(o(e));
|
|
31
|
+
}
|
|
32
|
+
function f(r, e) {
|
|
33
|
+
return "validate" in r && typeof r.validate == "function" ? r.validate(e) : !0;
|
|
34
|
+
}
|
|
35
|
+
function p(r) {
|
|
36
|
+
return r instanceof u ? i.treeifyError(r).errors.join("; ").replace("Invalid input: ", "") : "Validation failed";
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
m as validateParam
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=validateParam.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateParam.mjs","sources":["../../src/validators/validateParam.ts"],"sourcesContent":["import z, { ZodError } from 'zod'\n\nimport { getValueAsNullableString } from '../utils/getValueAsNullableString'\nimport { ValidatorUnion } from './types'\n\nexport function validateParam(\n\tvalidator: ValidatorUnion,\n\tvalue: string | number | boolean | object | null,\n): {\n\tvalidated: boolean\n\tparsedValue: unknown\n\texception: string | null\n} {\n\ttry {\n\t\tconst prevalidatorSuccess = runPrevalidator(validator, value)\n\t\tconst parsedValue = runParser(validator, value)\n\t\tconst validatorSuccess = runValidator(validator, parsedValue)\n\n\t\treturn {\n\t\t\tvalidated: prevalidatorSuccess && validatorSuccess,\n\t\t\tparsedValue,\n\t\t\texception: null,\n\t\t}\n\t} catch (error) {\n\t\tconst exception = getErrorMessage(error)\n\t\treturn { validated: false, parsedValue: null, exception }\n\t}\n}\n\nfunction runPrevalidator(validator: ValidatorUnion, value: string | number | boolean | object | null) {\n\t// Legacy validator\n\tif ('prevalidate' in validator && typeof validator.prevalidate === 'function') {\n\t\treturn validator.prevalidate(getValueAsNullableString(value))\n\t}\n\t// Zod (skip)\n\treturn true\n}\n\nfunction runParser(validator: ValidatorUnion, value: string | number | boolean | object | null) {\n\t// Zod validator\n\tif (validator instanceof z.ZodType) {\n\t\tconst coercedValue = (() => {\n\t\t\ttry {\n\t\t\t\treturn typeof value === 'string' ? JSON.parse(value) : value\n\t\t\t} catch {\n\t\t\t\treturn value\n\t\t\t}\n\t\t})()\n\t\treturn validator.parse(coercedValue)\n\t}\n\t// Legacy validator\n\treturn validator.parse(getValueAsNullableString(value))\n}\n\nfunction runValidator(validator: ValidatorUnion, parsedValue: unknown) {\n\t// Legacy validator\n\tif ('validate' in validator && typeof validator.validate === 'function') {\n\t\treturn validator.validate(parsedValue)\n\t}\n\t// Zod (skip)\n\treturn true\n}\n\nfunction getErrorMessage(error: unknown) {\n\tif (error instanceof ZodError) {\n\t\treturn z.treeifyError(error).errors.join('; ').replace('Invalid input: ', '')\n\t}\n\treturn 'Validation failed'\n}\n"],"names":["validateParam","validator","value","prevalidatorSuccess","runPrevalidator","parsedValue","runParser","validatorSuccess","runValidator","error","getErrorMessage","getValueAsNullableString","z","coercedValue","ZodError"],"mappings":";;;AAKgB,SAAAA,EACfC,GACAC,GAKC;AACG,MAAA;AACG,UAAAC,IAAsBC,EAAgBH,GAAWC,CAAK,GACtDG,IAAcC,EAAUL,GAAWC,CAAK,GACxCK,IAAmBC,EAAaP,GAAWI,CAAW;AAErD,WAAA;AAAA,MACN,WAAWF,KAAuBI;AAAA,MAClC,aAAAF;AAAA,MACA,WAAW;AAAA,IACZ;AAAA,WACQI,GAAO;AAEf,WAAO,EAAE,WAAW,IAAO,aAAa,MAAM,WAD5BC,EAAgBD,CAAK,EACiB;AAAA,EAAA;AAE1D;AAEA,SAASL,EAAgBH,GAA2BC,GAAkD;AAErG,SAAI,iBAAiBD,KAAa,OAAOA,EAAU,eAAgB,aAC3DA,EAAU,YAAYU,EAAyBT,CAAK,CAAC,IAGtD;AACR;AAEA,SAASI,EAAUL,GAA2BC,GAAkD;AAE3F,MAAAD,aAAqBW,EAAE,SAAS;AACnC,UAAMC,KAAgB,MAAM;AACvB,UAAA;AACH,eAAO,OAAOX,KAAU,WAAW,KAAK,MAAMA,CAAK,IAAIA;AAAA,MAAA,QAChD;AACA,eAAAA;AAAA,MAAA;AAAA,IACR,GACE;AACI,WAAAD,EAAU,MAAMY,CAAY;AAAA,EAAA;AAGpC,SAAOZ,EAAU,MAAMU,EAAyBT,CAAK,CAAC;AACvD;AAEA,SAASM,EAAaP,GAA2BI,GAAsB;AAEtE,SAAI,cAAcJ,KAAa,OAAOA,EAAU,YAAa,aACrDA,EAAU,SAASI,CAAW,IAG/B;AACR;AAEA,SAASK,EAAgBD,GAAgB;AACxC,SAAIA,aAAiBK,IACbF,EAAE,aAAaH,CAAK,EAAE,OAAO,KAAK,IAAI,EAAE,QAAQ,mBAAmB,EAAE,IAEtE;AACR;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "moonflower",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "tenebrie",
|
|
6
6
|
"license": "MIT",
|
|
@@ -124,12 +124,19 @@
|
|
|
124
124
|
},
|
|
125
125
|
"dependencies": {
|
|
126
126
|
"ts-morph": "^24.0.0",
|
|
127
|
-
"typescript": "^5.7.2"
|
|
127
|
+
"typescript": "^5.7.2",
|
|
128
|
+
"yargs": "^17.7.2"
|
|
128
129
|
},
|
|
129
130
|
"peerDependencies": {
|
|
130
131
|
"@koa/router": "^13.1.0",
|
|
131
132
|
"koa": "^2.15.3",
|
|
132
|
-
"koa-bodyparser": "^4.4.1"
|
|
133
|
+
"koa-bodyparser": "^4.4.1",
|
|
134
|
+
"zod": "4.3.6"
|
|
135
|
+
},
|
|
136
|
+
"peerDependenciesMeta": {
|
|
137
|
+
"zod": {
|
|
138
|
+
"optional": true
|
|
139
|
+
}
|
|
133
140
|
},
|
|
134
141
|
"devDependencies": {
|
|
135
142
|
"@koa/router": "^13.1.0",
|
|
@@ -148,6 +155,7 @@
|
|
|
148
155
|
"eslint-plugin-simple-import-sort": "^12.1.1",
|
|
149
156
|
"eslint-plugin-unused-imports": "^4.1.4",
|
|
150
157
|
"jest": "29.7.0",
|
|
158
|
+
"zod": "4.3.6",
|
|
151
159
|
"koa": "^2.15.3",
|
|
152
160
|
"koa-bodyparser": "^4.4.1",
|
|
153
161
|
"node-mocks-http": "^1.16.2",
|
|
@@ -159,7 +167,6 @@
|
|
|
159
167
|
"tsconfig-paths": "4.2.0",
|
|
160
168
|
"vite": "^6.2.2",
|
|
161
169
|
"vite-plugin-dts": "^3.7.3",
|
|
162
|
-
"vitest": "^3.0.9"
|
|
163
|
-
"yargs": "^17.7.2"
|
|
170
|
+
"vitest": "^3.0.9"
|
|
164
171
|
}
|
|
165
172
|
}
|
package/{cli → src/cli}/cli.ts
RENAMED
|
@@ -3,9 +3,9 @@ import * as path from 'path'
|
|
|
3
3
|
import yargs, { ArgumentsCamelCase } from 'yargs'
|
|
4
4
|
import { hideBin } from 'yargs/helpers'
|
|
5
5
|
|
|
6
|
-
import { prepareOpenApiSpec } from '../
|
|
7
|
-
import { generateOpenApiSpec } from '../
|
|
8
|
-
import { OpenApiManager } from '../
|
|
6
|
+
import { prepareOpenApiSpec } from '../openapi/analyzerModule/analyzerModule'
|
|
7
|
+
import { generateOpenApiSpec } from '../openapi/generatorModule'
|
|
8
|
+
import { OpenApiManager } from '../openapi/manager/OpenApiManager'
|
|
9
9
|
import { printAnalysisStats } from './prettyprint'
|
|
10
10
|
|
|
11
11
|
const originalConsole = console.info
|
|
@@ -31,12 +31,22 @@ yargs(hideBin(process.argv))
|
|
|
31
31
|
type: 'string',
|
|
32
32
|
coerce: (f) => path.resolve(f),
|
|
33
33
|
},
|
|
34
|
+
|
|
35
|
+
force: {
|
|
36
|
+
describe: 'Overwrite existing file',
|
|
37
|
+
type: 'boolean',
|
|
38
|
+
default: false,
|
|
39
|
+
},
|
|
34
40
|
},
|
|
35
41
|
|
|
36
|
-
handler(argv: ArgumentsCamelCase<{ targetPath: string; tsConfigPath?: string }>) {
|
|
42
|
+
handler(argv: ArgumentsCamelCase<{ targetPath: string; tsConfigPath?: string; force: boolean }>) {
|
|
37
43
|
if (fs.existsSync(argv.targetPath)) {
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
if (!argv.force && !isValidMoonflowerOutput(argv.targetPath)) {
|
|
45
|
+
console.error(
|
|
46
|
+
`[Error] File already exists at ${argv.targetPath} and does not appear to be a moonflower output. Use --force to overwrite.`,
|
|
47
|
+
)
|
|
48
|
+
return
|
|
49
|
+
}
|
|
40
50
|
}
|
|
41
51
|
|
|
42
52
|
if (argv.tsConfigPath && !fs.existsSync(argv.tsConfigPath)) {
|
|
@@ -57,3 +67,13 @@ yargs(hideBin(process.argv))
|
|
|
57
67
|
})
|
|
58
68
|
.demandCommand()
|
|
59
69
|
.parse()
|
|
70
|
+
|
|
71
|
+
function isValidMoonflowerOutput(filePath: string): boolean {
|
|
72
|
+
try {
|
|
73
|
+
const content = fs.readFileSync(filePath, 'utf-8')
|
|
74
|
+
const parsed = JSON.parse(content)
|
|
75
|
+
return typeof parsed === 'object' && parsed !== null && typeof parsed.openapi === 'string'
|
|
76
|
+
} catch {
|
|
77
|
+
return false
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ApiAnalysisStats } from '../
|
|
2
|
-
import { Logger } from '../
|
|
1
|
+
import { ApiAnalysisStats } from '../openapi/manager/OpenApiManager'
|
|
2
|
+
import { Logger } from '../utils/logger'
|
|
3
3
|
|
|
4
4
|
export const printAnalysisStats = (stats: ApiAnalysisStats) => {
|
|
5
5
|
stats.explicitRouterFiles.forEach((file) => printRouterFile(file))
|
|
@@ -34,12 +34,66 @@ export class InternalServerError extends BaseHttpError {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
export class ForbiddenError extends BaseHttpError {
|
|
38
|
+
constructor(message: string) {
|
|
39
|
+
super(StatusCodes.FORBIDDEN, message)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class MethodNotAllowedError extends BaseHttpError {
|
|
44
|
+
constructor(message: string) {
|
|
45
|
+
super(StatusCodes.METHOD_NOT_ALLOWED, message)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export class ConflictError extends BaseHttpError {
|
|
50
|
+
constructor(message: string) {
|
|
51
|
+
super(StatusCodes.CONFLICT, message)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export class GoneError extends BaseHttpError {
|
|
56
|
+
constructor(message: string) {
|
|
57
|
+
super(StatusCodes.GONE, message)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export class UnprocessableEntityError extends BaseHttpError {
|
|
62
|
+
constructor(message: string) {
|
|
63
|
+
super(StatusCodes.UNPROCESSABLE_ENTITY, message)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export class TooManyRequestsError extends BaseHttpError {
|
|
68
|
+
constructor(message: string) {
|
|
69
|
+
super(StatusCodes.TOO_MANY_REQUESTS, message)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export class NotImplementedError extends BaseHttpError {
|
|
74
|
+
constructor(message: string) {
|
|
75
|
+
super(StatusCodes.NOT_IMPLEMENTED, message)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export class BadGatewayError extends BaseHttpError {
|
|
80
|
+
constructor(message: string) {
|
|
81
|
+
super(StatusCodes.BAD_GATEWAY, message)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
37
85
|
export class ServiceUnavailableError extends BaseHttpError {
|
|
38
86
|
constructor(message: string) {
|
|
39
87
|
super(StatusCodes.SERVICE_UNAVAILABLE, message)
|
|
40
88
|
}
|
|
41
89
|
}
|
|
42
90
|
|
|
91
|
+
export class GatewayTimeoutError extends BaseHttpError {
|
|
92
|
+
constructor(message: string) {
|
|
93
|
+
super(StatusCodes.GATEWAY_TIMEOUT, message)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
43
97
|
// To be used later
|
|
44
98
|
// export const errorNameToStatusCode = (name: string): number => {
|
|
45
99
|
// switch (name) {
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { expectTypeOf } from 'vitest'
|
|
2
|
+
import z from 'zod'
|
|
3
|
+
|
|
1
4
|
import {
|
|
2
5
|
BooleanValidator,
|
|
3
6
|
NumberValidator,
|
|
@@ -158,4 +161,28 @@ describe('usePathParams', () => {
|
|
|
158
161
|
expect(test).toThrow(ValidationError)
|
|
159
162
|
expect(test).toThrow("Failed route param validation: 'testParam' (Description)")
|
|
160
163
|
})
|
|
164
|
+
|
|
165
|
+
describe('zod validators', () => {
|
|
166
|
+
it('parses required params when present', () => {
|
|
167
|
+
const ctx = mockContextPath(mockContext(), '/test/:stringParam/:numberParam/:booleanParam', {
|
|
168
|
+
stringParam: 'test_string',
|
|
169
|
+
numberParam: '12',
|
|
170
|
+
booleanParam: 'true',
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
const params = usePathParams(ctx, {
|
|
174
|
+
stringParam: z.string(),
|
|
175
|
+
numberParam: z.number(),
|
|
176
|
+
booleanParam: z.boolean(),
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
expect(params.stringParam).toEqual('test_string')
|
|
180
|
+
expect(params.numberParam).toEqual(12)
|
|
181
|
+
expect(params.booleanParam).toEqual(true)
|
|
182
|
+
|
|
183
|
+
expectTypeOf(params.stringParam).toEqualTypeOf<string>()
|
|
184
|
+
expectTypeOf(params.numberParam).toEqualTypeOf<number>()
|
|
185
|
+
expectTypeOf(params.booleanParam).toEqualTypeOf<boolean>()
|
|
186
|
+
})
|
|
187
|
+
})
|
|
161
188
|
})
|
|
@@ -5,6 +5,7 @@ import { keysOf } from '../utils/object'
|
|
|
5
5
|
import { CleanUpPathParam } from '../utils/TypeUtils'
|
|
6
6
|
import { getValidationResultMessage } from '../utils/validationMessages'
|
|
7
7
|
import { Validator } from '../validators/types'
|
|
8
|
+
import { validateParam } from '../validators/validateParam'
|
|
8
9
|
|
|
9
10
|
type CheckIfOptional<T, B> = B extends string ? (B extends `${string}?` ? T | undefined : T) : never
|
|
10
11
|
|
|
@@ -50,21 +51,12 @@ export const usePathParams = <
|
|
|
50
51
|
|
|
51
52
|
// Param is optional and is not provided - skip validation
|
|
52
53
|
if (paramValue === undefined) {
|
|
53
|
-
return { param, validated: true }
|
|
54
|
+
return { param, validated: true, parsedValue: undefined, exception: null }
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const parsedValue = validatorObject.parse(paramValue)
|
|
60
|
-
const validatorSuccess = !validatorObject.validate || validatorObject.validate(parsedValue)
|
|
61
|
-
return {
|
|
62
|
-
param,
|
|
63
|
-
validated: prevalidatorSuccess && validatorSuccess,
|
|
64
|
-
parsedValue,
|
|
65
|
-
}
|
|
66
|
-
} catch {
|
|
67
|
-
return { param, validated: false }
|
|
57
|
+
return {
|
|
58
|
+
...validateParam(param.validator, paramValue),
|
|
59
|
+
param,
|
|
68
60
|
}
|
|
69
61
|
})
|
|
70
62
|
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { expectTypeOf } from 'vitest'
|
|
2
|
+
import z from 'zod'
|
|
3
|
+
|
|
1
4
|
import {
|
|
2
5
|
BigIntValidator,
|
|
3
6
|
BooleanValidator,
|
|
@@ -221,4 +224,100 @@ describe('useQueryParams', () => {
|
|
|
221
224
|
expect(test).toThrow(ValidationError)
|
|
222
225
|
expect(test).toThrow("Failed query param validation: 'testParam' (Description)")
|
|
223
226
|
})
|
|
227
|
+
|
|
228
|
+
describe('zod validators', () => {
|
|
229
|
+
it('parses required params when present', () => {
|
|
230
|
+
const ctx = mockContextQuery(mockContext(), {
|
|
231
|
+
stringParam: 'test_string',
|
|
232
|
+
numberParam: '12',
|
|
233
|
+
booleanParam: 'true',
|
|
234
|
+
objectParam: JSON.stringify({
|
|
235
|
+
foo: 'aaa',
|
|
236
|
+
bar: 'bbb',
|
|
237
|
+
}),
|
|
238
|
+
arrayParam: JSON.stringify([
|
|
239
|
+
{
|
|
240
|
+
foo: 'aaa',
|
|
241
|
+
bar: 'bbb',
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
foo: 'ccc',
|
|
245
|
+
bar: 'ddd',
|
|
246
|
+
},
|
|
247
|
+
]),
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
const params = useQueryParams(ctx, {
|
|
251
|
+
stringParam: z.string(),
|
|
252
|
+
numberParam: z.number(),
|
|
253
|
+
booleanParam: z.boolean(),
|
|
254
|
+
objectParam: z.object({
|
|
255
|
+
foo: z.string(),
|
|
256
|
+
bar: z.string(),
|
|
257
|
+
}),
|
|
258
|
+
arrayParam: z.array(
|
|
259
|
+
z.object({
|
|
260
|
+
foo: z.string(),
|
|
261
|
+
bar: z.string(),
|
|
262
|
+
}),
|
|
263
|
+
),
|
|
264
|
+
})
|
|
265
|
+
|
|
266
|
+
expect(params.stringParam).toEqual('test_string')
|
|
267
|
+
expect(params.numberParam).toEqual(12)
|
|
268
|
+
expect(params.booleanParam).toEqual(true)
|
|
269
|
+
expect(params.objectParam).toEqual({ foo: 'aaa', bar: 'bbb' })
|
|
270
|
+
expect(params.arrayParam).toEqual([
|
|
271
|
+
{ foo: 'aaa', bar: 'bbb' },
|
|
272
|
+
{ foo: 'ccc', bar: 'ddd' },
|
|
273
|
+
])
|
|
274
|
+
|
|
275
|
+
expectTypeOf(params.stringParam).toEqualTypeOf<string>()
|
|
276
|
+
expectTypeOf(params.numberParam).toEqualTypeOf<number>()
|
|
277
|
+
expectTypeOf(params.booleanParam).toEqualTypeOf<boolean>()
|
|
278
|
+
expectTypeOf(params.objectParam).toEqualTypeOf<{ foo: string; bar: string }>()
|
|
279
|
+
expectTypeOf(params.arrayParam).toEqualTypeOf<{ foo: string; bar: string }[]>()
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
it('throws if a required param is missing', () => {
|
|
283
|
+
const ctx = mockContextQuery(mockContext(), {
|
|
284
|
+
stringParam: 'test_string',
|
|
285
|
+
})
|
|
286
|
+
|
|
287
|
+
const test = () => {
|
|
288
|
+
useQueryParams(ctx, {
|
|
289
|
+
stringParam: z.string(),
|
|
290
|
+
numberParam: z.number(),
|
|
291
|
+
})
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
expect(test).toThrow(ValidationError)
|
|
295
|
+
expect(test).toThrow("Missing query params: 'numberParam'")
|
|
296
|
+
})
|
|
297
|
+
|
|
298
|
+
it('allows missing params when optional', () => {
|
|
299
|
+
const ctx = mockContextQuery(mockContext(), {
|
|
300
|
+
stringParam: 'test_string',
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
const test = () => {
|
|
304
|
+
useQueryParams(ctx, {
|
|
305
|
+
stringParam: z.string(),
|
|
306
|
+
numberParam: z.number().optional(),
|
|
307
|
+
})
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
expect(test).not.toThrow(ValidationError)
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
it('infers the return type of optional params', () => {
|
|
314
|
+
const ctx = mockContextQuery(mockContext(), {})
|
|
315
|
+
|
|
316
|
+
const params = useQueryParams(ctx, {
|
|
317
|
+
numberParam: z.number().optional(),
|
|
318
|
+
})
|
|
319
|
+
|
|
320
|
+
expectTypeOf(params.numberParam).toEqualTypeOf<number | undefined>()
|
|
321
|
+
})
|
|
322
|
+
})
|
|
224
323
|
})
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import { ParameterizedContext } from 'koa'
|
|
2
|
+
import z from 'zod'
|
|
2
3
|
|
|
3
4
|
import { ValidationError } from '../errors/UserFacingErrors'
|
|
4
5
|
import { keysOf } from '../utils/object'
|
|
5
|
-
import {
|
|
6
|
+
import { getValidationResultMessage } from '../utils/validationMessages'
|
|
6
7
|
import { Validator } from '../validators/types'
|
|
8
|
+
import { validateMissingParams } from '../validators/validateMissingParams'
|
|
9
|
+
import { validateParam } from '../validators/validateParam'
|
|
7
10
|
|
|
8
11
|
type CheckIfOptional<T, B extends boolean | undefined> = B extends false ? T : T | undefined
|
|
9
12
|
|
|
10
|
-
type ValidatedData<T extends Record<string, Validator<any>>> = {
|
|
11
|
-
[K in keyof T]: CheckIfOptional<
|
|
13
|
+
type ValidatedData<T extends Record<string, Validator<any> | z.ZodType<any>>> = {
|
|
14
|
+
[K in keyof T]: CheckIfOptional<
|
|
15
|
+
ReturnType<T[K] extends Validator<any> ? T[K]['parse'] : T[K]['parse']>,
|
|
16
|
+
T[K] extends Validator<any> ? T[K]['optional'] : false
|
|
17
|
+
>
|
|
12
18
|
}
|
|
13
19
|
|
|
14
|
-
export const useQueryParams = <ValidatorsT extends Record<string, Validator<any>>>(
|
|
20
|
+
export const useQueryParams = <ValidatorsT extends Record<string, Validator<any> | z.ZodType<any>>>(
|
|
15
21
|
ctx: ParameterizedContext,
|
|
16
22
|
validators: ValidatorsT,
|
|
17
23
|
): ValidatedData<ValidatorsT> => {
|
|
@@ -21,34 +27,19 @@ export const useQueryParams = <ValidatorsT extends Record<string, Validator<any>
|
|
|
21
27
|
validator: validators[name],
|
|
22
28
|
}))
|
|
23
29
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (missingParams.length > 0) {
|
|
27
|
-
throw new ValidationError(
|
|
28
|
-
`Missing query params: ${missingParams.map((param) => getMissingParamMessage(param)).join(', ')}`,
|
|
29
|
-
)
|
|
30
|
-
}
|
|
30
|
+
validateMissingParams(params, query, validators, 'query')
|
|
31
31
|
|
|
32
32
|
const validationResults = params.map((param) => {
|
|
33
|
-
const paramValue = query[param.name]
|
|
33
|
+
const paramValue = query[param.name]
|
|
34
34
|
|
|
35
35
|
// Param is optional and is not provided - skip validation
|
|
36
36
|
if (paramValue === undefined) {
|
|
37
|
-
return { param, validated: true }
|
|
37
|
+
return { param, validated: true, parsedValue: undefined, exception: null }
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const parsedValue = validatorObject.parse(paramValue)
|
|
44
|
-
const validatorSuccess = !validatorObject.validate || validatorObject.validate(parsedValue)
|
|
45
|
-
return {
|
|
46
|
-
param,
|
|
47
|
-
validated: prevalidatorSuccess && validatorSuccess,
|
|
48
|
-
parsedValue,
|
|
49
|
-
}
|
|
50
|
-
} catch {
|
|
51
|
-
return { param, validated: false }
|
|
40
|
+
return {
|
|
41
|
+
...validateParam(param.validator, paramValue),
|
|
42
|
+
param,
|
|
52
43
|
}
|
|
53
44
|
})
|
|
54
45
|
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { expectTypeOf } from 'vitest'
|
|
2
|
+
import z from 'zod'
|
|
3
|
+
|
|
1
4
|
import {
|
|
2
5
|
BooleanValidator,
|
|
3
6
|
NullableNumberValidator,
|
|
@@ -241,4 +244,100 @@ describe('useRequestBody', () => {
|
|
|
241
244
|
expect(test).toThrow(ValidationError)
|
|
242
245
|
expect(test).toThrow("Failed body param validation: 'testParam' (Description)")
|
|
243
246
|
})
|
|
247
|
+
|
|
248
|
+
describe('zod validators', () => {
|
|
249
|
+
it('parses required params when present', () => {
|
|
250
|
+
const ctx = mockContextBody(mockContext(), {
|
|
251
|
+
stringParam: 'test_string',
|
|
252
|
+
numberParam: '12',
|
|
253
|
+
booleanParam: 'true',
|
|
254
|
+
objectParam: {
|
|
255
|
+
foo: 'aaa',
|
|
256
|
+
bar: 'bbb',
|
|
257
|
+
},
|
|
258
|
+
arrayParam: [
|
|
259
|
+
{
|
|
260
|
+
foo: 'aaa',
|
|
261
|
+
bar: 'bbb',
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
foo: 'ccc',
|
|
265
|
+
bar: 'ddd',
|
|
266
|
+
},
|
|
267
|
+
],
|
|
268
|
+
})
|
|
269
|
+
|
|
270
|
+
const params = useRequestBody(ctx, {
|
|
271
|
+
stringParam: z.string(),
|
|
272
|
+
numberParam: z.number(),
|
|
273
|
+
booleanParam: z.boolean(),
|
|
274
|
+
objectParam: z.object({
|
|
275
|
+
foo: z.string(),
|
|
276
|
+
bar: z.string(),
|
|
277
|
+
}),
|
|
278
|
+
arrayParam: z.array(
|
|
279
|
+
z.object({
|
|
280
|
+
foo: z.string(),
|
|
281
|
+
bar: z.string(),
|
|
282
|
+
}),
|
|
283
|
+
),
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
expect(params.stringParam).toEqual('test_string')
|
|
287
|
+
expect(params.numberParam).toEqual(12)
|
|
288
|
+
expect(params.booleanParam).toEqual(true)
|
|
289
|
+
expect(params.objectParam).toEqual({ foo: 'aaa', bar: 'bbb' })
|
|
290
|
+
expect(params.arrayParam).toEqual([
|
|
291
|
+
{ foo: 'aaa', bar: 'bbb' },
|
|
292
|
+
{ foo: 'ccc', bar: 'ddd' },
|
|
293
|
+
])
|
|
294
|
+
|
|
295
|
+
expectTypeOf(params.stringParam).toEqualTypeOf<string>()
|
|
296
|
+
expectTypeOf(params.numberParam).toEqualTypeOf<number>()
|
|
297
|
+
expectTypeOf(params.booleanParam).toEqualTypeOf<boolean>()
|
|
298
|
+
expectTypeOf(params.objectParam).toEqualTypeOf<{ foo: string; bar: string }>()
|
|
299
|
+
expectTypeOf(params.arrayParam).toEqualTypeOf<{ foo: string; bar: string }[]>()
|
|
300
|
+
})
|
|
301
|
+
|
|
302
|
+
it('throws if a required param is missing', () => {
|
|
303
|
+
const ctx = mockContextBody(mockContext(), {
|
|
304
|
+
stringParam: 'test_string',
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
const test = () => {
|
|
308
|
+
useRequestBody(ctx, {
|
|
309
|
+
stringParam: z.string(),
|
|
310
|
+
numberParam: z.number(),
|
|
311
|
+
})
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
expect(test).toThrow(ValidationError)
|
|
315
|
+
expect(test).toThrow("Missing body params: 'numberParam'")
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
it('allows missing params when optional', () => {
|
|
319
|
+
const ctx = mockContextBody(mockContext(), {
|
|
320
|
+
stringParam: 'test_string',
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
const test = () => {
|
|
324
|
+
useRequestBody(ctx, {
|
|
325
|
+
stringParam: z.string(),
|
|
326
|
+
numberParam: z.number().optional(),
|
|
327
|
+
})
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
expect(test).not.toThrow(ValidationError)
|
|
331
|
+
})
|
|
332
|
+
|
|
333
|
+
it('infers the return type of optional params', () => {
|
|
334
|
+
const ctx = mockContextBody(mockContext(), {})
|
|
335
|
+
|
|
336
|
+
const params = useRequestBody(ctx, {
|
|
337
|
+
numberParam: z.number().optional(),
|
|
338
|
+
})
|
|
339
|
+
|
|
340
|
+
expectTypeOf(params.numberParam).toEqualTypeOf<number | undefined>()
|
|
341
|
+
})
|
|
342
|
+
})
|
|
244
343
|
})
|