vibe64 0.1.21
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/.jskit/lock.json +485 -0
- package/bin/dev.js +49 -0
- package/bin/run.js +410 -0
- package/bin/server.js +49 -0
- package/config/public.js +42 -0
- package/config/server.js +1 -0
- package/config/surfaceAccessPolicies.js +3 -0
- package/dist/assets/ProjectTypeGate-DStq4W4X.js +1 -0
- package/dist/assets/ProjectTypeGate-Dh2ycSoM.css +1 -0
- package/dist/assets/SetupReadinessGate-CrNkQiVF.css +1 -0
- package/dist/assets/SetupReadinessGate-DkkorR2Y.js +1 -0
- package/dist/assets/ShellLayout-BcKS2HG9.js +1 -0
- package/dist/assets/ShellLayout-iIToXwhu.css +1 -0
- package/dist/assets/VTabs-BJ8MKoig.js +1 -0
- package/dist/assets/VTabs-CeSUETEY.css +1 -0
- package/dist/assets/error-CwT53qTu.js +1 -0
- package/dist/assets/favicon-B93tlu1U.svg +7 -0
- package/dist/assets/history-DlGwVMJG.css +1 -0
- package/dist/assets/history-HQ_XliX2.js +1 -0
- package/dist/assets/home-B89EbUmA.js +1 -0
- package/dist/assets/home-BFMergZX.css +1 -0
- package/dist/assets/index-16P0GeGq.js +134 -0
- package/dist/assets/index-BJxDQvyK.js +1 -0
- package/dist/assets/index-Bf6YPMks.css +1 -0
- package/dist/assets/index-CEtTJqh9.css +1 -0
- package/dist/assets/index-CY-wDjNv.js +51 -0
- package/dist/assets/index-eMhOXhf_.css +1 -0
- package/dist/assets/placement-7FCYadh2.js +1 -0
- package/dist/assets/placementTopology-DzizQX71.js +1 -0
- package/dist/assets/route-block-B_A1xBdJ.js +1 -0
- package/dist/assets/setup-BTfwzKoL.css +1 -0
- package/dist/assets/setup-BzzdD38G.js +4 -0
- package/dist/assets/streamEvents-Ba9kHw-1.js +1 -0
- package/dist/assets/studioGateApi-hkZdLr1Y.js +1 -0
- package/dist/assets/target-scripts-8hczu84t.js +1 -0
- package/dist/assets/target-scripts-BlbS3u6b.css +1 -0
- package/dist/assets/useStudioTerminal-D9TNb50w.js +1 -0
- package/dist/assets/vibe64SessionPanelModel-DvY_IbW3.js +1 -0
- package/dist/assets/xterm-6GBZ9nXN.css +32 -0
- package/dist/assets/xterm-BADreHn8.js +38 -0
- package/dist/index.html +14 -0
- package/node_modules/@jskit-ai/kernel/_testable/index.js +4 -0
- package/node_modules/@jskit-ai/kernel/client/appConfig.js +47 -0
- package/node_modules/@jskit-ai/kernel/client/appConfig.test.js +71 -0
- package/node_modules/@jskit-ai/kernel/client/componentInteraction.js +51 -0
- package/node_modules/@jskit-ai/kernel/client/componentInteraction.test.js +111 -0
- package/node_modules/@jskit-ai/kernel/client/descriptorSections.js +75 -0
- package/node_modules/@jskit-ai/kernel/client/index.d.ts +95 -0
- package/node_modules/@jskit-ai/kernel/client/index.js +4 -0
- package/node_modules/@jskit-ai/kernel/client/logging.js +38 -0
- package/node_modules/@jskit-ai/kernel/client/mobileLaunchRouting.js +231 -0
- package/node_modules/@jskit-ai/kernel/client/mobileLaunchRouting.test.js +230 -0
- package/node_modules/@jskit-ai/kernel/client/moduleBootstrap.js +664 -0
- package/node_modules/@jskit-ai/kernel/client/moduleBootstrap.test.js +420 -0
- package/node_modules/@jskit-ai/kernel/client/pageRedirects.d.ts +5 -0
- package/node_modules/@jskit-ai/kernel/client/pageRedirects.js +45 -0
- package/node_modules/@jskit-ai/kernel/client/pageRedirects.test.js +71 -0
- package/node_modules/@jskit-ai/kernel/client/shellBootstrap.js +252 -0
- package/node_modules/@jskit-ai/kernel/client/shellBootstrap.test.js +195 -0
- package/node_modules/@jskit-ai/kernel/client/shellRouting.js +321 -0
- package/node_modules/@jskit-ai/kernel/client/shellRouting.test.js +113 -0
- package/node_modules/@jskit-ai/kernel/client/vite/clientBootstrapPlugin.js +260 -0
- package/node_modules/@jskit-ai/kernel/client/vite/clientBootstrapPlugin.test.js +563 -0
- package/node_modules/@jskit-ai/kernel/client/vite/index.js +3 -0
- package/node_modules/@jskit-ai/kernel/internal/node/fileSystem.js +21 -0
- package/node_modules/@jskit-ai/kernel/internal/node/installedPackageDescriptor.js +125 -0
- package/node_modules/@jskit-ai/kernel/package.json +58 -0
- package/node_modules/@jskit-ai/kernel/server/actions/ActionRuntimeServiceProvider.js +304 -0
- package/node_modules/@jskit-ai/kernel/server/actions/ActionRuntimeServiceProvider.test.js +558 -0
- package/node_modules/@jskit-ai/kernel/server/actions/index.js +6 -0
- package/node_modules/@jskit-ai/kernel/server/container/ContainerCoreServiceProvider.js +27 -0
- package/node_modules/@jskit-ai/kernel/server/container/index.js +10 -0
- package/node_modules/@jskit-ai/kernel/server/exportPolicy.test.js +68 -0
- package/node_modules/@jskit-ai/kernel/server/http/HttpFastifyServiceProvider.js +25 -0
- package/node_modules/@jskit-ai/kernel/server/http/_testable/index.js +2 -0
- package/node_modules/@jskit-ai/kernel/server/http/index.js +1 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/controller.js +183 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/controller.test.js +143 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/errors.js +12 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/httpRuntime.js +83 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/index.js +17 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/kernel.js +15 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/kernel.test.js +1565 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/middlewareRuntime.js +149 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/requestActionExecutor.js +265 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/requestScope.js +57 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/routeRegistration.js +415 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/routeSupport.js +45 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/routeTransport.js +126 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/routeValidator.js +404 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/routeValidator.test.js +581 -0
- package/node_modules/@jskit-ai/kernel/server/http/lib/router.js +239 -0
- package/node_modules/@jskit-ai/kernel/server/kernel/KernelCoreServiceProvider.js +27 -0
- package/node_modules/@jskit-ai/kernel/server/kernel/index.js +10 -0
- package/node_modules/@jskit-ai/kernel/server/platform/PlatformServerRuntimeServiceProvider.js +30 -0
- package/node_modules/@jskit-ai/kernel/server/platform/index.js +5 -0
- package/node_modules/@jskit-ai/kernel/server/platform/providerRuntime/descriptorCatalog.js +170 -0
- package/node_modules/@jskit-ai/kernel/server/platform/providerRuntime/helpers.js +45 -0
- package/node_modules/@jskit-ai/kernel/server/platform/providerRuntime/lockfile.js +27 -0
- package/node_modules/@jskit-ai/kernel/server/platform/providerRuntime/providerLoader.js +283 -0
- package/node_modules/@jskit-ai/kernel/server/platform/providerRuntime.js +153 -0
- package/node_modules/@jskit-ai/kernel/server/platform/providerRuntime.test.js +329 -0
- package/node_modules/@jskit-ai/kernel/server/platform/runtime.js +40 -0
- package/node_modules/@jskit-ai/kernel/server/platform/surfaceRuntime.js +150 -0
- package/node_modules/@jskit-ai/kernel/server/platform/surfaceRuntime.test.js +136 -0
- package/node_modules/@jskit-ai/kernel/server/registries/actionSurfaceSourceRegistry.js +148 -0
- package/node_modules/@jskit-ai/kernel/server/registries/bootstrapPayloadContributorRegistry.js +51 -0
- package/node_modules/@jskit-ai/kernel/server/registries/domainEventListenerRegistry.js +58 -0
- package/node_modules/@jskit-ai/kernel/server/registries/index.js +32 -0
- package/node_modules/@jskit-ai/kernel/server/registries/primitives.js +63 -0
- package/node_modules/@jskit-ai/kernel/server/registries/routeVisibilityResolverRegistry.js +84 -0
- package/node_modules/@jskit-ai/kernel/server/registries/serviceRegistrationRegistry.js +428 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/ServerRuntimeCoreServiceProvider.js +64 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/ServerRuntimeCoreServiceProvider.test.js +53 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/apiRoutePolicyParity.test.js +109 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/apiRouteRegistration.js +65 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/bootBootstrapRoutes.js +29 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/bootBootstrapRoutes.test.js +69 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/bootstrapContributors.test.js +166 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/canonicalJson.js +74 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/composition.js +142 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/domainEvents.test.js +114 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/domainRules.js +50 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/domainRules.test.js +87 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/entityChangeEvents.js +182 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/entityChangeEvents.test.js +211 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/errors.js +68 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/errors.test.js +73 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/fastifyBootstrap.js +553 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/fastifyBootstrap.test.js +380 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/index.js +6 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/integers.js +13 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/moduleConfig.js +223 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/moduleConfig.test.js +165 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/pagination.js +13 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/realtimeNormalization.js +21 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/requestUrl.js +38 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/routeUtils.js +20 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/runtimeAssembly.js +113 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/runtimeKernel.js +55 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/securityAudit.js +269 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/securityAudit.test.js +41 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/serviceAuthorization.js +113 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/serviceAuthorization.test.js +100 -0
- package/node_modules/@jskit-ai/kernel/server/runtime/serviceRegistration.test.js +197 -0
- package/node_modules/@jskit-ai/kernel/server/support/SupportCoreServiceProvider.js +27 -0
- package/node_modules/@jskit-ai/kernel/server/support/appConfig.js +128 -0
- package/node_modules/@jskit-ai/kernel/server/support/appConfig.test.js +195 -0
- package/node_modules/@jskit-ai/kernel/server/support/appConfigFiles.js +80 -0
- package/node_modules/@jskit-ai/kernel/server/support/appConfigFiles.test.js +94 -0
- package/node_modules/@jskit-ai/kernel/server/support/defaultMissingHandler.js +7 -0
- package/node_modules/@jskit-ai/kernel/server/support/importFreshModuleFromAbsolutePath.js +23 -0
- package/node_modules/@jskit-ai/kernel/server/support/importFreshModuleFromAbsolutePath.test.js +36 -0
- package/node_modules/@jskit-ai/kernel/server/support/index.js +24 -0
- package/node_modules/@jskit-ai/kernel/server/support/pageTargets.js +772 -0
- package/node_modules/@jskit-ai/kernel/server/support/pageTargets.test.js +659 -0
- package/node_modules/@jskit-ai/kernel/server/support/path.js +20 -0
- package/node_modules/@jskit-ai/kernel/server/support/routePolicyConfig.js +51 -0
- package/node_modules/@jskit-ai/kernel/server/support/shellOutlets.js +612 -0
- package/node_modules/@jskit-ai/kernel/server/support/shellOutlets.test.js +339 -0
- package/node_modules/@jskit-ai/kernel/server/support/symlinkSafeRequire.js +78 -0
- package/node_modules/@jskit-ai/kernel/server/support/symlinkSafeRequire.test.js +27 -0
- package/node_modules/@jskit-ai/kernel/server/surface/SurfaceRoutingServiceProvider.js +27 -0
- package/node_modules/@jskit-ai/kernel/server/surface/index.js +19 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/actionContributorHelpers.js +28 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/actionContributorHelpers.test.js +16 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/actionDefinitions.js +375 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/actionDefinitions.test.js +193 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/audit.js +7 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/executionContext.js +86 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/executionContext.test.js +66 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/idempotency.js +62 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/index.js +2 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/observability.js +10 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/pipeline.js +287 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/policies.js +198 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/policies.test.js +222 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/registry.js +187 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/registry.test.js +355 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/requestMeta.js +36 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/textNormalization.js +3 -0
- package/node_modules/@jskit-ai/kernel/shared/actions/withActionDefaults.js +34 -0
- package/node_modules/@jskit-ai/kernel/shared/index.js +2 -0
- package/node_modules/@jskit-ai/kernel/shared/runtime/application.js +323 -0
- package/node_modules/@jskit-ai/kernel/shared/runtime/container.js +261 -0
- package/node_modules/@jskit-ai/kernel/shared/runtime/containerErrors.js +22 -0
- package/node_modules/@jskit-ai/kernel/shared/runtime/index.js +18 -0
- package/node_modules/@jskit-ai/kernel/shared/runtime/kernelErrors.js +20 -0
- package/node_modules/@jskit-ai/kernel/shared/runtime/serviceProvider.js +13 -0
- package/node_modules/@jskit-ai/kernel/shared/support/containerToken.js +8 -0
- package/node_modules/@jskit-ai/kernel/shared/support/crudFieldContract.js +322 -0
- package/node_modules/@jskit-ai/kernel/shared/support/crudFieldContract.test.js +67 -0
- package/node_modules/@jskit-ai/kernel/shared/support/crudListFilters.js +838 -0
- package/node_modules/@jskit-ai/kernel/shared/support/crudListFilters.test.js +305 -0
- package/node_modules/@jskit-ai/kernel/shared/support/crudLookup.js +179 -0
- package/node_modules/@jskit-ai/kernel/shared/support/crudLookup.test.js +248 -0
- package/node_modules/@jskit-ai/kernel/shared/support/deepFreeze.js +18 -0
- package/node_modules/@jskit-ai/kernel/shared/support/formatDateTime.js +10 -0
- package/node_modules/@jskit-ai/kernel/shared/support/formatDateTime.test.js +15 -0
- package/node_modules/@jskit-ai/kernel/shared/support/generatedUiContract.js +542 -0
- package/node_modules/@jskit-ai/kernel/shared/support/generatedUiContract.test.js +208 -0
- package/node_modules/@jskit-ai/kernel/shared/support/index.js +15 -0
- package/node_modules/@jskit-ai/kernel/shared/support/linkPath.js +67 -0
- package/node_modules/@jskit-ai/kernel/shared/support/linkPath.test.js +35 -0
- package/node_modules/@jskit-ai/kernel/shared/support/listenerSet.js +26 -0
- package/node_modules/@jskit-ai/kernel/shared/support/normalize.js +379 -0
- package/node_modules/@jskit-ai/kernel/shared/support/normalize.test.js +326 -0
- package/node_modules/@jskit-ai/kernel/shared/support/packageDescriptor.test.js +147 -0
- package/node_modules/@jskit-ai/kernel/shared/support/permissions.js +50 -0
- package/node_modules/@jskit-ai/kernel/shared/support/pickOwnProperties.js +17 -0
- package/node_modules/@jskit-ai/kernel/shared/support/pickOwnProperties.test.js +25 -0
- package/node_modules/@jskit-ai/kernel/shared/support/policies.js +11 -0
- package/node_modules/@jskit-ai/kernel/shared/support/providerLogger.js +42 -0
- package/node_modules/@jskit-ai/kernel/shared/support/queryPath.js +51 -0
- package/node_modules/@jskit-ai/kernel/shared/support/queryPath.test.js +39 -0
- package/node_modules/@jskit-ai/kernel/shared/support/queryResilience.js +34 -0
- package/node_modules/@jskit-ai/kernel/shared/support/queryResilience.test.js +33 -0
- package/node_modules/@jskit-ai/kernel/shared/support/returnToPath.js +153 -0
- package/node_modules/@jskit-ai/kernel/shared/support/returnToPath.test.js +123 -0
- package/node_modules/@jskit-ai/kernel/shared/support/shellLayoutTargets.js +393 -0
- package/node_modules/@jskit-ai/kernel/shared/support/shellLayoutTargets.test.js +120 -0
- package/node_modules/@jskit-ai/kernel/shared/support/sorting.js +15 -0
- package/node_modules/@jskit-ai/kernel/shared/support/stringCase.js +26 -0
- package/node_modules/@jskit-ai/kernel/shared/support/tokens.js +1 -0
- package/node_modules/@jskit-ai/kernel/shared/support/tokens.test.js +17 -0
- package/node_modules/@jskit-ai/kernel/shared/support/visibility.js +93 -0
- package/node_modules/@jskit-ai/kernel/shared/support/visibility.test.js +63 -0
- package/node_modules/@jskit-ai/kernel/shared/surface/apiPaths.js +157 -0
- package/node_modules/@jskit-ai/kernel/shared/surface/apiPaths.test.js +31 -0
- package/node_modules/@jskit-ai/kernel/shared/surface/escapeRegExp.js +5 -0
- package/node_modules/@jskit-ai/kernel/shared/surface/index.js +10 -0
- package/node_modules/@jskit-ai/kernel/shared/surface/paths.js +273 -0
- package/node_modules/@jskit-ai/kernel/shared/surface/registry.js +137 -0
- package/node_modules/@jskit-ai/kernel/shared/surface/registry.test.js +44 -0
- package/node_modules/@jskit-ai/kernel/shared/surface/runtime.js +357 -0
- package/node_modules/@jskit-ai/kernel/shared/surface/runtime.test.js +319 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/composeSchemaDefinitions.js +53 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/composeSchemaDefinitions.test.js +156 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/createCursorListValidator.js +29 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/createCursorListValidator.test.js +33 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/cursorPaginationQueryValidator.js +23 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/cursorPaginationQueryValidator.test.js +36 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/htmlTimeSchemas.js +15 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/index.js +35 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/inputNormalization.js +13 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/jsonRestSchemaSupport.js +139 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/mergeObjectSchemas.js +69 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/mergeObjectSchemas.test.js +92 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/recordIdParamsValidator.js +41 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/recordIdParamsValidator.test.js +28 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/resourceRequiredMetadata.js +41 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/resourceRequiredMetadata.test.js +62 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/schemaDefinitions.js +126 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/schemaDefinitions.test.js +51 -0
- package/node_modules/@jskit-ai/kernel/shared/validators/schemaPayloadValidation.js +65 -0
- package/node_modules/@jskit-ai/kernel/test/barrelExposure.test.js +143 -0
- package/node_modules/@jskit-ai/kernel/test/dynamicImportPolicy.test.js +89 -0
- package/node_modules/@jskit-ai/kernel/test/exportsContract.test.js +174 -0
- package/node_modules/@jskit-ai/kernel/test/routeInputContractGuard.test.js +82 -0
- package/node_modules/@jskit-ai/kernel/test/stringCase.test.js +22 -0
- package/node_modules/@jskit-ai/kernel/test/surfaceIndependence.test.js +109 -0
- package/node_modules/@local/adapter-setup-doctor/package.descriptor.mjs +71 -0
- package/node_modules/@local/adapter-setup-doctor/package.json +17 -0
- package/node_modules/@local/adapter-setup-doctor/src/server/AdapterSetupDoctorProvider.js +60 -0
- package/node_modules/@local/adapter-setup-doctor/src/server/actions.js +32 -0
- package/node_modules/@local/adapter-setup-doctor/src/server/inputSchemas.js +49 -0
- package/node_modules/@local/adapter-setup-doctor/src/server/registerRoutes.js +33 -0
- package/node_modules/@local/adapter-setup-doctor/src/server/service.js +782 -0
- package/node_modules/@local/current-app/package.descriptor.mjs +80 -0
- package/node_modules/@local/current-app/package.json +22 -0
- package/node_modules/@local/current-app/src/server/CurrentAppProvider.js +68 -0
- package/node_modules/@local/current-app/src/server/actions.js +114 -0
- package/node_modules/@local/current-app/src/server/inputSchemas.js +49 -0
- package/node_modules/@local/current-app/src/server/registerRoutes.js +116 -0
- package/node_modules/@local/current-app/src/server/service.js +630 -0
- package/node_modules/@local/main/package.descriptor.mjs +71 -0
- package/node_modules/@local/main/package.json +15 -0
- package/node_modules/@local/main/src/client/index.js +13 -0
- package/node_modules/@local/main/src/client/providers/MainClientProvider.js +30 -0
- package/node_modules/@local/main/src/server/MainServiceProvider.js +20 -0
- package/node_modules/@local/main/src/server/index.js +1 -0
- package/node_modules/@local/main/src/server/loadAppConfig.js +9 -0
- package/node_modules/@local/main/src/shared/index.js +10 -0
- package/node_modules/@local/main/src/shared/schemas/index.js +22 -0
- package/node_modules/@local/project-setup-doctor/package.descriptor.mjs +69 -0
- package/node_modules/@local/project-setup-doctor/package.json +16 -0
- package/node_modules/@local/project-setup-doctor/src/server/ProjectSetupDoctorProvider.js +60 -0
- package/node_modules/@local/project-setup-doctor/src/server/actions.js +32 -0
- package/node_modules/@local/project-setup-doctor/src/server/inputSchemas.js +49 -0
- package/node_modules/@local/project-setup-doctor/src/server/registerRoutes.js +33 -0
- package/node_modules/@local/project-setup-doctor/src/server/service.js +1398 -0
- package/node_modules/@local/setup-doctor-core/README.md +9 -0
- package/node_modules/@local/setup-doctor-core/package.descriptor.mjs +49 -0
- package/node_modules/@local/setup-doctor-core/package.json +17 -0
- package/node_modules/@local/setup-doctor-core/src/index.js +1 -0
- package/node_modules/@local/setup-doctor-core/src/server/doctorPluginToolkit.js +564 -0
- package/node_modules/@local/setup-doctor-core/src/server/doctorPlugins.js +170 -0
- package/node_modules/@local/setup-doctor-core/src/server/doctorRoutes.js +201 -0
- package/node_modules/@local/setup-doctor-core/src/server/doctorStatusCache.js +265 -0
- package/node_modules/@local/setup-doctor-core/src/server/doctorStream.js +107 -0
- package/node_modules/@local/setup-doctor-core/src/server/doctorToolchain.js +140 -0
- package/node_modules/@local/setup-doctor-core/src/server/doctorToolchainCommands.js +55 -0
- package/node_modules/@local/setup-doctor-core/src/server/githubRemote.js +23 -0
- package/node_modules/@local/setup-doctor-core/src/server/githubRepoSetupScript.js +24 -0
- package/node_modules/@local/setup-doctor-core/src/server/index.js +10 -0
- package/node_modules/@local/setup-doctor-core/src/server/setupDoctorGit.js +820 -0
- package/node_modules/@local/setup-doctor-core/src/shared/index.js +1 -0
- package/node_modules/@local/studio-setup-doctor/package.descriptor.mjs +70 -0
- package/node_modules/@local/studio-setup-doctor/package.json +17 -0
- package/node_modules/@local/studio-setup-doctor/src/server/StudioSetupDoctorProvider.js +61 -0
- package/node_modules/@local/studio-setup-doctor/src/server/actions.js +31 -0
- package/node_modules/@local/studio-setup-doctor/src/server/containerEngine.js +18 -0
- package/node_modules/@local/studio-setup-doctor/src/server/inputSchemas.js +45 -0
- package/node_modules/@local/studio-setup-doctor/src/server/registerRoutes.js +33 -0
- package/node_modules/@local/studio-setup-doctor/src/server/service.js +704 -0
- package/node_modules/@local/studio-terminal-core/README.md +9 -0
- package/node_modules/@local/studio-terminal-core/package.descriptor.mjs +50 -0
- package/node_modules/@local/studio-terminal-core/package.json +17 -0
- package/node_modules/@local/studio-terminal-core/src/index.js +1 -0
- package/node_modules/@local/studio-terminal-core/src/server/containerRuntime.js +53 -0
- package/node_modules/@local/studio-terminal-core/src/server/dockerRuntime.js +30 -0
- package/node_modules/@local/studio-terminal-core/src/server/gitToolchainMounts.js +98 -0
- package/node_modules/@local/studio-terminal-core/src/server/index.js +14 -0
- package/node_modules/@local/studio-terminal-core/src/server/launchTargetTerminal.js +541 -0
- package/node_modules/@local/studio-terminal-core/src/server/managedDatabases.js +429 -0
- package/node_modules/@local/studio-terminal-core/src/server/runtimeContainers.js +912 -0
- package/node_modules/@local/studio-terminal-core/src/server/shellCommands.js +96 -0
- package/node_modules/@local/studio-terminal-core/src/server/shellScript.js +10 -0
- package/node_modules/@local/studio-terminal-core/src/server/studioRuntimeIdentity.js +51 -0
- package/node_modules/@local/studio-terminal-core/src/server/studioTerminalCleanup.js +453 -0
- package/node_modules/@local/studio-terminal-core/src/server/studioTerminalLabels.js +3 -0
- package/node_modules/@local/studio-terminal-core/src/server/studioToolHome.js +106 -0
- package/node_modules/@local/studio-terminal-core/src/server/targetScriptTerminal.js +223 -0
- package/node_modules/@local/studio-terminal-core/src/server/terminalSessions.js +558 -0
- package/node_modules/@local/studio-terminal-core/src/shared/index.js +1 -0
- package/node_modules/@local/vibe64-accounts/package.descriptor.mjs +74 -0
- package/node_modules/@local/vibe64-accounts/package.json +17 -0
- package/node_modules/@local/vibe64-accounts/src/server/Vibe64AccountsProvider.js +53 -0
- package/node_modules/@local/vibe64-accounts/src/server/actions.js +114 -0
- package/node_modules/@local/vibe64-accounts/src/server/inputSchemas.js +56 -0
- package/node_modules/@local/vibe64-accounts/src/server/registerRoutes.js +76 -0
- package/node_modules/@local/vibe64-accounts/src/server/service.js +583 -0
- package/node_modules/@local/vibe64-adapters/README.md +9 -0
- package/node_modules/@local/vibe64-adapters/package.descriptor.mjs +50 -0
- package/node_modules/@local/vibe64-adapters/package.json +18 -0
- package/node_modules/@local/vibe64-adapters/src/index.js +1 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapter.js +351 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapterBlueprints.js +21 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapterHelpers/setupDatabaseConnections.js +82 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapterHelpers/setupEnvFiles.js +157 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapterHelpers/setupMariaDbChecks.js +324 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapterHelpers/setupNodePackages.js +156 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapterHelpers/setupNodeWebChecks.js +113 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapterHelpers/setupPackageImports.js +135 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapterHelpers/setupVerificationChecks.js +103 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapterToolchains.js +114 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/adapter.js +513 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/build-system/cmake.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/build-system/make.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/build-system/meson.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/project-kind/executable.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/project-kind/library.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/standard/cpp17.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/standard/cpp20.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/standard/cpp23.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/testing/enabled.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/blueprints/testing/none.txt +3 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/config.js +201 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/constants.js +15 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/currentApp.js +264 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/index.js +66 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/manifest.js +40 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/projectFiles.js +191 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/prompts/execute_plan.txt +10 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/prompts/generic.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/prompts/make_plan.txt +11 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/prompts/prepare_for_merge.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/prompts/run_deep_ui_check.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/prompts/run_deslop.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/prompts/update_project_knowledge.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/seedProject.js +297 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/setupDoctorPlugin.js +287 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/cpp/toolchainIdentity.js +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/adapter.js +440 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/currentApp.js +220 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/index.js +60 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/launchTargets.js +352 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/manifest.js +49 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prepareWorktree.sh +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/agent_conversation.txt +26 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/execute_plan.txt +28 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/execute_seed_plan.txt +10 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/generic.txt +20 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/make_plan.txt +27 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/make_seed_plan.txt +17 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/prepare_for_merge.txt +8 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/run_deep_ui_check.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/run_deslop.txt +24 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/prompts/update_project_knowledge.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/setupDatabasePolicy.js +186 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/setupDependencyChecks.js +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/setupDoctorPlugin.js +234 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/setupMariaDbRuntime.js +228 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/setupProjectChecks.js +262 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/setupScaffold.js +99 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/jskit/toolchainIdentity.js +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/adapter.js +443 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/authentication/laravel.txt +4 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/authentication/none.txt +4 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/authentication/workos.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/boost/boost.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/boost/none.txt +4 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/database-runtime/mariadb.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/database-runtime/mysql.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/database-runtime/postgres.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/database-runtime/sqlite.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/livewire-components/class.txt +4 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/livewire-components/single_file.txt +4 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/custom.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/livewire.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/none.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/react.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/svelte.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/vue.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/teams/none.txt +4 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/teams/teams.txt +4 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/testing/pest.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/blueprints/testing/phpunit.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/composerPackage.js +97 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/config.js +54 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/constants.js +7 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/currentApp.js +187 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/databaseRuntime.js +237 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/index.js +60 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/launchTargets.js +115 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/manifest.js +41 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prepareWorktree.sh +8 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prompts/execute_plan.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prompts/execute_seed_plan.txt +10 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prompts/generic.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prompts/make_plan.txt +11 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prompts/make_seed_plan.txt +17 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prompts/prepare_for_merge.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prompts/run_deep_ui_check.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prompts/run_deslop.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/prompts/update_project_knowledge.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/setupDoctorPlugin.js +648 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/laravel/toolchainIdentity.js +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/adapter.js +353 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/data-layer/drizzle.txt +16 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/data-layer/none.txt +7 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/data-layer/prisma.txt +16 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/database-runtime/mysql.txt +8 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/database-runtime/none.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/database-runtime/postgres.txt +8 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-bundler/turbopack.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-bundler/webpack.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-language/javascript.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-language/typescript.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-linter/biome.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-linter/eslint.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-linter/none.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-source-layout/root.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-source-layout/src.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-styling/none.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-styling/tailwind.txt +5 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/config.js +251 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/constants.js +23 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/currentApp.js +128 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/databaseRuntime.js +199 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/index.js +68 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/launchTargets.js +124 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/manifest.js +47 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/prepareWorktree.sh +8 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/prompts/execute_plan.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/prompts/generic.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/prompts/make_plan.txt +11 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/prompts/prepare_for_merge.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/prompts/run_deep_ui_check.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/prompts/run_deslop.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/prompts/update_project_knowledge.txt +9 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/nextjs/setupDoctorPlugin.js +405 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/adapter.js +350 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/config.js +89 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/constants.js +7 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/currentApp.js +132 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/index.js +60 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/launchTargets.js +149 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/manifest.js +40 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/prepareWorktree.sh +8 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/projectDetection.js +619 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/prompts/execute_plan.txt +14 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/prompts/generic.txt +17 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/prompts/make_plan.txt +17 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/prompts/prepare_for_merge.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/prompts/run_deep_ui_check.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/prompts/run_deslop.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/prompts/update_project_knowledge.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/node-web/setupDoctorPlugin.js +166 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/registry.js +206 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/adapter.js +362 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/constants.js +7 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/currentApp.js +132 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/index.js +64 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/launchTargets.js +175 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/manifest.js +40 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/packageManager.js +51 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/prepareWorktree.sh +8 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/prompts/execute_plan.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/prompts/generic.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/prompts/make_plan.txt +8 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/prompts/prepare_for_merge.txt +8 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/prompts/run_deep_ui_check.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/prompts/run_deslop.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/prompts/update_project_knowledge.txt +6 -0
- package/node_modules/@local/vibe64-adapters/src/server/adapters/vinext/setupDoctorPlugin.js +180 -0
- package/node_modules/@local/vibe64-adapters/src/server/applicationTypes.js +139 -0
- package/node_modules/@local/vibe64-adapters/src/server/codeIndexCommands.js +117 -0
- package/node_modules/@local/vibe64-adapters/src/server/codeIndexScripts/javascript.mjs +114 -0
- package/node_modules/@local/vibe64-adapters/src/server/codeIndexScripts/php.php +101 -0
- package/node_modules/@local/vibe64-adapters/src/server/configStore.js +532 -0
- package/node_modules/@local/vibe64-adapters/src/server/configValues.js +39 -0
- package/node_modules/@local/vibe64-adapters/src/server/currentAppInspection.js +199 -0
- package/node_modules/@local/vibe64-adapters/src/server/envFiles.js +30 -0
- package/node_modules/@local/vibe64-adapters/src/server/fakeAdapter.js +132 -0
- package/node_modules/@local/vibe64-adapters/src/server/index.js +24 -0
- package/node_modules/@local/vibe64-adapters/src/server/nodeCurrentApp.js +203 -0
- package/node_modules/@local/vibe64-adapters/src/server/nodePackage.js +184 -0
- package/node_modules/@local/vibe64-adapters/src/server/nodePackageDoctor.js +65 -0
- package/node_modules/@local/vibe64-adapters/src/server/nodePackageManagers.js +60 -0
- package/node_modules/@local/vibe64-adapters/src/server/nodeWebProject.js +236 -0
- package/node_modules/@local/vibe64-adapters/src/server/projectType.js +63 -0
- package/node_modules/@local/vibe64-adapters/src/server/promptMarkers.js +86 -0
- package/node_modules/@local/vibe64-adapters/src/server/promptQuestionPolicy.js +37 -0
- package/node_modules/@local/vibe64-adapters/src/server/promptRenderer.js +480 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/agent_conversation.txt +45 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/execute_plan.txt +28 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/generic.txt +33 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/make_plan.txt +22 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/prepare_for_merge.txt +32 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/resolve_pull_request.txt +28 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/run_deep_ui_check.txt +22 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/run_deslop.txt +25 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/update_project_knowledge.txt +22 -0
- package/node_modules/@local/vibe64-adapters/src/server/systemPrompts/write_report.txt +33 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowAdapter.js +463 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandFacts.js +90 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/commitPush.js +89 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/factMetadata.js +113 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/issuePr.js +171 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/mergeSync.js +112 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/shellHelpers.js +203 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal/worktreeDependencies.js +313 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowCommandTerminal.js +63 -0
- package/node_modules/@local/vibe64-adapters/src/server/workflowSessionActions.js +211 -0
- package/node_modules/@local/vibe64-adapters/src/shared/index.js +1 -0
- package/node_modules/@local/vibe64-artifacts/package.descriptor.mjs +73 -0
- package/node_modules/@local/vibe64-artifacts/package.json +15 -0
- package/node_modules/@local/vibe64-artifacts/src/server/Vibe64ArtifactsProvider.js +61 -0
- package/node_modules/@local/vibe64-artifacts/src/server/actions.js +83 -0
- package/node_modules/@local/vibe64-artifacts/src/server/inputSchemas.js +113 -0
- package/node_modules/@local/vibe64-artifacts/src/server/registerRoutes.js +148 -0
- package/node_modules/@local/vibe64-artifacts/src/server/service.js +182 -0
- package/node_modules/@local/vibe64-core/README.md +10 -0
- package/node_modules/@local/vibe64-core/package.descriptor.mjs +60 -0
- package/node_modules/@local/vibe64-core/package.json +24 -0
- package/node_modules/@local/vibe64-core/src/index.js +1 -0
- package/node_modules/@local/vibe64-core/src/server/core.js +54 -0
- package/node_modules/@local/vibe64-core/src/server/deepFreeze.js +17 -0
- package/node_modules/@local/vibe64-core/src/server/doctorCheckItems.js +129 -0
- package/node_modules/@local/vibe64-core/src/server/featureRoutes.js +145 -0
- package/node_modules/@local/vibe64-core/src/server/index.js +10 -0
- package/node_modules/@local/vibe64-core/src/server/localStudioRequest.js +73 -0
- package/node_modules/@local/vibe64-core/src/server/localhostCheckBypass.js +29 -0
- package/node_modules/@local/vibe64-core/src/server/serverResponses.js +76 -0
- package/node_modules/@local/vibe64-core/src/server/sessionRealtimeEvents.js +137 -0
- package/node_modules/@local/vibe64-core/src/server/studioRoots.js +51 -0
- package/node_modules/@local/vibe64-core/src/server/terminalWebSocketRoutes.js +158 -0
- package/node_modules/@local/vibe64-core/src/shared/index.js +33 -0
- package/node_modules/@local/vibe64-project/package.descriptor.mjs +73 -0
- package/node_modules/@local/vibe64-project/package.json +16 -0
- package/node_modules/@local/vibe64-project/src/server/Vibe64ProjectProvider.js +53 -0
- package/node_modules/@local/vibe64-project/src/server/actions.js +117 -0
- package/node_modules/@local/vibe64-project/src/server/inputSchemas.js +41 -0
- package/node_modules/@local/vibe64-project/src/server/registerRoutes.js +58 -0
- package/node_modules/@local/vibe64-project/src/server/service.js +290 -0
- package/node_modules/@local/vibe64-runtime/README.md +9 -0
- package/node_modules/@local/vibe64-runtime/package.descriptor.mjs +52 -0
- package/node_modules/@local/vibe64-runtime/package.json +19 -0
- package/node_modules/@local/vibe64-runtime/src/index.js +1 -0
- package/node_modules/@local/vibe64-runtime/src/server/currentStepInputHelperServer.js +308 -0
- package/node_modules/@local/vibe64-runtime/src/server/index.js +18 -0
- package/node_modules/@local/vibe64-runtime/src/server/registerCoreWorkflowModules.js +52 -0
- package/node_modules/@local/vibe64-runtime/src/server/runtime.js +1231 -0
- package/node_modules/@local/vibe64-runtime/src/server/sessionDebugLog.js +7 -0
- package/node_modules/@local/vibe64-runtime/src/server/sessionDebugLogCore.js +57 -0
- package/node_modules/@local/vibe64-runtime/src/server/sessionStore.js +1468 -0
- package/node_modules/@local/vibe64-runtime/src/server/setupReadiness.js +112 -0
- package/node_modules/@local/vibe64-runtime/src/server/terminalFailureFixRequest.js +143 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflow.js +96 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowArtifacts.js +17 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowConditions.js +101 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowDefinitionBuilders.js +91 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowMachine.js +919 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowModules/coreCoding.js +1248 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowModules/coreLifecycle.js +1340 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowModules/coreMaintenance.js +209 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowPresentation.js +1281 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowRegistry.js +628 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowStepFactories.js +22 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowStepMachineHelpers.js +939 -0
- package/node_modules/@local/vibe64-runtime/src/server/workflowStepMachines.js +156 -0
- package/node_modules/@local/vibe64-runtime/src/shared/index.js +1 -0
- package/node_modules/@local/vibe64-sessions/package.descriptor.mjs +84 -0
- package/node_modules/@local/vibe64-sessions/package.json +21 -0
- package/node_modules/@local/vibe64-sessions/src/server/Vibe64SessionsProvider.js +78 -0
- package/node_modules/@local/vibe64-sessions/src/server/actions.js +272 -0
- package/node_modules/@local/vibe64-sessions/src/server/inputSchemas.js +204 -0
- package/node_modules/@local/vibe64-sessions/src/server/registerRoutes.js +141 -0
- package/node_modules/@local/vibe64-sessions/src/server/service.js +853 -0
- package/node_modules/@local/vibe64-sessions/src/server/sessionDiff.js +90 -0
- package/node_modules/@local/vibe64-terminals/package.descriptor.mjs +77 -0
- package/node_modules/@local/vibe64-terminals/package.json +19 -0
- package/node_modules/@local/vibe64-terminals/src/server/Vibe64TerminalsProvider.js +100 -0
- package/node_modules/@local/vibe64-terminals/src/server/actions.js +124 -0
- package/node_modules/@local/vibe64-terminals/src/server/codexAttachments.js +147 -0
- package/node_modules/@local/vibe64-terminals/src/server/codexTerminal.js +1120 -0
- package/node_modules/@local/vibe64-terminals/src/server/commandTerminal.js +975 -0
- package/node_modules/@local/vibe64-terminals/src/server/commandTerminalResults.js +87 -0
- package/node_modules/@local/vibe64-terminals/src/server/inputSchemas.js +135 -0
- package/node_modules/@local/vibe64-terminals/src/server/launchTargetTerminal.js +470 -0
- package/node_modules/@local/vibe64-terminals/src/server/registerRoutes.js +241 -0
- package/node_modules/@local/vibe64-terminals/src/server/service.js +190 -0
- package/node_modules/@local/vibe64-terminals/src/server/shellTerminal.js +390 -0
- package/node_modules/@local/vibe64-terminals/src/server/targetToolchainTerminal.js +97 -0
- package/node_modules/@local/vibe64-terminals/src/server/terminalEnvironment.js +102 -0
- package/node_modules/@local/vibe64-terminals/src/server/terminalRuntimeContainers.js +80 -0
- package/node_modules/@local/vibe64-terminals/src/server/terminalShared.js +112 -0
- package/node_modules/@local/vibe64-terminals/src/server/terminalToolchainImage.js +77 -0
- package/node_modules/@sec-ant/readable-stream/LICENSE +21 -0
- package/node_modules/@sec-ant/readable-stream/README.md +230 -0
- package/node_modules/@sec-ant/readable-stream/dist/core/asyncIterablePrototype.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/core/asyncIterator.d.ts +27 -0
- package/node_modules/@sec-ant/readable-stream/dist/core/fromAnyIterable.d.ts +6 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/asyncIterator.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/asyncIterator.js +5 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/fromAnyIterable.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/fromAnyIterable.js +5 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/index.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/index/index.js +8 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/asyncIterator.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/asyncIterator.js +3 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/fromAnyIterable.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/fromAnyIterable.js +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/index.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/polyfill/index.js +4 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/asyncIterator.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/asyncIterator.js +89 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/fromAnyIterable.d.ts +1 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/fromAnyIterable.js +34 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/index.d.ts +2 -0
- package/node_modules/@sec-ant/readable-stream/dist/ponyfill/index.js +6 -0
- package/node_modules/@sec-ant/readable-stream/dist/types/async-iterator.d.ts +11 -0
- package/node_modules/@sec-ant/readable-stream/package.json +96 -0
- package/node_modules/@sindresorhus/merge-streams/index.d.ts +44 -0
- package/node_modules/@sindresorhus/merge-streams/index.js +265 -0
- package/node_modules/@sindresorhus/merge-streams/license +9 -0
- package/node_modules/@sindresorhus/merge-streams/package.json +49 -0
- package/node_modules/@sindresorhus/merge-streams/readme.md +53 -0
- package/node_modules/ansi-regex/index.d.ts +33 -0
- package/node_modules/ansi-regex/index.js +14 -0
- package/node_modules/ansi-regex/license +9 -0
- package/node_modules/ansi-regex/package.json +61 -0
- package/node_modules/ansi-regex/readme.md +66 -0
- package/node_modules/cross-spawn/LICENSE +21 -0
- package/node_modules/cross-spawn/README.md +89 -0
- package/node_modules/cross-spawn/index.js +39 -0
- package/node_modules/cross-spawn/lib/enoent.js +59 -0
- package/node_modules/cross-spawn/lib/parse.js +91 -0
- package/node_modules/cross-spawn/lib/util/escape.js +47 -0
- package/node_modules/cross-spawn/lib/util/readShebang.js +23 -0
- package/node_modules/cross-spawn/lib/util/resolveCommand.js +52 -0
- package/node_modules/cross-spawn/package.json +73 -0
- package/node_modules/execa/index.d.ts +27 -0
- package/node_modules/execa/index.js +28 -0
- package/node_modules/execa/lib/arguments/command.js +20 -0
- package/node_modules/execa/lib/arguments/cwd.js +39 -0
- package/node_modules/execa/lib/arguments/encoding-option.js +50 -0
- package/node_modules/execa/lib/arguments/escape.js +88 -0
- package/node_modules/execa/lib/arguments/fd-options.js +108 -0
- package/node_modules/execa/lib/arguments/file-url.js +25 -0
- package/node_modules/execa/lib/arguments/options.js +96 -0
- package/node_modules/execa/lib/arguments/shell.js +11 -0
- package/node_modules/execa/lib/arguments/specific.js +111 -0
- package/node_modules/execa/lib/convert/add.js +15 -0
- package/node_modules/execa/lib/convert/concurrent.js +33 -0
- package/node_modules/execa/lib/convert/duplex.js +69 -0
- package/node_modules/execa/lib/convert/iterable.js +34 -0
- package/node_modules/execa/lib/convert/readable.js +113 -0
- package/node_modules/execa/lib/convert/shared.js +46 -0
- package/node_modules/execa/lib/convert/writable.js +90 -0
- package/node_modules/execa/lib/io/contents.js +116 -0
- package/node_modules/execa/lib/io/input-sync.js +44 -0
- package/node_modules/execa/lib/io/iterate.js +110 -0
- package/node_modules/execa/lib/io/max-buffer.js +89 -0
- package/node_modules/execa/lib/io/output-async.js +80 -0
- package/node_modules/execa/lib/io/output-sync.js +135 -0
- package/node_modules/execa/lib/io/pipeline.js +48 -0
- package/node_modules/execa/lib/io/strip-newline.js +12 -0
- package/node_modules/execa/lib/ipc/array.js +4 -0
- package/node_modules/execa/lib/ipc/buffer-messages.js +47 -0
- package/node_modules/execa/lib/ipc/forward.js +56 -0
- package/node_modules/execa/lib/ipc/get-each.js +89 -0
- package/node_modules/execa/lib/ipc/get-one.js +69 -0
- package/node_modules/execa/lib/ipc/graceful.js +72 -0
- package/node_modules/execa/lib/ipc/incoming.js +79 -0
- package/node_modules/execa/lib/ipc/ipc-input.js +44 -0
- package/node_modules/execa/lib/ipc/methods.js +49 -0
- package/node_modules/execa/lib/ipc/outgoing.js +47 -0
- package/node_modules/execa/lib/ipc/reference.js +44 -0
- package/node_modules/execa/lib/ipc/send.js +91 -0
- package/node_modules/execa/lib/ipc/strict.js +113 -0
- package/node_modules/execa/lib/ipc/validation.js +111 -0
- package/node_modules/execa/lib/methods/bind.js +23 -0
- package/node_modules/execa/lib/methods/command.js +43 -0
- package/node_modules/execa/lib/methods/create.js +65 -0
- package/node_modules/execa/lib/methods/main-async.js +194 -0
- package/node_modules/execa/lib/methods/main-sync.js +163 -0
- package/node_modules/execa/lib/methods/node.js +51 -0
- package/node_modules/execa/lib/methods/parameters.js +31 -0
- package/node_modules/execa/lib/methods/promise.js +15 -0
- package/node_modules/execa/lib/methods/script.js +22 -0
- package/node_modules/execa/lib/methods/template.js +153 -0
- package/node_modules/execa/lib/pipe/abort.js +20 -0
- package/node_modules/execa/lib/pipe/pipe-arguments.js +91 -0
- package/node_modules/execa/lib/pipe/sequence.js +24 -0
- package/node_modules/execa/lib/pipe/setup.js +72 -0
- package/node_modules/execa/lib/pipe/streaming.js +51 -0
- package/node_modules/execa/lib/pipe/throw.js +58 -0
- package/node_modules/execa/lib/resolve/all-async.js +46 -0
- package/node_modules/execa/lib/resolve/all-sync.js +33 -0
- package/node_modules/execa/lib/resolve/exit-async.js +54 -0
- package/node_modules/execa/lib/resolve/exit-sync.js +25 -0
- package/node_modules/execa/lib/resolve/stdio.js +47 -0
- package/node_modules/execa/lib/resolve/wait-stream.js +96 -0
- package/node_modules/execa/lib/resolve/wait-subprocess.js +146 -0
- package/node_modules/execa/lib/return/duration.js +8 -0
- package/node_modules/execa/lib/return/early-error.js +60 -0
- package/node_modules/execa/lib/return/final-error.js +40 -0
- package/node_modules/execa/lib/return/message.js +157 -0
- package/node_modules/execa/lib/return/reject.js +13 -0
- package/node_modules/execa/lib/return/result.js +186 -0
- package/node_modules/execa/lib/stdio/direction.js +76 -0
- package/node_modules/execa/lib/stdio/duplicate.js +116 -0
- package/node_modules/execa/lib/stdio/handle-async.js +52 -0
- package/node_modules/execa/lib/stdio/handle-sync.js +57 -0
- package/node_modules/execa/lib/stdio/handle.js +214 -0
- package/node_modules/execa/lib/stdio/input-option.js +50 -0
- package/node_modules/execa/lib/stdio/native.js +106 -0
- package/node_modules/execa/lib/stdio/stdio-option.js +60 -0
- package/node_modules/execa/lib/stdio/type.js +173 -0
- package/node_modules/execa/lib/terminate/cancel.js +20 -0
- package/node_modules/execa/lib/terminate/cleanup.js +16 -0
- package/node_modules/execa/lib/terminate/graceful.js +71 -0
- package/node_modules/execa/lib/terminate/kill.js +93 -0
- package/node_modules/execa/lib/terminate/signal.js +70 -0
- package/node_modules/execa/lib/terminate/timeout.js +21 -0
- package/node_modules/execa/lib/transform/encoding-transform.js +51 -0
- package/node_modules/execa/lib/transform/generator.js +107 -0
- package/node_modules/execa/lib/transform/normalize.js +111 -0
- package/node_modules/execa/lib/transform/object-mode.js +41 -0
- package/node_modules/execa/lib/transform/run-async.js +60 -0
- package/node_modules/execa/lib/transform/run-sync.js +50 -0
- package/node_modules/execa/lib/transform/split.js +110 -0
- package/node_modules/execa/lib/transform/validate.js +43 -0
- package/node_modules/execa/lib/utils/abort-signal.js +8 -0
- package/node_modules/execa/lib/utils/deferred.js +7 -0
- package/node_modules/execa/lib/utils/max-listeners.js +14 -0
- package/node_modules/execa/lib/utils/standard-stream.js +6 -0
- package/node_modules/execa/lib/utils/uint-array.js +69 -0
- package/node_modules/execa/lib/verbose/complete.js +24 -0
- package/node_modules/execa/lib/verbose/custom.js +26 -0
- package/node_modules/execa/lib/verbose/default.js +54 -0
- package/node_modules/execa/lib/verbose/error.js +13 -0
- package/node_modules/execa/lib/verbose/info.js +39 -0
- package/node_modules/execa/lib/verbose/ipc.js +15 -0
- package/node_modules/execa/lib/verbose/log.js +54 -0
- package/node_modules/execa/lib/verbose/output.js +60 -0
- package/node_modules/execa/lib/verbose/start.js +15 -0
- package/node_modules/execa/lib/verbose/values.js +33 -0
- package/node_modules/execa/license +9 -0
- package/node_modules/execa/package.json +105 -0
- package/node_modules/execa/readme.md +461 -0
- package/node_modules/execa/types/arguments/encoding-option.d.ts +19 -0
- package/node_modules/execa/types/arguments/fd-options.d.ts +8 -0
- package/node_modules/execa/types/arguments/options.d.ts +400 -0
- package/node_modules/execa/types/arguments/specific.d.ts +52 -0
- package/node_modules/execa/types/convert.d.ts +58 -0
- package/node_modules/execa/types/ipc.d.ts +156 -0
- package/node_modules/execa/types/methods/command.d.ts +114 -0
- package/node_modules/execa/types/methods/main-async.d.ts +379 -0
- package/node_modules/execa/types/methods/main-sync.d.ts +59 -0
- package/node_modules/execa/types/methods/node.d.ts +62 -0
- package/node_modules/execa/types/methods/script.d.ts +115 -0
- package/node_modules/execa/types/methods/template.d.ts +18 -0
- package/node_modules/execa/types/pipe.d.ts +58 -0
- package/node_modules/execa/types/return/final-error.d.ts +51 -0
- package/node_modules/execa/types/return/ignore.d.ts +26 -0
- package/node_modules/execa/types/return/result-all.d.ts +30 -0
- package/node_modules/execa/types/return/result-ipc.d.ts +27 -0
- package/node_modules/execa/types/return/result-stdio.d.ts +17 -0
- package/node_modules/execa/types/return/result-stdout.d.ts +50 -0
- package/node_modules/execa/types/return/result.d.ts +203 -0
- package/node_modules/execa/types/stdio/array.d.ts +16 -0
- package/node_modules/execa/types/stdio/direction.d.ts +12 -0
- package/node_modules/execa/types/stdio/option.d.ts +40 -0
- package/node_modules/execa/types/stdio/type.d.ts +170 -0
- package/node_modules/execa/types/subprocess/all.d.ts +17 -0
- package/node_modules/execa/types/subprocess/stdio.d.ts +18 -0
- package/node_modules/execa/types/subprocess/stdout.d.ts +22 -0
- package/node_modules/execa/types/subprocess/subprocess.d.ts +117 -0
- package/node_modules/execa/types/transform/normalize.d.ts +57 -0
- package/node_modules/execa/types/transform/object-mode.d.ts +21 -0
- package/node_modules/execa/types/utils.d.ts +13 -0
- package/node_modules/execa/types/verbose.d.ts +98 -0
- package/node_modules/figures/index.d.ts +279 -0
- package/node_modules/figures/index.js +292 -0
- package/node_modules/figures/license +9 -0
- package/node_modules/figures/package.json +49 -0
- package/node_modules/figures/readme.md +337 -0
- package/node_modules/flatted/LICENSE +15 -0
- package/node_modules/flatted/README.md +111 -0
- package/node_modules/flatted/cjs/index.js +132 -0
- package/node_modules/flatted/cjs/package.json +1 -0
- package/node_modules/flatted/es.js +1 -0
- package/node_modules/flatted/esm/index.js +127 -0
- package/node_modules/flatted/esm.js +1 -0
- package/node_modules/flatted/golang/README.md +60 -0
- package/node_modules/flatted/golang/pkg/flatted/flatted.go +277 -0
- package/node_modules/flatted/index.js +155 -0
- package/node_modules/flatted/min.js +1 -0
- package/node_modules/flatted/package.json +80 -0
- package/node_modules/flatted/php/flatted.php +156 -0
- package/node_modules/flatted/python/flatted.py +144 -0
- package/node_modules/flatted/types/index.d.ts +4 -0
- package/node_modules/get-stream/license +9 -0
- package/node_modules/get-stream/package.json +60 -0
- package/node_modules/get-stream/readme.md +303 -0
- package/node_modules/get-stream/source/array-buffer.js +84 -0
- package/node_modules/get-stream/source/array.js +32 -0
- package/node_modules/get-stream/source/buffer.js +19 -0
- package/node_modules/get-stream/source/contents.js +121 -0
- package/node_modules/get-stream/source/exports.js +5 -0
- package/node_modules/get-stream/source/index.d.ts +121 -0
- package/node_modules/get-stream/source/index.js +13 -0
- package/node_modules/get-stream/source/stream.js +65 -0
- package/node_modules/get-stream/source/string.js +41 -0
- package/node_modules/get-stream/source/utils.js +11 -0
- package/node_modules/human-signals/LICENSE +201 -0
- package/node_modules/human-signals/README.md +171 -0
- package/node_modules/human-signals/build/src/core.js +273 -0
- package/node_modules/human-signals/build/src/main.d.ts +206 -0
- package/node_modules/human-signals/build/src/main.js +70 -0
- package/node_modules/human-signals/build/src/realtime.js +16 -0
- package/node_modules/human-signals/build/src/signals.js +34 -0
- package/node_modules/human-signals/package.json +66 -0
- package/node_modules/is-plain-obj/index.d.ts +35 -0
- package/node_modules/is-plain-obj/index.js +8 -0
- package/node_modules/is-plain-obj/license +9 -0
- package/node_modules/is-plain-obj/package.json +41 -0
- package/node_modules/is-plain-obj/readme.md +58 -0
- package/node_modules/is-stream/index.d.ts +90 -0
- package/node_modules/is-stream/index.js +37 -0
- package/node_modules/is-stream/license +9 -0
- package/node_modules/is-stream/package.json +48 -0
- package/node_modules/is-stream/readme.md +57 -0
- package/node_modules/is-unicode-supported/index.d.ts +12 -0
- package/node_modules/is-unicode-supported/index.js +21 -0
- package/node_modules/is-unicode-supported/license +9 -0
- package/node_modules/is-unicode-supported/package.json +47 -0
- package/node_modules/is-unicode-supported/readme.md +35 -0
- package/node_modules/isexe/.npmignore +2 -0
- package/node_modules/isexe/LICENSE +15 -0
- package/node_modules/isexe/README.md +51 -0
- package/node_modules/isexe/index.js +57 -0
- package/node_modules/isexe/mode.js +41 -0
- package/node_modules/isexe/package.json +31 -0
- package/node_modules/isexe/test/basic.js +221 -0
- package/node_modules/isexe/windows.js +42 -0
- package/node_modules/json-rest-schema/LICENSE +706 -0
- package/node_modules/json-rest-schema/ONBOARDING.md +304 -0
- package/node_modules/json-rest-schema/README.md +2582 -0
- package/node_modules/json-rest-schema/package.json +70 -0
- package/node_modules/json-rest-schema/src/adapters/react-hook-form.js +240 -0
- package/node_modules/json-rest-schema/src/adapters/vee-validate.js +80 -0
- package/node_modules/json-rest-schema/src/adapters/vue.js +345 -0
- package/node_modules/json-rest-schema/src/adapters/vuetify.js +79 -0
- package/node_modules/json-rest-schema/src/core/CorePlugin.js +452 -0
- package/node_modules/json-rest-schema/src/core/Schema.js +1398 -0
- package/node_modules/json-rest-schema/src/core/definition-helpers.js +7 -0
- package/node_modules/json-rest-schema/src/core/nested-contract.js +86 -0
- package/node_modules/json-rest-schema/src/core/transport-schema.js +611 -0
- package/node_modules/json-rest-schema/src/index.js +218 -0
- package/node_modules/json-rest-schema/src/utils/adapter-helpers.js +117 -0
- package/node_modules/json-rest-schema/src/utils/error-helpers.js +119 -0
- package/node_modules/json-rest-schema/src/utils/object-helpers.js +23 -0
- package/node_modules/json-rest-schema/src/utils/path-helpers.js +118 -0
- package/node_modules/node-addon-api/LICENSE.md +9 -0
- package/node_modules/node-addon-api/README.md +319 -0
- package/node_modules/node-addon-api/common.gypi +20 -0
- package/node_modules/node-addon-api/except.gypi +25 -0
- package/node_modules/node-addon-api/index.js +12 -0
- package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
- package/node_modules/node-addon-api/napi-inl.h +6607 -0
- package/node_modules/node-addon-api/napi.h +3201 -0
- package/node_modules/node-addon-api/node_addon_api.gyp +32 -0
- package/node_modules/node-addon-api/node_api.gyp +9 -0
- package/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/node_modules/node-addon-api/nothing.c +0 -0
- package/node_modules/node-addon-api/package-support.json +21 -0
- package/node_modules/node-addon-api/package.json +480 -0
- package/node_modules/node-addon-api/tools/README.md +73 -0
- package/node_modules/node-addon-api/tools/check-napi.js +99 -0
- package/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/node_modules/node-addon-api/tools/conversion.js +301 -0
- package/node_modules/node-addon-api/tools/eslint-format.js +79 -0
- package/node_modules/node-pty/LICENSE +69 -0
- package/node_modules/node-pty/README.md +165 -0
- package/node_modules/node-pty/binding.gyp +111 -0
- package/node_modules/node-pty/deps/.editorconfig +2 -0
- package/node_modules/node-pty/deps/winpty/.drone.yml +17 -0
- package/node_modules/node-pty/deps/winpty/.gitattributes +19 -0
- package/node_modules/node-pty/deps/winpty/LICENSE +21 -0
- package/node_modules/node-pty/deps/winpty/Makefile +166 -0
- package/node_modules/node-pty/deps/winpty/README.md +151 -0
- package/node_modules/node-pty/deps/winpty/RELEASES.md +280 -0
- package/node_modules/node-pty/deps/winpty/VERSION.txt +1 -0
- package/node_modules/node-pty/deps/winpty/configure +167 -0
- package/node_modules/node-pty/deps/winpty/misc/BufferResizeTests.cc +90 -0
- package/node_modules/node-pty/deps/winpty/misc/ChangeScreenBuffer.cc +53 -0
- package/node_modules/node-pty/deps/winpty/misc/ClearConsole.cc +72 -0
- package/node_modules/node-pty/deps/winpty/misc/ConinMode.cc +117 -0
- package/node_modules/node-pty/deps/winpty/misc/ConinMode.ps1 +116 -0
- package/node_modules/node-pty/deps/winpty/misc/ConoutMode.cc +113 -0
- package/node_modules/node-pty/deps/winpty/misc/DebugClient.py +42 -0
- package/node_modules/node-pty/deps/winpty/misc/DebugServer.py +63 -0
- package/node_modules/node-pty/deps/winpty/misc/DumpLines.py +5 -0
- package/node_modules/node-pty/deps/winpty/misc/EnableExtendedFlags.txt +46 -0
- package/node_modules/node-pty/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +528 -0
- package/node_modules/node-pty/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +633 -0
- package/node_modules/node-pty/deps/winpty/misc/Font-Report-June2016/CP932.txt +630 -0
- package/node_modules/node-pty/deps/winpty/misc/Font-Report-June2016/CP936.txt +630 -0
- package/node_modules/node-pty/deps/winpty/misc/Font-Report-June2016/CP949.txt +630 -0
- package/node_modules/node-pty/deps/winpty/misc/Font-Report-June2016/CP950.txt +630 -0
- package/node_modules/node-pty/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +16 -0
- package/node_modules/node-pty/deps/winpty/misc/Font-Report-June2016/Results.txt +4 -0
- package/node_modules/node-pty/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +144 -0
- package/node_modules/node-pty/deps/winpty/misc/FontSurvey.cc +100 -0
- package/node_modules/node-pty/deps/winpty/misc/FormatChar.h +21 -0
- package/node_modules/node-pty/deps/winpty/misc/FreezePerfTest.cc +62 -0
- package/node_modules/node-pty/deps/winpty/misc/GetCh.cc +20 -0
- package/node_modules/node-pty/deps/winpty/misc/GetConsolePos.cc +41 -0
- package/node_modules/node-pty/deps/winpty/misc/GetFont.cc +261 -0
- package/node_modules/node-pty/deps/winpty/misc/IdentifyConsoleWindow.ps1 +51 -0
- package/node_modules/node-pty/deps/winpty/misc/IsNewConsole.cc +87 -0
- package/node_modules/node-pty/deps/winpty/misc/MouseInputNotes.txt +90 -0
- package/node_modules/node-pty/deps/winpty/misc/MoveConsoleWindow.cc +34 -0
- package/node_modules/node-pty/deps/winpty/misc/Notes.txt +219 -0
- package/node_modules/node-pty/deps/winpty/misc/OSVersion.cc +27 -0
- package/node_modules/node-pty/deps/winpty/misc/ScreenBufferFreezeInactive.cc +101 -0
- package/node_modules/node-pty/deps/winpty/misc/ScreenBufferTest.cc +671 -0
- package/node_modules/node-pty/deps/winpty/misc/ScreenBufferTest2.cc +151 -0
- package/node_modules/node-pty/deps/winpty/misc/SelectAllTest.cc +45 -0
- package/node_modules/node-pty/deps/winpty/misc/SetBufferSize.cc +32 -0
- package/node_modules/node-pty/deps/winpty/misc/SetCursorPos.cc +10 -0
- package/node_modules/node-pty/deps/winpty/misc/SetFont.cc +145 -0
- package/node_modules/node-pty/deps/winpty/misc/SetWindowRect.cc +36 -0
- package/node_modules/node-pty/deps/winpty/misc/ShowArgv.cc +12 -0
- package/node_modules/node-pty/deps/winpty/misc/ShowConsoleInput.cc +40 -0
- package/node_modules/node-pty/deps/winpty/misc/Spew.py +5 -0
- package/node_modules/node-pty/deps/winpty/misc/TestUtil.cc +172 -0
- package/node_modules/node-pty/deps/winpty/misc/UnicodeDoubleWidthTest.cc +102 -0
- package/node_modules/node-pty/deps/winpty/misc/UnicodeWideTest1.cc +246 -0
- package/node_modules/node-pty/deps/winpty/misc/UnicodeWideTest2.cc +130 -0
- package/node_modules/node-pty/deps/winpty/misc/UnixEcho.cc +89 -0
- package/node_modules/node-pty/deps/winpty/misc/Utf16Echo.cc +46 -0
- package/node_modules/node-pty/deps/winpty/misc/VeryLargeRead.cc +122 -0
- package/node_modules/node-pty/deps/winpty/misc/VkEscapeTest.cc +56 -0
- package/node_modules/node-pty/deps/winpty/misc/Win10ResizeWhileFrozen.cc +52 -0
- package/node_modules/node-pty/deps/winpty/misc/Win10WrapTest1.cc +57 -0
- package/node_modules/node-pty/deps/winpty/misc/Win10WrapTest2.cc +30 -0
- package/node_modules/node-pty/deps/winpty/misc/Win32Echo1.cc +26 -0
- package/node_modules/node-pty/deps/winpty/misc/Win32Echo2.cc +19 -0
- package/node_modules/node-pty/deps/winpty/misc/Win32Test1.cc +46 -0
- package/node_modules/node-pty/deps/winpty/misc/Win32Test2.cc +70 -0
- package/node_modules/node-pty/deps/winpty/misc/Win32Test3.cc +78 -0
- package/node_modules/node-pty/deps/winpty/misc/Win32Write1.cc +44 -0
- package/node_modules/node-pty/deps/winpty/misc/WindowsBugCrashReader.cc +27 -0
- package/node_modules/node-pty/deps/winpty/misc/WriteConsole.cc +106 -0
- package/node_modules/node-pty/deps/winpty/misc/build32.sh +9 -0
- package/node_modules/node-pty/deps/winpty/misc/build64.sh +9 -0
- package/node_modules/node-pty/deps/winpty/misc/color-test.sh +212 -0
- package/node_modules/node-pty/deps/winpty/misc/font-notes.txt +300 -0
- package/node_modules/node-pty/deps/winpty/misc/winbug-15048.cc +201 -0
- package/node_modules/node-pty/deps/winpty/ship/build-pty4j-libpty.bat +36 -0
- package/node_modules/node-pty/deps/winpty/ship/common_ship.py +53 -0
- package/node_modules/node-pty/deps/winpty/ship/make_msvc_package.py +165 -0
- package/node_modules/node-pty/deps/winpty/ship/ship.py +108 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Agent.cc +613 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Agent.h +103 -0
- package/node_modules/node-pty/deps/winpty/src/agent/AgentCreateDesktop.cc +84 -0
- package/node_modules/node-pty/deps/winpty/src/agent/AgentCreateDesktop.h +28 -0
- package/node_modules/node-pty/deps/winpty/src/agent/ConsoleFont.cc +632 -0
- package/node_modules/node-pty/deps/winpty/src/agent/ConsoleFont.h +28 -0
- package/node_modules/node-pty/deps/winpty/src/agent/ConsoleInput.cc +852 -0
- package/node_modules/node-pty/deps/winpty/src/agent/ConsoleInput.h +109 -0
- package/node_modules/node-pty/deps/winpty/src/agent/ConsoleInputReencoding.cc +121 -0
- package/node_modules/node-pty/deps/winpty/src/agent/ConsoleInputReencoding.h +36 -0
- package/node_modules/node-pty/deps/winpty/src/agent/ConsoleLine.cc +152 -0
- package/node_modules/node-pty/deps/winpty/src/agent/ConsoleLine.h +41 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Coord.h +87 -0
- package/node_modules/node-pty/deps/winpty/src/agent/DebugShowInput.cc +239 -0
- package/node_modules/node-pty/deps/winpty/src/agent/DebugShowInput.h +32 -0
- package/node_modules/node-pty/deps/winpty/src/agent/DefaultInputMap.cc +422 -0
- package/node_modules/node-pty/deps/winpty/src/agent/DefaultInputMap.h +28 -0
- package/node_modules/node-pty/deps/winpty/src/agent/DsrSender.h +30 -0
- package/node_modules/node-pty/deps/winpty/src/agent/EventLoop.cc +99 -0
- package/node_modules/node-pty/deps/winpty/src/agent/EventLoop.h +47 -0
- package/node_modules/node-pty/deps/winpty/src/agent/InputMap.cc +246 -0
- package/node_modules/node-pty/deps/winpty/src/agent/InputMap.h +114 -0
- package/node_modules/node-pty/deps/winpty/src/agent/LargeConsoleRead.cc +71 -0
- package/node_modules/node-pty/deps/winpty/src/agent/LargeConsoleRead.h +68 -0
- package/node_modules/node-pty/deps/winpty/src/agent/NamedPipe.cc +378 -0
- package/node_modules/node-pty/deps/winpty/src/agent/NamedPipe.h +125 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Scraper.cc +699 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Scraper.h +103 -0
- package/node_modules/node-pty/deps/winpty/src/agent/SimplePool.h +75 -0
- package/node_modules/node-pty/deps/winpty/src/agent/SmallRect.h +143 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Terminal.cc +535 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Terminal.h +69 -0
- package/node_modules/node-pty/deps/winpty/src/agent/UnicodeEncoding.h +157 -0
- package/node_modules/node-pty/deps/winpty/src/agent/UnicodeEncodingTest.cc +189 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Win32Console.cc +107 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Win32Console.h +67 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Win32ConsoleBuffer.cc +193 -0
- package/node_modules/node-pty/deps/winpty/src/agent/Win32ConsoleBuffer.h +99 -0
- package/node_modules/node-pty/deps/winpty/src/agent/main.cc +114 -0
- package/node_modules/node-pty/deps/winpty/src/agent/subdir.mk +61 -0
- package/node_modules/node-pty/deps/winpty/src/configurations.gypi +60 -0
- package/node_modules/node-pty/deps/winpty/src/debugserver/DebugServer.cc +117 -0
- package/node_modules/node-pty/deps/winpty/src/debugserver/subdir.mk +41 -0
- package/node_modules/node-pty/deps/winpty/src/include/winpty.h +242 -0
- package/node_modules/node-pty/deps/winpty/src/include/winpty_constants.h +131 -0
- package/node_modules/node-pty/deps/winpty/src/libwinpty/AgentLocation.cc +75 -0
- package/node_modules/node-pty/deps/winpty/src/libwinpty/AgentLocation.h +28 -0
- package/node_modules/node-pty/deps/winpty/src/libwinpty/LibWinptyException.h +54 -0
- package/node_modules/node-pty/deps/winpty/src/libwinpty/WinptyInternal.h +72 -0
- package/node_modules/node-pty/deps/winpty/src/libwinpty/subdir.mk +46 -0
- package/node_modules/node-pty/deps/winpty/src/libwinpty/winpty.cc +970 -0
- package/node_modules/node-pty/deps/winpty/src/shared/AgentMsg.h +38 -0
- package/node_modules/node-pty/deps/winpty/src/shared/BackgroundDesktop.cc +122 -0
- package/node_modules/node-pty/deps/winpty/src/shared/BackgroundDesktop.h +73 -0
- package/node_modules/node-pty/deps/winpty/src/shared/Buffer.cc +103 -0
- package/node_modules/node-pty/deps/winpty/src/shared/Buffer.h +102 -0
- package/node_modules/node-pty/deps/winpty/src/shared/DebugClient.cc +187 -0
- package/node_modules/node-pty/deps/winpty/src/shared/DebugClient.h +38 -0
- package/node_modules/node-pty/deps/winpty/src/shared/GenRandom.cc +138 -0
- package/node_modules/node-pty/deps/winpty/src/shared/GenRandom.h +55 -0
- package/node_modules/node-pty/deps/winpty/src/shared/GetCommitHash.bat +13 -0
- package/node_modules/node-pty/deps/winpty/src/shared/Mutex.h +54 -0
- package/node_modules/node-pty/deps/winpty/src/shared/OsModule.h +63 -0
- package/node_modules/node-pty/deps/winpty/src/shared/OwnedHandle.cc +36 -0
- package/node_modules/node-pty/deps/winpty/src/shared/OwnedHandle.h +45 -0
- package/node_modules/node-pty/deps/winpty/src/shared/PrecompiledHeader.h +43 -0
- package/node_modules/node-pty/deps/winpty/src/shared/StringBuilder.h +227 -0
- package/node_modules/node-pty/deps/winpty/src/shared/StringBuilderTest.cc +114 -0
- package/node_modules/node-pty/deps/winpty/src/shared/StringUtil.cc +55 -0
- package/node_modules/node-pty/deps/winpty/src/shared/StringUtil.h +80 -0
- package/node_modules/node-pty/deps/winpty/src/shared/TimeMeasurement.h +63 -0
- package/node_modules/node-pty/deps/winpty/src/shared/UnixCtrlChars.h +45 -0
- package/node_modules/node-pty/deps/winpty/src/shared/UpdateGenVersion.bat +20 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WindowsSecurity.cc +460 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WindowsSecurity.h +104 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WindowsVersion.cc +252 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WindowsVersion.h +29 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WinptyAssert.cc +55 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WinptyAssert.h +64 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WinptyException.cc +57 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WinptyException.h +43 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WinptyVersion.cc +42 -0
- package/node_modules/node-pty/deps/winpty/src/shared/WinptyVersion.h +27 -0
- package/node_modules/node-pty/deps/winpty/src/shared/winpty_snprintf.h +99 -0
- package/node_modules/node-pty/deps/winpty/src/subdir.mk +5 -0
- package/node_modules/node-pty/deps/winpty/src/tests/subdir.mk +28 -0
- package/node_modules/node-pty/deps/winpty/src/tests/trivial_test.cc +158 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/InputHandler.cc +114 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/InputHandler.h +56 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/OutputHandler.cc +80 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/OutputHandler.h +53 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/Util.cc +86 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/Util.h +31 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/WakeupFd.cc +70 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/WakeupFd.h +42 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/main.cc +729 -0
- package/node_modules/node-pty/deps/winpty/src/unix-adapter/subdir.mk +41 -0
- package/node_modules/node-pty/deps/winpty/src/winpty.gyp +234 -0
- package/node_modules/node-pty/deps/winpty/vcbuild.bat +83 -0
- package/node_modules/node-pty/lib/conpty_console_list_agent.js +16 -0
- package/node_modules/node-pty/lib/conpty_console_list_agent.js.map +1 -0
- package/node_modules/node-pty/lib/eventEmitter2.js +47 -0
- package/node_modules/node-pty/lib/eventEmitter2.js.map +1 -0
- package/node_modules/node-pty/lib/eventEmitter2.test.js +30 -0
- package/node_modules/node-pty/lib/eventEmitter2.test.js.map +1 -0
- package/node_modules/node-pty/lib/index.js +52 -0
- package/node_modules/node-pty/lib/index.js.map +1 -0
- package/node_modules/node-pty/lib/interfaces.js +7 -0
- package/node_modules/node-pty/lib/interfaces.js.map +1 -0
- package/node_modules/node-pty/lib/shared/conout.js +11 -0
- package/node_modules/node-pty/lib/shared/conout.js.map +1 -0
- package/node_modules/node-pty/lib/terminal.js +190 -0
- package/node_modules/node-pty/lib/terminal.js.map +1 -0
- package/node_modules/node-pty/lib/terminal.test.js +139 -0
- package/node_modules/node-pty/lib/terminal.test.js.map +1 -0
- package/node_modules/node-pty/lib/testUtils.test.js +28 -0
- package/node_modules/node-pty/lib/testUtils.test.js.map +1 -0
- package/node_modules/node-pty/lib/types.js +7 -0
- package/node_modules/node-pty/lib/types.js.map +1 -0
- package/node_modules/node-pty/lib/unixTerminal.js +346 -0
- package/node_modules/node-pty/lib/unixTerminal.js.map +1 -0
- package/node_modules/node-pty/lib/unixTerminal.test.js +351 -0
- package/node_modules/node-pty/lib/unixTerminal.test.js.map +1 -0
- package/node_modules/node-pty/lib/utils.js +39 -0
- package/node_modules/node-pty/lib/utils.js.map +1 -0
- package/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
- package/node_modules/node-pty/lib/windowsConoutConnection.js.map +1 -0
- package/node_modules/node-pty/lib/windowsPtyAgent.js +320 -0
- package/node_modules/node-pty/lib/windowsPtyAgent.js.map +1 -0
- package/node_modules/node-pty/lib/windowsPtyAgent.test.js +90 -0
- package/node_modules/node-pty/lib/windowsPtyAgent.test.js.map +1 -0
- package/node_modules/node-pty/lib/windowsTerminal.js +199 -0
- package/node_modules/node-pty/lib/windowsTerminal.js.map +1 -0
- package/node_modules/node-pty/lib/windowsTerminal.test.js +219 -0
- package/node_modules/node-pty/lib/windowsTerminal.test.js.map +1 -0
- package/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
- package/node_modules/node-pty/lib/worker/conoutSocketWorker.js.map +1 -0
- package/node_modules/node-pty/package.json +64 -0
- package/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
- package/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
- package/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
- package/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/pty.node +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/pty.pdb +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/winpty-agent.exe +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/winpty.dll +0 -0
- package/node_modules/node-pty/prebuilds/win32-arm64/winpty.pdb +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/pty.node +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/pty.pdb +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/winpty-agent.exe +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/winpty-agent.pdb +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/winpty.dll +0 -0
- package/node_modules/node-pty/prebuilds/win32-x64/winpty.pdb +0 -0
- package/node_modules/node-pty/scripts/gen-compile-commands.js +8 -0
- package/node_modules/node-pty/scripts/increment-version.js +54 -0
- package/node_modules/node-pty/scripts/post-install.js +80 -0
- package/node_modules/node-pty/scripts/prebuild.js +34 -0
- package/node_modules/node-pty/src/conpty_console_list_agent.ts +15 -0
- package/node_modules/node-pty/src/eventEmitter2.test.ts +30 -0
- package/node_modules/node-pty/src/eventEmitter2.ts +48 -0
- package/node_modules/node-pty/src/index.ts +52 -0
- package/node_modules/node-pty/src/interfaces.ts +130 -0
- package/node_modules/node-pty/src/native.d.ts +54 -0
- package/node_modules/node-pty/src/shared/conout.ts +15 -0
- package/node_modules/node-pty/src/terminal.test.ts +119 -0
- package/node_modules/node-pty/src/terminal.ts +211 -0
- package/node_modules/node-pty/src/testUtils.test.ts +23 -0
- package/node_modules/node-pty/src/tsconfig.json +22 -0
- package/node_modules/node-pty/src/types.ts +15 -0
- package/node_modules/node-pty/src/unix/pty.cc +799 -0
- package/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
- package/node_modules/node-pty/src/unixTerminal.test.ts +367 -0
- package/node_modules/node-pty/src/unixTerminal.ts +388 -0
- package/node_modules/node-pty/src/utils.ts +29 -0
- package/node_modules/node-pty/src/win/conpty.cc +583 -0
- package/node_modules/node-pty/src/win/conpty.h +41 -0
- package/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
- package/node_modules/node-pty/src/win/path_util.cc +95 -0
- package/node_modules/node-pty/src/win/path_util.h +26 -0
- package/node_modules/node-pty/src/win/winpty.cc +333 -0
- package/node_modules/node-pty/src/windowsConoutConnection.ts +82 -0
- package/node_modules/node-pty/src/windowsPtyAgent.test.ts +94 -0
- package/node_modules/node-pty/src/windowsPtyAgent.ts +321 -0
- package/node_modules/node-pty/src/windowsTerminal.test.ts +229 -0
- package/node_modules/node-pty/src/windowsTerminal.ts +203 -0
- package/node_modules/node-pty/src/worker/conoutSocketWorker.ts +22 -0
- package/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
- package/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
- package/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
- package/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
- package/node_modules/node-pty/typings/node-pty.d.ts +211 -0
- package/node_modules/npm-run-path/index.d.ts +90 -0
- package/node_modules/npm-run-path/index.js +55 -0
- package/node_modules/npm-run-path/license +9 -0
- package/node_modules/npm-run-path/node_modules/path-key/index.d.ts +31 -0
- package/node_modules/npm-run-path/node_modules/path-key/index.js +12 -0
- package/node_modules/npm-run-path/node_modules/path-key/license +9 -0
- package/node_modules/npm-run-path/node_modules/path-key/package.json +41 -0
- package/node_modules/npm-run-path/node_modules/path-key/readme.md +57 -0
- package/node_modules/npm-run-path/package.json +52 -0
- package/node_modules/npm-run-path/readme.md +104 -0
- package/node_modules/parse-ms/index.d.ts +30 -0
- package/node_modules/parse-ms/index.js +45 -0
- package/node_modules/parse-ms/license +9 -0
- package/node_modules/parse-ms/package.json +47 -0
- package/node_modules/parse-ms/readme.md +46 -0
- package/node_modules/path-key/index.d.ts +40 -0
- package/node_modules/path-key/index.js +16 -0
- package/node_modules/path-key/license +9 -0
- package/node_modules/path-key/package.json +39 -0
- package/node_modules/path-key/readme.md +61 -0
- package/node_modules/pretty-ms/index.d.ts +157 -0
- package/node_modules/pretty-ms/index.js +149 -0
- package/node_modules/pretty-ms/license +9 -0
- package/node_modules/pretty-ms/package.json +55 -0
- package/node_modules/pretty-ms/readme.md +179 -0
- package/node_modules/shebang-command/index.js +19 -0
- package/node_modules/shebang-command/license +9 -0
- package/node_modules/shebang-command/package.json +34 -0
- package/node_modules/shebang-command/readme.md +34 -0
- package/node_modules/shebang-regex/index.d.ts +22 -0
- package/node_modules/shebang-regex/index.js +2 -0
- package/node_modules/shebang-regex/license +9 -0
- package/node_modules/shebang-regex/package.json +35 -0
- package/node_modules/shebang-regex/readme.md +33 -0
- package/node_modules/signal-exit/LICENSE.txt +16 -0
- package/node_modules/signal-exit/README.md +74 -0
- package/node_modules/signal-exit/dist/cjs/browser.d.ts +12 -0
- package/node_modules/signal-exit/dist/cjs/browser.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/cjs/browser.js +10 -0
- package/node_modules/signal-exit/dist/cjs/browser.js.map +1 -0
- package/node_modules/signal-exit/dist/cjs/index.d.ts +48 -0
- package/node_modules/signal-exit/dist/cjs/index.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/cjs/index.js +279 -0
- package/node_modules/signal-exit/dist/cjs/index.js.map +1 -0
- package/node_modules/signal-exit/dist/cjs/package.json +3 -0
- package/node_modules/signal-exit/dist/cjs/signals.d.ts +29 -0
- package/node_modules/signal-exit/dist/cjs/signals.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/cjs/signals.js +42 -0
- package/node_modules/signal-exit/dist/cjs/signals.js.map +1 -0
- package/node_modules/signal-exit/dist/mjs/browser.d.ts +12 -0
- package/node_modules/signal-exit/dist/mjs/browser.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/mjs/browser.js +4 -0
- package/node_modules/signal-exit/dist/mjs/browser.js.map +1 -0
- package/node_modules/signal-exit/dist/mjs/index.d.ts +48 -0
- package/node_modules/signal-exit/dist/mjs/index.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/mjs/index.js +275 -0
- package/node_modules/signal-exit/dist/mjs/index.js.map +1 -0
- package/node_modules/signal-exit/dist/mjs/package.json +3 -0
- package/node_modules/signal-exit/dist/mjs/signals.d.ts +29 -0
- package/node_modules/signal-exit/dist/mjs/signals.d.ts.map +1 -0
- package/node_modules/signal-exit/dist/mjs/signals.js +39 -0
- package/node_modules/signal-exit/dist/mjs/signals.js.map +1 -0
- package/node_modules/signal-exit/package.json +106 -0
- package/node_modules/strip-ansi/index.d.ts +15 -0
- package/node_modules/strip-ansi/index.js +19 -0
- package/node_modules/strip-ansi/license +9 -0
- package/node_modules/strip-ansi/package.json +59 -0
- package/node_modules/strip-ansi/readme.md +37 -0
- package/node_modules/strip-final-newline/index.d.ts +18 -0
- package/node_modules/strip-final-newline/index.js +26 -0
- package/node_modules/strip-final-newline/license +9 -0
- package/node_modules/strip-final-newline/package.json +49 -0
- package/node_modules/strip-final-newline/readme.md +34 -0
- package/node_modules/unicorn-magic/default.d.ts +13 -0
- package/node_modules/unicorn-magic/default.js +14 -0
- package/node_modules/unicorn-magic/license +9 -0
- package/node_modules/unicorn-magic/node.d.ts +125 -0
- package/node_modules/unicorn-magic/node.js +49 -0
- package/node_modules/unicorn-magic/package.json +62 -0
- package/node_modules/unicorn-magic/readme.md +25 -0
- package/node_modules/which/LICENSE +15 -0
- package/node_modules/which/README.md +54 -0
- package/node_modules/which/bin/node-which +52 -0
- package/node_modules/which/package.json +43 -0
- package/node_modules/which/which.js +125 -0
- package/node_modules/yoctocolors/base.d.ts +47 -0
- package/node_modules/yoctocolors/base.js +94 -0
- package/node_modules/yoctocolors/index.d.ts +2 -0
- package/node_modules/yoctocolors/index.js +2 -0
- package/node_modules/yoctocolors/license +9 -0
- package/node_modules/yoctocolors/package.json +69 -0
- package/node_modules/yoctocolors/readme.md +138 -0
- package/package.json +131 -0
- package/packages/adapter-setup-doctor/package.descriptor.mjs +71 -0
- package/packages/adapter-setup-doctor/package.json +17 -0
- package/packages/adapter-setup-doctor/src/server/AdapterSetupDoctorProvider.js +60 -0
- package/packages/adapter-setup-doctor/src/server/actions.js +32 -0
- package/packages/adapter-setup-doctor/src/server/inputSchemas.js +49 -0
- package/packages/adapter-setup-doctor/src/server/registerRoutes.js +33 -0
- package/packages/adapter-setup-doctor/src/server/service.js +782 -0
- package/packages/current-app/package.descriptor.mjs +80 -0
- package/packages/current-app/package.json +22 -0
- package/packages/current-app/src/server/CurrentAppProvider.js +68 -0
- package/packages/current-app/src/server/actions.js +114 -0
- package/packages/current-app/src/server/inputSchemas.js +49 -0
- package/packages/current-app/src/server/registerRoutes.js +116 -0
- package/packages/current-app/src/server/service.js +630 -0
- package/packages/main/package.descriptor.mjs +71 -0
- package/packages/main/package.json +15 -0
- package/packages/main/src/client/index.js +13 -0
- package/packages/main/src/client/providers/MainClientProvider.js +30 -0
- package/packages/main/src/server/MainServiceProvider.js +20 -0
- package/packages/main/src/server/index.js +1 -0
- package/packages/main/src/server/loadAppConfig.js +9 -0
- package/packages/main/src/shared/index.js +10 -0
- package/packages/main/src/shared/schemas/index.js +22 -0
- package/packages/project-setup-doctor/package.descriptor.mjs +69 -0
- package/packages/project-setup-doctor/package.json +16 -0
- package/packages/project-setup-doctor/src/server/ProjectSetupDoctorProvider.js +60 -0
- package/packages/project-setup-doctor/src/server/actions.js +32 -0
- package/packages/project-setup-doctor/src/server/inputSchemas.js +49 -0
- package/packages/project-setup-doctor/src/server/registerRoutes.js +33 -0
- package/packages/project-setup-doctor/src/server/service.js +1398 -0
- package/packages/setup-doctor-core/README.md +9 -0
- package/packages/setup-doctor-core/package.descriptor.mjs +49 -0
- package/packages/setup-doctor-core/package.json +17 -0
- package/packages/setup-doctor-core/src/index.js +1 -0
- package/packages/setup-doctor-core/src/server/doctorPluginToolkit.js +564 -0
- package/packages/setup-doctor-core/src/server/doctorPlugins.js +170 -0
- package/packages/setup-doctor-core/src/server/doctorRoutes.js +201 -0
- package/packages/setup-doctor-core/src/server/doctorStatusCache.js +265 -0
- package/packages/setup-doctor-core/src/server/doctorStream.js +107 -0
- package/packages/setup-doctor-core/src/server/doctorToolchain.js +140 -0
- package/packages/setup-doctor-core/src/server/doctorToolchainCommands.js +55 -0
- package/packages/setup-doctor-core/src/server/githubRemote.js +23 -0
- package/packages/setup-doctor-core/src/server/githubRepoSetupScript.js +24 -0
- package/packages/setup-doctor-core/src/server/index.js +10 -0
- package/packages/setup-doctor-core/src/server/setupDoctorGit.js +820 -0
- package/packages/setup-doctor-core/src/shared/index.js +1 -0
- package/packages/studio-setup-doctor/package.descriptor.mjs +70 -0
- package/packages/studio-setup-doctor/package.json +17 -0
- package/packages/studio-setup-doctor/src/server/StudioSetupDoctorProvider.js +61 -0
- package/packages/studio-setup-doctor/src/server/actions.js +31 -0
- package/packages/studio-setup-doctor/src/server/containerEngine.js +18 -0
- package/packages/studio-setup-doctor/src/server/inputSchemas.js +45 -0
- package/packages/studio-setup-doctor/src/server/registerRoutes.js +33 -0
- package/packages/studio-setup-doctor/src/server/service.js +704 -0
- package/packages/studio-terminal-core/README.md +9 -0
- package/packages/studio-terminal-core/package.descriptor.mjs +50 -0
- package/packages/studio-terminal-core/package.json +17 -0
- package/packages/studio-terminal-core/src/index.js +1 -0
- package/packages/studio-terminal-core/src/server/containerRuntime.js +53 -0
- package/packages/studio-terminal-core/src/server/dockerRuntime.js +30 -0
- package/packages/studio-terminal-core/src/server/gitToolchainMounts.js +98 -0
- package/packages/studio-terminal-core/src/server/index.js +14 -0
- package/packages/studio-terminal-core/src/server/launchTargetTerminal.js +541 -0
- package/packages/studio-terminal-core/src/server/managedDatabases.js +429 -0
- package/packages/studio-terminal-core/src/server/runtimeContainers.js +912 -0
- package/packages/studio-terminal-core/src/server/shellCommands.js +96 -0
- package/packages/studio-terminal-core/src/server/shellScript.js +10 -0
- package/packages/studio-terminal-core/src/server/studioRuntimeIdentity.js +51 -0
- package/packages/studio-terminal-core/src/server/studioTerminalCleanup.js +453 -0
- package/packages/studio-terminal-core/src/server/studioTerminalLabels.js +3 -0
- package/packages/studio-terminal-core/src/server/studioToolHome.js +106 -0
- package/packages/studio-terminal-core/src/server/targetScriptTerminal.js +223 -0
- package/packages/studio-terminal-core/src/server/terminalSessions.js +558 -0
- package/packages/studio-terminal-core/src/shared/index.js +1 -0
- package/packages/vibe64-accounts/package.descriptor.mjs +74 -0
- package/packages/vibe64-accounts/package.json +17 -0
- package/packages/vibe64-accounts/src/server/Vibe64AccountsProvider.js +53 -0
- package/packages/vibe64-accounts/src/server/actions.js +114 -0
- package/packages/vibe64-accounts/src/server/inputSchemas.js +56 -0
- package/packages/vibe64-accounts/src/server/registerRoutes.js +76 -0
- package/packages/vibe64-accounts/src/server/service.js +583 -0
- package/packages/vibe64-adapters/README.md +9 -0
- package/packages/vibe64-adapters/package.descriptor.mjs +50 -0
- package/packages/vibe64-adapters/package.json +18 -0
- package/packages/vibe64-adapters/src/index.js +1 -0
- package/packages/vibe64-adapters/src/server/adapter.js +351 -0
- package/packages/vibe64-adapters/src/server/adapterBlueprints.js +21 -0
- package/packages/vibe64-adapters/src/server/adapterHelpers/setupDatabaseConnections.js +82 -0
- package/packages/vibe64-adapters/src/server/adapterHelpers/setupEnvFiles.js +157 -0
- package/packages/vibe64-adapters/src/server/adapterHelpers/setupMariaDbChecks.js +324 -0
- package/packages/vibe64-adapters/src/server/adapterHelpers/setupNodePackages.js +156 -0
- package/packages/vibe64-adapters/src/server/adapterHelpers/setupNodeWebChecks.js +113 -0
- package/packages/vibe64-adapters/src/server/adapterHelpers/setupPackageImports.js +135 -0
- package/packages/vibe64-adapters/src/server/adapterHelpers/setupVerificationChecks.js +103 -0
- package/packages/vibe64-adapters/src/server/adapterToolchains.js +114 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/adapter.js +513 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/build-system/cmake.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/build-system/make.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/build-system/meson.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/project-kind/executable.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/project-kind/library.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/standard/cpp17.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/standard/cpp20.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/standard/cpp23.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/testing/enabled.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/blueprints/testing/none.txt +3 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/config.js +201 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/constants.js +15 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/currentApp.js +264 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/index.js +66 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/manifest.js +40 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/projectFiles.js +191 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/prompts/execute_plan.txt +10 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/prompts/generic.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/prompts/make_plan.txt +11 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/prompts/prepare_for_merge.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/prompts/run_deep_ui_check.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/prompts/run_deslop.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/prompts/update_project_knowledge.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/seedProject.js +297 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/setupDoctorPlugin.js +287 -0
- package/packages/vibe64-adapters/src/server/adapters/cpp/toolchainIdentity.js +5 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/adapter.js +440 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/currentApp.js +220 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/index.js +60 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/launchTargets.js +352 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/manifest.js +49 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prepareWorktree.sh +6 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/agent_conversation.txt +26 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/execute_plan.txt +28 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/execute_seed_plan.txt +10 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/generic.txt +20 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/make_plan.txt +27 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/make_seed_plan.txt +17 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/prepare_for_merge.txt +8 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/run_deep_ui_check.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/run_deslop.txt +24 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/prompts/update_project_knowledge.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/setupDatabasePolicy.js +186 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/setupDependencyChecks.js +9 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/setupDoctorPlugin.js +234 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/setupMariaDbRuntime.js +228 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/setupProjectChecks.js +262 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/setupScaffold.js +99 -0
- package/packages/vibe64-adapters/src/server/adapters/jskit/toolchainIdentity.js +9 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/adapter.js +443 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/authentication/laravel.txt +4 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/authentication/none.txt +4 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/authentication/workos.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/boost/boost.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/boost/none.txt +4 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/database-runtime/mariadb.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/database-runtime/mysql.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/database-runtime/postgres.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/database-runtime/sqlite.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/livewire-components/class.txt +4 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/livewire-components/single_file.txt +4 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/custom.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/livewire.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/none.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/react.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/svelte.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/starter-kit/vue.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/teams/none.txt +4 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/teams/teams.txt +4 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/testing/pest.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/blueprints/testing/phpunit.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/composerPackage.js +97 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/config.js +54 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/constants.js +7 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/currentApp.js +187 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/databaseRuntime.js +237 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/index.js +60 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/launchTargets.js +115 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/manifest.js +41 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prepareWorktree.sh +8 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prompts/execute_plan.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prompts/execute_seed_plan.txt +10 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prompts/generic.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prompts/make_plan.txt +11 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prompts/make_seed_plan.txt +17 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prompts/prepare_for_merge.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prompts/run_deep_ui_check.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prompts/run_deslop.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/prompts/update_project_knowledge.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/setupDoctorPlugin.js +648 -0
- package/packages/vibe64-adapters/src/server/adapters/laravel/toolchainIdentity.js +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/adapter.js +353 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/data-layer/drizzle.txt +16 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/data-layer/none.txt +7 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/data-layer/prisma.txt +16 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/database-runtime/mysql.txt +8 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/database-runtime/none.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/database-runtime/postgres.txt +8 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-bundler/turbopack.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-bundler/webpack.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-language/javascript.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-language/typescript.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-linter/biome.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-linter/eslint.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-linter/none.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-source-layout/root.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-source-layout/src.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-styling/none.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/blueprints/seed-styling/tailwind.txt +5 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/config.js +251 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/constants.js +23 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/currentApp.js +128 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/databaseRuntime.js +199 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/index.js +68 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/launchTargets.js +124 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/manifest.js +47 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/prepareWorktree.sh +8 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/prompts/execute_plan.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/prompts/generic.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/prompts/make_plan.txt +11 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/prompts/prepare_for_merge.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/prompts/run_deep_ui_check.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/prompts/run_deslop.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/prompts/update_project_knowledge.txt +9 -0
- package/packages/vibe64-adapters/src/server/adapters/nextjs/setupDoctorPlugin.js +405 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/adapter.js +350 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/config.js +89 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/constants.js +7 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/currentApp.js +132 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/index.js +60 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/launchTargets.js +149 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/manifest.js +40 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/prepareWorktree.sh +8 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/projectDetection.js +619 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/prompts/execute_plan.txt +14 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/prompts/generic.txt +17 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/prompts/make_plan.txt +17 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/prompts/prepare_for_merge.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/prompts/run_deep_ui_check.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/prompts/run_deslop.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/prompts/update_project_knowledge.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/node-web/setupDoctorPlugin.js +166 -0
- package/packages/vibe64-adapters/src/server/adapters/registry.js +206 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/adapter.js +362 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/constants.js +7 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/currentApp.js +132 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/index.js +64 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/launchTargets.js +175 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/manifest.js +40 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/packageManager.js +51 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/prepareWorktree.sh +8 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/prompts/execute_plan.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/prompts/generic.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/prompts/make_plan.txt +8 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/prompts/prepare_for_merge.txt +8 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/prompts/run_deep_ui_check.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/prompts/run_deslop.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/prompts/update_project_knowledge.txt +6 -0
- package/packages/vibe64-adapters/src/server/adapters/vinext/setupDoctorPlugin.js +180 -0
- package/packages/vibe64-adapters/src/server/applicationTypes.js +139 -0
- package/packages/vibe64-adapters/src/server/codeIndexCommands.js +117 -0
- package/packages/vibe64-adapters/src/server/codeIndexScripts/javascript.mjs +114 -0
- package/packages/vibe64-adapters/src/server/codeIndexScripts/php.php +101 -0
- package/packages/vibe64-adapters/src/server/configStore.js +532 -0
- package/packages/vibe64-adapters/src/server/configValues.js +39 -0
- package/packages/vibe64-adapters/src/server/currentAppInspection.js +199 -0
- package/packages/vibe64-adapters/src/server/envFiles.js +30 -0
- package/packages/vibe64-adapters/src/server/fakeAdapter.js +132 -0
- package/packages/vibe64-adapters/src/server/index.js +24 -0
- package/packages/vibe64-adapters/src/server/nodeCurrentApp.js +203 -0
- package/packages/vibe64-adapters/src/server/nodePackage.js +184 -0
- package/packages/vibe64-adapters/src/server/nodePackageDoctor.js +65 -0
- package/packages/vibe64-adapters/src/server/nodePackageManagers.js +60 -0
- package/packages/vibe64-adapters/src/server/nodeWebProject.js +236 -0
- package/packages/vibe64-adapters/src/server/projectType.js +63 -0
- package/packages/vibe64-adapters/src/server/promptMarkers.js +86 -0
- package/packages/vibe64-adapters/src/server/promptQuestionPolicy.js +37 -0
- package/packages/vibe64-adapters/src/server/promptRenderer.js +480 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/agent_conversation.txt +45 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/execute_plan.txt +28 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/generic.txt +33 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/make_plan.txt +22 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/prepare_for_merge.txt +32 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/resolve_pull_request.txt +28 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/run_deep_ui_check.txt +22 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/run_deslop.txt +25 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/update_project_knowledge.txt +22 -0
- package/packages/vibe64-adapters/src/server/systemPrompts/write_report.txt +33 -0
- package/packages/vibe64-adapters/src/server/workflowAdapter.js +463 -0
- package/packages/vibe64-adapters/src/server/workflowCommandFacts.js +90 -0
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/commitPush.js +89 -0
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/factMetadata.js +113 -0
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/issuePr.js +171 -0
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/mergeSync.js +112 -0
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/shellHelpers.js +203 -0
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal/worktreeDependencies.js +313 -0
- package/packages/vibe64-adapters/src/server/workflowCommandTerminal.js +63 -0
- package/packages/vibe64-adapters/src/server/workflowSessionActions.js +211 -0
- package/packages/vibe64-adapters/src/shared/index.js +1 -0
- package/packages/vibe64-artifacts/package.descriptor.mjs +73 -0
- package/packages/vibe64-artifacts/package.json +15 -0
- package/packages/vibe64-artifacts/src/server/Vibe64ArtifactsProvider.js +61 -0
- package/packages/vibe64-artifacts/src/server/actions.js +83 -0
- package/packages/vibe64-artifacts/src/server/inputSchemas.js +113 -0
- package/packages/vibe64-artifacts/src/server/registerRoutes.js +148 -0
- package/packages/vibe64-artifacts/src/server/service.js +182 -0
- package/packages/vibe64-core/README.md +10 -0
- package/packages/vibe64-core/package.descriptor.mjs +60 -0
- package/packages/vibe64-core/package.json +24 -0
- package/packages/vibe64-core/src/index.js +1 -0
- package/packages/vibe64-core/src/server/core.js +54 -0
- package/packages/vibe64-core/src/server/deepFreeze.js +17 -0
- package/packages/vibe64-core/src/server/doctorCheckItems.js +129 -0
- package/packages/vibe64-core/src/server/featureRoutes.js +145 -0
- package/packages/vibe64-core/src/server/index.js +10 -0
- package/packages/vibe64-core/src/server/localStudioRequest.js +73 -0
- package/packages/vibe64-core/src/server/localhostCheckBypass.js +29 -0
- package/packages/vibe64-core/src/server/serverResponses.js +76 -0
- package/packages/vibe64-core/src/server/sessionRealtimeEvents.js +137 -0
- package/packages/vibe64-core/src/server/studioRoots.js +51 -0
- package/packages/vibe64-core/src/server/terminalWebSocketRoutes.js +158 -0
- package/packages/vibe64-core/src/shared/index.js +33 -0
- package/packages/vibe64-project/package.descriptor.mjs +73 -0
- package/packages/vibe64-project/package.json +16 -0
- package/packages/vibe64-project/src/server/Vibe64ProjectProvider.js +53 -0
- package/packages/vibe64-project/src/server/actions.js +117 -0
- package/packages/vibe64-project/src/server/inputSchemas.js +41 -0
- package/packages/vibe64-project/src/server/registerRoutes.js +58 -0
- package/packages/vibe64-project/src/server/service.js +290 -0
- package/packages/vibe64-runtime/README.md +9 -0
- package/packages/vibe64-runtime/package.descriptor.mjs +52 -0
- package/packages/vibe64-runtime/package.json +19 -0
- package/packages/vibe64-runtime/src/index.js +1 -0
- package/packages/vibe64-runtime/src/server/currentStepInputHelperServer.js +308 -0
- package/packages/vibe64-runtime/src/server/index.js +18 -0
- package/packages/vibe64-runtime/src/server/registerCoreWorkflowModules.js +52 -0
- package/packages/vibe64-runtime/src/server/runtime.js +1231 -0
- package/packages/vibe64-runtime/src/server/sessionDebugLog.js +7 -0
- package/packages/vibe64-runtime/src/server/sessionDebugLogCore.js +57 -0
- package/packages/vibe64-runtime/src/server/sessionStore.js +1468 -0
- package/packages/vibe64-runtime/src/server/setupReadiness.js +112 -0
- package/packages/vibe64-runtime/src/server/terminalFailureFixRequest.js +143 -0
- package/packages/vibe64-runtime/src/server/workflow.js +96 -0
- package/packages/vibe64-runtime/src/server/workflowArtifacts.js +17 -0
- package/packages/vibe64-runtime/src/server/workflowConditions.js +101 -0
- package/packages/vibe64-runtime/src/server/workflowDefinitionBuilders.js +91 -0
- package/packages/vibe64-runtime/src/server/workflowMachine.js +919 -0
- package/packages/vibe64-runtime/src/server/workflowModules/coreCoding.js +1248 -0
- package/packages/vibe64-runtime/src/server/workflowModules/coreLifecycle.js +1340 -0
- package/packages/vibe64-runtime/src/server/workflowModules/coreMaintenance.js +209 -0
- package/packages/vibe64-runtime/src/server/workflowPresentation.js +1281 -0
- package/packages/vibe64-runtime/src/server/workflowRegistry.js +628 -0
- package/packages/vibe64-runtime/src/server/workflowStepFactories.js +22 -0
- package/packages/vibe64-runtime/src/server/workflowStepMachineHelpers.js +939 -0
- package/packages/vibe64-runtime/src/server/workflowStepMachines.js +156 -0
- package/packages/vibe64-runtime/src/shared/index.js +1 -0
- package/packages/vibe64-sessions/package.descriptor.mjs +84 -0
- package/packages/vibe64-sessions/package.json +21 -0
- package/packages/vibe64-sessions/src/server/Vibe64SessionsProvider.js +78 -0
- package/packages/vibe64-sessions/src/server/actions.js +272 -0
- package/packages/vibe64-sessions/src/server/inputSchemas.js +204 -0
- package/packages/vibe64-sessions/src/server/registerRoutes.js +141 -0
- package/packages/vibe64-sessions/src/server/service.js +853 -0
- package/packages/vibe64-sessions/src/server/sessionDiff.js +90 -0
- package/packages/vibe64-terminals/package.descriptor.mjs +77 -0
- package/packages/vibe64-terminals/package.json +19 -0
- package/packages/vibe64-terminals/src/server/Vibe64TerminalsProvider.js +100 -0
- package/packages/vibe64-terminals/src/server/actions.js +124 -0
- package/packages/vibe64-terminals/src/server/codexAttachments.js +147 -0
- package/packages/vibe64-terminals/src/server/codexTerminal.js +1120 -0
- package/packages/vibe64-terminals/src/server/commandTerminal.js +975 -0
- package/packages/vibe64-terminals/src/server/commandTerminalResults.js +87 -0
- package/packages/vibe64-terminals/src/server/inputSchemas.js +135 -0
- package/packages/vibe64-terminals/src/server/launchTargetTerminal.js +470 -0
- package/packages/vibe64-terminals/src/server/registerRoutes.js +241 -0
- package/packages/vibe64-terminals/src/server/service.js +190 -0
- package/packages/vibe64-terminals/src/server/shellTerminal.js +390 -0
- package/packages/vibe64-terminals/src/server/targetToolchainTerminal.js +97 -0
- package/packages/vibe64-terminals/src/server/terminalEnvironment.js +102 -0
- package/packages/vibe64-terminals/src/server/terminalRuntimeContainers.js +80 -0
- package/packages/vibe64-terminals/src/server/terminalShared.js +112 -0
- package/packages/vibe64-terminals/src/server/terminalToolchainImage.js +77 -0
- package/server/lib/browserLifecycle.js +134 -0
- package/server/lib/runtimeEnv.js +45 -0
- package/server/lib/surfaceRuntime.js +10 -0
- package/server.js +337 -0
- package/tooling/adapters/cpp/Dockerfile +27 -0
- package/tooling/adapters/jskit/Dockerfile +9 -0
- package/tooling/adapters/jskit/docs/future-strengthening.md +160 -0
- package/tooling/adapters/laravel/Dockerfile +45 -0
- package/tooling/package-install-smoke.mjs +158 -0
- package/tooling/studio-setup/Dockerfile +55 -0
- package/tooling/verify-package-boundaries.mjs +480 -0
|
@@ -0,0 +1,2582 @@
|
|
|
1
|
+
# Tutorial
|
|
2
|
+
|
|
3
|
+
Welcome! This tutorial will walk you through everything you need to know to use the schema validation library effectively. We'll start with the basics and progressively move to more advanced topics like creating your own custom rules.
|
|
4
|
+
|
|
5
|
+
Published documentation:
|
|
6
|
+
|
|
7
|
+
<https://mobily-enterprises.github.io/json-rest-schema/>
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Install the package in your app with:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install json-rest-schema
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
If you are working in this repo and want to run the documentation site locally:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install
|
|
21
|
+
npm run docs:dev
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Build the full static site, including the standalone React and Vue demo apps, with:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm run docs:build
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Preview that built site locally with:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm run docs:preview
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The published docs site is the best place to read the same manual as shorter chapters for:
|
|
37
|
+
|
|
38
|
+
* create / replace / patch semantics
|
|
39
|
+
* nested object and array contracts
|
|
40
|
+
* recursive runtime validation and transport export
|
|
41
|
+
* field introspection and path-scoped validation
|
|
42
|
+
* React Hook Form, Vue + Vuetify, and VeeValidate adapters
|
|
43
|
+
* demo app walkthroughs
|
|
44
|
+
|
|
45
|
+
## Getting Started: Your First Schema
|
|
46
|
+
|
|
47
|
+
Let's start with a common use case: validating a user registration form.
|
|
48
|
+
|
|
49
|
+
First, import the library's factory function and define the structure of the data you expect.
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
import { createSchema } from 'json-rest-schema';
|
|
53
|
+
|
|
54
|
+
// Define the structure and rules for our user data
|
|
55
|
+
const userSchema = createSchema({
|
|
56
|
+
username: { type: 'string', required: true, minLength: 3 },
|
|
57
|
+
email: { type: 'string', required: true },
|
|
58
|
+
age: { type: 'number', min: 18, defaultTo: 18 }
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Now, let's try to validate an object against this schema.
|
|
63
|
+
|
|
64
|
+
```javascript
|
|
65
|
+
// An example input object from a form
|
|
66
|
+
const userInput = {
|
|
67
|
+
username: ' alex ', // Includes extra whitespace
|
|
68
|
+
email: 'alex@example.com',
|
|
69
|
+
age: '25' // Note: age is a string here
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const { validatedObject, errors } = userSchema.create(userInput);
|
|
73
|
+
|
|
74
|
+
// Check if there were any errors by seeing if the errors object has keys
|
|
75
|
+
if (Object.keys(errors).length > 0) {
|
|
76
|
+
console.log("Validation failed!");
|
|
77
|
+
console.log(errors);
|
|
78
|
+
} else {
|
|
79
|
+
console.log("Validation successful!");
|
|
80
|
+
console.log(validatedObject);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**What happens here?**
|
|
85
|
+
|
|
86
|
+
1. The `age` string `'25'` is **cast** to the number `25` by the `number` type handler.
|
|
87
|
+
2. The `username` string `' alex '` is **transformed** by the `string` type handler to `'alex'` (it gets trimmed).
|
|
88
|
+
3. Since there are no validation errors, the `errors` object will be empty.
|
|
89
|
+
4. The `validatedObject` will contain the clean, cast, and transformed data.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Validation Results and Error Helpers
|
|
94
|
+
|
|
95
|
+
The schema operation methods return an object with two properties: `validatedObject` and `errors`.
|
|
96
|
+
|
|
97
|
+
### The `validatedObject`
|
|
98
|
+
|
|
99
|
+
This object contains the data after all casting and transformations have been applied. It's the "clean" version of your input that you should use in the rest of your application (e.g., to save to a database).
|
|
100
|
+
|
|
101
|
+
### The `errors` Object
|
|
102
|
+
|
|
103
|
+
This is your primary tool for handling validation failures.
|
|
104
|
+
|
|
105
|
+
* **It's a Map, Not an Array:** The `errors` object is a map where keys are the field names that failed. This allows you to instantly check if a specific field has an error: `if (errors.age) { ... }`.
|
|
106
|
+
* **Rich Error Structure:** Each error in the map is a detailed object: `{ code, message, params }`.
|
|
107
|
+
* **Nested paths stay flat:** Nested fields are reported with dotted paths such as `workspace.slug` or `roles.2.id`. That keeps the external error contract simple even when schemas are recursive.
|
|
108
|
+
|
|
109
|
+
Let's look at an example with invalid data:
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
const invalidInput = {
|
|
113
|
+
username: 'Al', // Fails 'minLength: 3'
|
|
114
|
+
// email is missing, fails 'required: true'
|
|
115
|
+
age: 16 // Fails 'min: 18'
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const { validatedObject, errors } = userSchema.create(invalidInput);
|
|
119
|
+
|
|
120
|
+
console.log(JSON.stringify(errors, null, 2));
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The output would look like this:
|
|
124
|
+
|
|
125
|
+
```json
|
|
126
|
+
{
|
|
127
|
+
"username": {
|
|
128
|
+
"field": "username",
|
|
129
|
+
"code": "MIN_LENGTH",
|
|
130
|
+
"message": "Length must be at least 3 characters.",
|
|
131
|
+
"params": { "min": 3, "actual": 2 }
|
|
132
|
+
},
|
|
133
|
+
"email": {
|
|
134
|
+
"field": "email",
|
|
135
|
+
"code": "REQUIRED",
|
|
136
|
+
"message": "Field is required",
|
|
137
|
+
"params": {}
|
|
138
|
+
},
|
|
139
|
+
"age": {
|
|
140
|
+
"field": "age",
|
|
141
|
+
"code": "MIN_VALUE",
|
|
142
|
+
"message": "Value must be at least 18.",
|
|
143
|
+
"params": { "min": 18, "actual": 16 }
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
* **`code`**: A stable, machine-readable string. Use this in your code for logic (`if (err.code === 'MIN_LENGTH')`).
|
|
149
|
+
* **`message`**: A human-readable message, great for developers or for displaying directly to users in simple cases.
|
|
150
|
+
* **`params`**: Extra context about the failure. This is incredibly useful for creating dynamic error messages (e.g., "You entered 2 characters, but a minimum of 3 is required.").
|
|
151
|
+
|
|
152
|
+
### Error helper utilities
|
|
153
|
+
|
|
154
|
+
If you want a few adapter-friendly utilities around that flat error map, import them directly:
|
|
155
|
+
|
|
156
|
+
```javascript
|
|
157
|
+
import { createSchema, getError, hasError, nestErrors, flattenErrors } from 'json-rest-schema'
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`getError(errors, path)` reads one dotted-path error:
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
const slugError = getError(errors, 'workspace.slug')
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
`hasError(errors, path)` is the small boolean version:
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
const showSlugError = hasError(errors, 'workspace.slug')
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
`nestErrors(errors)` converts the flat map into a nested object/array shape for form libraries that prefer nested field errors:
|
|
173
|
+
|
|
174
|
+
```javascript
|
|
175
|
+
nestErrors({
|
|
176
|
+
'workspace.slug': {
|
|
177
|
+
field: 'workspace.slug',
|
|
178
|
+
code: 'MIN_LENGTH',
|
|
179
|
+
message: 'Length must be at least 3 characters.',
|
|
180
|
+
params: { min: 3, actual: 1 }
|
|
181
|
+
},
|
|
182
|
+
'roles.2.label': {
|
|
183
|
+
field: 'roles.2.label',
|
|
184
|
+
code: 'REQUIRED',
|
|
185
|
+
message: 'Field is required',
|
|
186
|
+
params: {}
|
|
187
|
+
}
|
|
188
|
+
})
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Result:
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
{
|
|
195
|
+
workspace: {
|
|
196
|
+
slug: {
|
|
197
|
+
field: 'workspace.slug',
|
|
198
|
+
code: 'MIN_LENGTH',
|
|
199
|
+
message: 'Length must be at least 3 characters.',
|
|
200
|
+
params: { min: 3, actual: 1 }
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
roles: [
|
|
204
|
+
,
|
|
205
|
+
,
|
|
206
|
+
{
|
|
207
|
+
label: {
|
|
208
|
+
field: 'roles.2.label',
|
|
209
|
+
code: 'REQUIRED',
|
|
210
|
+
message: 'Field is required',
|
|
211
|
+
params: {}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
That keeps the runtime contract flat, while still making it easy to adapt into nested UI-state libraries.
|
|
219
|
+
|
|
220
|
+
`flattenErrors(nestedErrors)` does the reverse when a UI layer gives you nested field errors and you want to normalize them back into the library's flat contract:
|
|
221
|
+
|
|
222
|
+
```javascript
|
|
223
|
+
flattenErrors({
|
|
224
|
+
workspace: {
|
|
225
|
+
slug: {
|
|
226
|
+
field: 'workspace.slug',
|
|
227
|
+
code: 'MIN_LENGTH',
|
|
228
|
+
message: 'Length must be at least 3 characters.',
|
|
229
|
+
params: { min: 3, actual: 1 }
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
roles: [
|
|
233
|
+
,
|
|
234
|
+
,
|
|
235
|
+
{
|
|
236
|
+
label: {
|
|
237
|
+
field: 'roles.2.label',
|
|
238
|
+
code: 'REQUIRED',
|
|
239
|
+
message: 'Field is required',
|
|
240
|
+
params: {}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
})
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Result:
|
|
248
|
+
|
|
249
|
+
```javascript
|
|
250
|
+
{
|
|
251
|
+
'workspace.slug': {
|
|
252
|
+
field: 'workspace.slug',
|
|
253
|
+
code: 'MIN_LENGTH',
|
|
254
|
+
message: 'Length must be at least 3 characters.',
|
|
255
|
+
params: { min: 3, actual: 1 }
|
|
256
|
+
},
|
|
257
|
+
'roles.2.label': {
|
|
258
|
+
field: 'roles.2.label',
|
|
259
|
+
code: 'REQUIRED',
|
|
260
|
+
message: 'Field is required',
|
|
261
|
+
params: {}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Operation Contracts
|
|
267
|
+
|
|
268
|
+
For explicit write semantics, the schema instance exposes three synchronous built-in operation methods:
|
|
269
|
+
|
|
270
|
+
```javascript
|
|
271
|
+
userSchema.create(input);
|
|
272
|
+
userSchema.replace(input);
|
|
273
|
+
userSchema.patch(input);
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
They all return the same `{ validatedObject, errors }` shape, but they differ in how omitted fields are treated:
|
|
277
|
+
|
|
278
|
+
* **`create()`**: validates a create payload, enforces `required`, applies `defaultTo`, and leaves omitted optional fields omitted.
|
|
279
|
+
* **`replace()`**: validates a full replacement payload, enforces `required`, applies `defaultTo`, and preserves omitted fields.
|
|
280
|
+
* **`patch()`**: validates only explicitly provided fields and returns only the normalized fields that were touched.
|
|
281
|
+
|
|
282
|
+
These are built-in named operation contracts, not special cases in the engine. If you need a different contract, define a custom operation and the schema will generate a matching method alias automatically.
|
|
283
|
+
|
|
284
|
+
### Worked operation example
|
|
285
|
+
|
|
286
|
+
This is easier to understand with one schema and three calls:
|
|
287
|
+
|
|
288
|
+
```javascript
|
|
289
|
+
const profileSchema = createSchema({
|
|
290
|
+
username: { type: 'string', required: true },
|
|
291
|
+
bio: { type: 'string' },
|
|
292
|
+
role: { type: 'string', defaultTo: 'member' }
|
|
293
|
+
})
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Calling `create()`:
|
|
297
|
+
|
|
298
|
+
```javascript
|
|
299
|
+
profileSchema.create({
|
|
300
|
+
username: ' alex '
|
|
301
|
+
})
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Result:
|
|
305
|
+
|
|
306
|
+
```javascript
|
|
307
|
+
{
|
|
308
|
+
validatedObject: {
|
|
309
|
+
username: 'alex',
|
|
310
|
+
role: 'member'
|
|
311
|
+
},
|
|
312
|
+
errors: {}
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Calling `replace()` with the same payload:
|
|
317
|
+
|
|
318
|
+
```javascript
|
|
319
|
+
profileSchema.replace({
|
|
320
|
+
username: ' alex '
|
|
321
|
+
})
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Result:
|
|
325
|
+
|
|
326
|
+
```javascript
|
|
327
|
+
{
|
|
328
|
+
validatedObject: {
|
|
329
|
+
username: 'alex',
|
|
330
|
+
role: 'member'
|
|
331
|
+
},
|
|
332
|
+
errors: {}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Calling `patch()` with the same payload:
|
|
337
|
+
|
|
338
|
+
```javascript
|
|
339
|
+
profileSchema.patch({
|
|
340
|
+
username: ' alex '
|
|
341
|
+
})
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Result:
|
|
345
|
+
|
|
346
|
+
```javascript
|
|
347
|
+
{
|
|
348
|
+
validatedObject: {
|
|
349
|
+
username: 'alex'
|
|
350
|
+
},
|
|
351
|
+
errors: {}
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
That difference is the whole point of operation contracts:
|
|
356
|
+
|
|
357
|
+
* `create()` and `replace()` walk the schema as a contract for the whole object.
|
|
358
|
+
* `patch()` walks only the fields the caller actually touched.
|
|
359
|
+
* Defaults apply on operations that opt into defaults.
|
|
360
|
+
* Missing required fields are only errors on operations that opt into required checks.
|
|
361
|
+
|
|
362
|
+
## Custom Operations
|
|
363
|
+
|
|
364
|
+
Custom operations are declared when you create the schema.
|
|
365
|
+
|
|
366
|
+
```javascript
|
|
367
|
+
const userSchema = createSchema({
|
|
368
|
+
id: { type: 'id', required: true },
|
|
369
|
+
email: { type: 'string', required: true },
|
|
370
|
+
role: { type: 'string', defaultTo: 'guest' }
|
|
371
|
+
}, {
|
|
372
|
+
operations: {
|
|
373
|
+
upsert: {
|
|
374
|
+
targetFields: 'schema',
|
|
375
|
+
enforceRequired: false,
|
|
376
|
+
applyDefaults: true,
|
|
377
|
+
outputFields: 'validated'
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
})
|
|
381
|
+
|
|
382
|
+
const result = userSchema.upsert({ email: 'alex@example.com' })
|
|
383
|
+
const sameResult = userSchema.validateWith('upsert', { email: 'alex@example.com' })
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
Operation aliases are generated automatically from the operation registry, so `create`, `replace`, and `patch` keep working exactly as before. If you intentionally redefine one of those names in `operations`, the built-in behavior is replaced for that schema instance.
|
|
387
|
+
|
|
388
|
+
Supported operation descriptor keys:
|
|
389
|
+
|
|
390
|
+
| Key | Allowed Values | Meaning |
|
|
391
|
+
|---|---|---|
|
|
392
|
+
| `targetFields` | `'schema'` or `'input'` | Which fields are validated. `'schema'` walks the schema definition, `'input'` only validates explicitly provided fields. |
|
|
393
|
+
| `enforceRequired` | `true` or `false` | Whether missing `required` fields produce errors. |
|
|
394
|
+
| `applyDefaults` | `true` or `false` | Whether omitted fields with `defaultTo` are materialized into the result. |
|
|
395
|
+
| `outputFields` | `'validated'` or `'input'` | Which field set is considered when building `validatedObject`. `'validated'` follows schema fields, `'input'` follows only explicitly provided fields. |
|
|
396
|
+
| `rejectExplicitUndefined` | `true` or `false` | Whether an explicitly provided `undefined` value is treated as a type error. Defaults to `true`. |
|
|
397
|
+
|
|
398
|
+
Method names are generated automatically from operation names. Names that already exist on `Schema` are reserved and rejected. In practice that means names such as `validateWith`, `toJsonSchema`, `getFieldDefinitions`, `getFieldDefinition`, `getFieldMessages`, and `cleanup` cannot be used as operation aliases.
|
|
399
|
+
|
|
400
|
+
## Field Introspection
|
|
401
|
+
|
|
402
|
+
Schema instances also expose three read-only introspection helpers:
|
|
403
|
+
|
|
404
|
+
* `schema.getFieldDefinitions()` returns a frozen snapshot map of the top-level field definitions.
|
|
405
|
+
* `schema.getFieldDefinition(path)` resolves one field definition by dotted path, including nested object fields and numeric array segments such as `roles.0.id`, and returns it as a frozen snapshot.
|
|
406
|
+
* `schema.getFieldMessages(path)` returns the field's `messages` object as a frozen snapshot, or `{}` when none exist.
|
|
407
|
+
|
|
408
|
+
These helpers are intentionally inspection-only. They clone the schema metadata they expose so adapter code can read field settings without gaining a back door to mutate runtime validation behavior.
|
|
409
|
+
|
|
410
|
+
Example:
|
|
411
|
+
|
|
412
|
+
```javascript
|
|
413
|
+
const roleSchema = createSchema({
|
|
414
|
+
id: { type: 'string', required: true }
|
|
415
|
+
})
|
|
416
|
+
|
|
417
|
+
const teamSchema = createSchema({
|
|
418
|
+
name: { type: 'string', required: true },
|
|
419
|
+
roles: {
|
|
420
|
+
type: 'array',
|
|
421
|
+
items: roleSchema
|
|
422
|
+
}
|
|
423
|
+
})
|
|
424
|
+
|
|
425
|
+
const topLevelDefinitions = teamSchema.getFieldDefinitions()
|
|
426
|
+
const roleIdDefinition = teamSchema.getFieldDefinition('roles.0.id')
|
|
427
|
+
const roleIdMessages = teamSchema.getFieldMessages('roles.0.id')
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
In that example:
|
|
431
|
+
|
|
432
|
+
* `topLevelDefinitions` contains snapshots for `name` and `roles`
|
|
433
|
+
* `roleIdDefinition` resolves through the array item schema to the nested `id` field
|
|
434
|
+
* `roleIdMessages` returns `{}` because that field did not define a `messages` object
|
|
435
|
+
|
|
436
|
+
Treat the returned objects as metadata for rendering and adapter logic, not as something to mutate.
|
|
437
|
+
|
|
438
|
+
## Nested Object, Array, and Object-Bag Contracts
|
|
439
|
+
|
|
440
|
+
This library now supports the three nested contract shapes that come up constantly in shared REST payloads, without turning into a generic schema engine:
|
|
441
|
+
|
|
442
|
+
1. **Nested object fields** with `type: 'object'` and `schema`
|
|
443
|
+
2. **Nested array items** with `type: 'array'` and `items`
|
|
444
|
+
3. **Opaque object bags** with `type: 'object'` and `additionalProperties: true`
|
|
445
|
+
|
|
446
|
+
The important design rule is that these are still **application contracts**, not arbitrary JSON Schema fragments.
|
|
447
|
+
|
|
448
|
+
### Nested object fields
|
|
449
|
+
|
|
450
|
+
Use a child `Schema` instance when a field should itself be validated as an object.
|
|
451
|
+
|
|
452
|
+
```javascript
|
|
453
|
+
const workspaceSummarySchema = createSchema({
|
|
454
|
+
id: { type: 'id', required: true },
|
|
455
|
+
slug: { type: 'string', required: true },
|
|
456
|
+
ownerUserId: { type: 'id', required: true }
|
|
457
|
+
})
|
|
458
|
+
|
|
459
|
+
const workspaceSettingsSchema = createSchema({
|
|
460
|
+
invitesEnabled: { type: 'boolean', required: true }
|
|
461
|
+
})
|
|
462
|
+
|
|
463
|
+
const workspaceViewSchema = createSchema({
|
|
464
|
+
workspace: {
|
|
465
|
+
type: 'object',
|
|
466
|
+
required: true,
|
|
467
|
+
schema: workspaceSummarySchema
|
|
468
|
+
},
|
|
469
|
+
settings: {
|
|
470
|
+
type: 'object',
|
|
471
|
+
required: true,
|
|
472
|
+
schema: workspaceSettingsSchema
|
|
473
|
+
}
|
|
474
|
+
})
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
How nested object fields behave:
|
|
478
|
+
|
|
479
|
+
* The nested schema inherits the parent operation contract.
|
|
480
|
+
* `create()` on the parent runs `create`-style rules inside the child.
|
|
481
|
+
* `patch()` on the parent runs `patch`-style rules inside the child.
|
|
482
|
+
* Errors are reported with dotted paths such as `workspace.slug`.
|
|
483
|
+
* Unknown nested keys are rejected because child schemas are strict by default, just like top-level schemas.
|
|
484
|
+
|
|
485
|
+
That operation inheritance is deliberate. A nested object inside a patch payload is usually itself a patch payload.
|
|
486
|
+
|
|
487
|
+
### Worked nested object example
|
|
488
|
+
|
|
489
|
+
Using the schema above:
|
|
490
|
+
|
|
491
|
+
```javascript
|
|
492
|
+
const result = workspaceViewSchema.create({
|
|
493
|
+
workspace: {
|
|
494
|
+
id: '42',
|
|
495
|
+
slug: ' main-workspace ',
|
|
496
|
+
extra: true
|
|
497
|
+
},
|
|
498
|
+
settings: {}
|
|
499
|
+
})
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
`validatedObject` becomes:
|
|
503
|
+
|
|
504
|
+
```javascript
|
|
505
|
+
{
|
|
506
|
+
workspace: {
|
|
507
|
+
id: 42,
|
|
508
|
+
slug: 'main-workspace'
|
|
509
|
+
},
|
|
510
|
+
settings: {}
|
|
511
|
+
}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
`errors` becomes:
|
|
515
|
+
|
|
516
|
+
```javascript
|
|
517
|
+
{
|
|
518
|
+
'workspace.ownerUserId': {
|
|
519
|
+
field: 'workspace.ownerUserId',
|
|
520
|
+
code: 'REQUIRED',
|
|
521
|
+
message: 'Field is required',
|
|
522
|
+
params: {}
|
|
523
|
+
},
|
|
524
|
+
'workspace.extra': {
|
|
525
|
+
field: 'workspace.extra',
|
|
526
|
+
code: 'FIELD_NOT_ALLOWED',
|
|
527
|
+
message: 'Field not allowed',
|
|
528
|
+
params: {}
|
|
529
|
+
},
|
|
530
|
+
'settings.invitesEnabled': {
|
|
531
|
+
field: 'settings.invitesEnabled',
|
|
532
|
+
code: 'REQUIRED',
|
|
533
|
+
message: 'Field is required',
|
|
534
|
+
params: {}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
Now compare that with a nested patch:
|
|
540
|
+
|
|
541
|
+
```javascript
|
|
542
|
+
workspaceViewSchema.patch({
|
|
543
|
+
workspace: {
|
|
544
|
+
slug: ' sandbox '
|
|
545
|
+
}
|
|
546
|
+
})
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
Result:
|
|
550
|
+
|
|
551
|
+
```javascript
|
|
552
|
+
{
|
|
553
|
+
validatedObject: {
|
|
554
|
+
workspace: {
|
|
555
|
+
slug: 'sandbox'
|
|
556
|
+
}
|
|
557
|
+
},
|
|
558
|
+
errors: {}
|
|
559
|
+
}
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
Notice what did **not** happen:
|
|
563
|
+
|
|
564
|
+
* `workspace.id` was not required
|
|
565
|
+
* `workspace.ownerUserId` was not required
|
|
566
|
+
* no defaults were invented
|
|
567
|
+
|
|
568
|
+
That is exactly because the child object inherited the parent `patch` contract.
|
|
569
|
+
|
|
570
|
+
### Nested array items
|
|
571
|
+
|
|
572
|
+
Use `items` when every array entry should be validated recursively.
|
|
573
|
+
|
|
574
|
+
```javascript
|
|
575
|
+
const roleSchema = createSchema({
|
|
576
|
+
id: { type: 'string', required: true },
|
|
577
|
+
label: { type: 'string', required: true }
|
|
578
|
+
})
|
|
579
|
+
|
|
580
|
+
const roleCatalogSchema = createSchema({
|
|
581
|
+
roles: {
|
|
582
|
+
type: 'array',
|
|
583
|
+
required: true,
|
|
584
|
+
items: roleSchema
|
|
585
|
+
},
|
|
586
|
+
assignableRoleIds: {
|
|
587
|
+
type: 'array',
|
|
588
|
+
required: true,
|
|
589
|
+
items: { type: 'string', minLength: 1 }
|
|
590
|
+
}
|
|
591
|
+
})
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
How array items behave:
|
|
595
|
+
|
|
596
|
+
* Primitive item definitions are validated item-by-item and normalized in place.
|
|
597
|
+
* If `items` is a nested object schema, each item is validated in `replace` mode.
|
|
598
|
+
* Array item errors use indexed dotted paths such as `roles.0.label`.
|
|
599
|
+
|
|
600
|
+
That `replace` rule for object items is intentional. If a client sends the `roles` array in a patch, they are replacing the array field, so each object item still needs to be complete.
|
|
601
|
+
|
|
602
|
+
### Worked nested array example
|
|
603
|
+
|
|
604
|
+
```javascript
|
|
605
|
+
const result = roleCatalogSchema.patch({
|
|
606
|
+
roles: [
|
|
607
|
+
{ id: 'admin' },
|
|
608
|
+
{ id: 'editor', label: ' Editor ' }
|
|
609
|
+
],
|
|
610
|
+
assignableRoleIds: [' owner ', ' ', 123]
|
|
611
|
+
})
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
`validatedObject` becomes:
|
|
615
|
+
|
|
616
|
+
```javascript
|
|
617
|
+
{
|
|
618
|
+
roles: [
|
|
619
|
+
{ id: 'admin' },
|
|
620
|
+
{ id: 'editor', label: 'Editor' }
|
|
621
|
+
],
|
|
622
|
+
assignableRoleIds: ['owner', '', '123']
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
`errors` becomes:
|
|
627
|
+
|
|
628
|
+
```javascript
|
|
629
|
+
{
|
|
630
|
+
'roles.0.label': {
|
|
631
|
+
field: 'roles.0.label',
|
|
632
|
+
code: 'REQUIRED',
|
|
633
|
+
message: 'Field is required',
|
|
634
|
+
params: {}
|
|
635
|
+
},
|
|
636
|
+
'assignableRoleIds.1': {
|
|
637
|
+
field: 'assignableRoleIds.1',
|
|
638
|
+
code: 'MIN_LENGTH',
|
|
639
|
+
message: 'Length must be at least 1 characters.',
|
|
640
|
+
params: { min: 1, actual: 0 }
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
This example shows both supported array styles:
|
|
646
|
+
|
|
647
|
+
* `roles` uses a child `Schema` instance for structured object items
|
|
648
|
+
* `assignableRoleIds` uses an inline field definition for primitive items
|
|
649
|
+
|
|
650
|
+
### Opaque object bags
|
|
651
|
+
|
|
652
|
+
If a field needs to be “some object, but not one this library owns”, make that explicit:
|
|
653
|
+
|
|
654
|
+
```javascript
|
|
655
|
+
const schema = createSchema({
|
|
656
|
+
metadata: {
|
|
657
|
+
type: 'object',
|
|
658
|
+
additionalProperties: true
|
|
659
|
+
}
|
|
660
|
+
})
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
That means:
|
|
664
|
+
|
|
665
|
+
* the value must be a plain object
|
|
666
|
+
* keys are not validated
|
|
667
|
+
* values pass through untouched
|
|
668
|
+
|
|
669
|
+
This is the intended escape hatch for metadata bags and adapter-owned payloads. It is deliberately narrow: `additionalProperties` only supports the literal value `true`. You can combine it with `schema` when you want to validate known child fields while still allowing arbitrary passthrough keys.
|
|
670
|
+
|
|
671
|
+
## Typed Object Maps
|
|
672
|
+
|
|
673
|
+
If you need "an object whose keys are dynamic, but whose values all follow one contract", use `values`:
|
|
674
|
+
|
|
675
|
+
```javascript
|
|
676
|
+
const schema = createSchema({
|
|
677
|
+
fieldErrors: {
|
|
678
|
+
type: 'object',
|
|
679
|
+
values: {
|
|
680
|
+
type: 'string',
|
|
681
|
+
minLength: 1
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
})
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
That means:
|
|
688
|
+
|
|
689
|
+
* the value must be a plain object
|
|
690
|
+
* keys remain dynamic
|
|
691
|
+
* every value is validated with the provided field definition
|
|
692
|
+
|
|
693
|
+
`values` can point to either:
|
|
694
|
+
|
|
695
|
+
* an inline field definition such as `{ type: 'string', minLength: 1 }`
|
|
696
|
+
* a child `Schema` instance when every dynamic value should itself be a structured object contract
|
|
697
|
+
|
|
698
|
+
When `values` points to a child object schema, each dynamic value is validated in `replace` mode for the same reason array object items are: each value is treated as a complete object at that key.
|
|
699
|
+
|
|
700
|
+
## Known Fields Plus Passthrough Extras
|
|
701
|
+
|
|
702
|
+
If you need an object with a few validated child fields but you still want to allow extra keys through unchanged, combine `schema` with `additionalProperties: true`:
|
|
703
|
+
|
|
704
|
+
```javascript
|
|
705
|
+
const detailsSchema = createSchema({
|
|
706
|
+
message: { type: 'string', required: true },
|
|
707
|
+
fieldErrors: {
|
|
708
|
+
type: 'object',
|
|
709
|
+
values: { type: 'string', minLength: 1 },
|
|
710
|
+
required: false
|
|
711
|
+
}
|
|
712
|
+
})
|
|
713
|
+
|
|
714
|
+
const schema = createSchema({
|
|
715
|
+
details: {
|
|
716
|
+
type: 'object',
|
|
717
|
+
schema: detailsSchema,
|
|
718
|
+
additionalProperties: true
|
|
719
|
+
}
|
|
720
|
+
})
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
That means:
|
|
724
|
+
|
|
725
|
+
* known child fields are validated and normalized by `detailsSchema`
|
|
726
|
+
* unknown child fields are preserved unchanged
|
|
727
|
+
* transport export becomes `properties` plus `additionalProperties: true`
|
|
728
|
+
|
|
729
|
+
Worked example:
|
|
730
|
+
|
|
731
|
+
```javascript
|
|
732
|
+
const metadataSchema = createSchema({
|
|
733
|
+
metadata: {
|
|
734
|
+
type: 'object',
|
|
735
|
+
additionalProperties: true
|
|
736
|
+
}
|
|
737
|
+
})
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
Valid input:
|
|
741
|
+
|
|
742
|
+
```javascript
|
|
743
|
+
metadataSchema.patch({
|
|
744
|
+
metadata: {
|
|
745
|
+
theme: 'dark',
|
|
746
|
+
flags: {
|
|
747
|
+
beta: true
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
})
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
Result:
|
|
754
|
+
|
|
755
|
+
```javascript
|
|
756
|
+
{
|
|
757
|
+
validatedObject: {
|
|
758
|
+
metadata: {
|
|
759
|
+
theme: 'dark',
|
|
760
|
+
flags: {
|
|
761
|
+
beta: true
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
},
|
|
765
|
+
errors: {}
|
|
766
|
+
}
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
Invalid input:
|
|
770
|
+
|
|
771
|
+
```javascript
|
|
772
|
+
metadataSchema.patch({
|
|
773
|
+
metadata: ['not-an-object']
|
|
774
|
+
})
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
Result:
|
|
778
|
+
|
|
779
|
+
```javascript
|
|
780
|
+
{
|
|
781
|
+
validatedObject: {
|
|
782
|
+
metadata: ['not-an-object']
|
|
783
|
+
},
|
|
784
|
+
errors: {
|
|
785
|
+
metadata: {
|
|
786
|
+
field: 'metadata',
|
|
787
|
+
code: 'TYPE_CAST_FAILED',
|
|
788
|
+
message: 'Value could not be cast to the required type.',
|
|
789
|
+
params: {}
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
That is the intended contract: object-ness is enforced, but the inner bag is not owned by this library.
|
|
796
|
+
|
|
797
|
+
### Dotted path options for nested fields
|
|
798
|
+
|
|
799
|
+
Because nested errors use dotted paths, the opt-out options do too.
|
|
800
|
+
|
|
801
|
+
Skip a whole nested field:
|
|
802
|
+
|
|
803
|
+
```javascript
|
|
804
|
+
workspaceViewSchema.patch({
|
|
805
|
+
workspace: {
|
|
806
|
+
slug: 'x'
|
|
807
|
+
}
|
|
808
|
+
}, {
|
|
809
|
+
skipFields: ['workspace.slug']
|
|
810
|
+
})
|
|
811
|
+
```
|
|
812
|
+
|
|
813
|
+
Skip a specific nested validator:
|
|
814
|
+
|
|
815
|
+
```javascript
|
|
816
|
+
workspaceViewSchema.patch({
|
|
817
|
+
workspace: {
|
|
818
|
+
slug: 'x'
|
|
819
|
+
}
|
|
820
|
+
}, {
|
|
821
|
+
skipParams: {
|
|
822
|
+
'workspace.slug': ['minLength']
|
|
823
|
+
}
|
|
824
|
+
})
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
This keeps the options model flat and consistent with the error map.
|
|
828
|
+
|
|
829
|
+
## Recursive Schemas
|
|
830
|
+
|
|
831
|
+
Recursive schema graphs are supported at runtime.
|
|
832
|
+
|
|
833
|
+
The important distinction is that the library follows the graph of `Schema` instances, not just one level of nesting. That means a field or array item can point back to the same schema instance, and the runtime will keep validating deeper paths using the same operation rules it would use for any non-recursive nested contract.
|
|
834
|
+
|
|
835
|
+
The practical setup rule is simple: self-references are usually wired after the first `createSchema(...)` call, because the variable must exist before another field can point at it.
|
|
836
|
+
|
|
837
|
+
### Self-recursive object and array example
|
|
838
|
+
|
|
839
|
+
```javascript
|
|
840
|
+
const nodeSchema = createSchema({
|
|
841
|
+
id: { type: 'string', required: true },
|
|
842
|
+
label: { type: 'string', required: true },
|
|
843
|
+
parent: { type: 'object', required: false },
|
|
844
|
+
children: { type: 'array', required: false }
|
|
845
|
+
})
|
|
846
|
+
|
|
847
|
+
nodeSchema.structure.parent.schema = nodeSchema
|
|
848
|
+
nodeSchema.structure.children.items = nodeSchema
|
|
849
|
+
```
|
|
850
|
+
|
|
851
|
+
That creates two different recursive edges:
|
|
852
|
+
|
|
853
|
+
* `parent` is a nested object field that points back to `nodeSchema`
|
|
854
|
+
* `children.items` is an array of `nodeSchema` objects
|
|
855
|
+
|
|
856
|
+
### Recursive runtime semantics
|
|
857
|
+
|
|
858
|
+
The same rules still apply inside the recursive graph:
|
|
859
|
+
|
|
860
|
+
* nested object fields such as `parent` inherit the active operation contract
|
|
861
|
+
* array items that are object schemas still use `replace` semantics
|
|
862
|
+
* recursive errors stay in the same flat dotted-path shape as any other nested error
|
|
863
|
+
|
|
864
|
+
Example:
|
|
865
|
+
|
|
866
|
+
```javascript
|
|
867
|
+
const patchParent = nodeSchema.patch({
|
|
868
|
+
parent: {
|
|
869
|
+
label: ' Root '
|
|
870
|
+
}
|
|
871
|
+
})
|
|
872
|
+
|
|
873
|
+
const patchChildren = nodeSchema.patch({
|
|
874
|
+
children: [
|
|
875
|
+
{ label: 'Only child label' }
|
|
876
|
+
]
|
|
877
|
+
})
|
|
878
|
+
```
|
|
879
|
+
|
|
880
|
+
`patchParent` succeeds with:
|
|
881
|
+
|
|
882
|
+
```javascript
|
|
883
|
+
{
|
|
884
|
+
validatedObject: {
|
|
885
|
+
parent: {
|
|
886
|
+
label: 'Root'
|
|
887
|
+
}
|
|
888
|
+
},
|
|
889
|
+
errors: {}
|
|
890
|
+
}
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
That happens because `parent` is a nested object field and inherits the outer `patch` operation.
|
|
894
|
+
|
|
895
|
+
`patchChildren` returns:
|
|
896
|
+
|
|
897
|
+
```javascript
|
|
898
|
+
{
|
|
899
|
+
validatedObject: {
|
|
900
|
+
children: [
|
|
901
|
+
{
|
|
902
|
+
label: 'Only child label'
|
|
903
|
+
}
|
|
904
|
+
]
|
|
905
|
+
},
|
|
906
|
+
errors: {
|
|
907
|
+
'children.0.id': {
|
|
908
|
+
field: 'children.0.id',
|
|
909
|
+
code: 'REQUIRED',
|
|
910
|
+
message: 'Field is required',
|
|
911
|
+
params: {}
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
```
|
|
916
|
+
|
|
917
|
+
That happens because array items that point to object schemas are always treated as full replacements.
|
|
918
|
+
|
|
919
|
+
### Recursive paths, introspection, and transport export
|
|
920
|
+
|
|
921
|
+
Recursive schemas keep the same dotted-path model everywhere else too:
|
|
922
|
+
|
|
923
|
+
* `nodeSchema.getFieldDefinition('children.0.label')` resolves correctly
|
|
924
|
+
* `nodeSchema.validateAt('children.0.label', payload)` validates only that selected path
|
|
925
|
+
* recursive transport export is graph-aware rather than stack-recursive
|
|
926
|
+
|
|
927
|
+
`toJsonSchema()` uses draft-07 `definitions` plus `$ref` for recursive nested contracts, and direct self-recursive object fields point back to `#`. The transport-specific details are covered again in the `Transport JSON Schema Export` chapter below.
|
|
928
|
+
|
|
929
|
+
## Path-Scoped Validation for Forms and Interactive UIs
|
|
930
|
+
|
|
931
|
+
Full-object validation is still the right tool for submit boundaries:
|
|
932
|
+
|
|
933
|
+
```javascript
|
|
934
|
+
const result = userSchema.create(payload)
|
|
935
|
+
```
|
|
936
|
+
|
|
937
|
+
But forms often need something narrower:
|
|
938
|
+
|
|
939
|
+
* validate one field on blur
|
|
940
|
+
* validate a small step in a wizard
|
|
941
|
+
* normalize only the field the user just touched
|
|
942
|
+
* avoid triggering unrelated sibling errors while the user is still editing
|
|
943
|
+
|
|
944
|
+
That is what `validateAt()` and `validatePaths()` are for.
|
|
945
|
+
|
|
946
|
+
### `validateAt(path, object, options)`
|
|
947
|
+
|
|
948
|
+
Use `validateAt()` when you want one path.
|
|
949
|
+
|
|
950
|
+
```javascript
|
|
951
|
+
const profileSchema = createSchema({
|
|
952
|
+
name: { type: 'string', required: true, minLength: 3 },
|
|
953
|
+
role: { type: 'string', defaultTo: 'guest' }
|
|
954
|
+
})
|
|
955
|
+
|
|
956
|
+
profileSchema.validateAt('name', {
|
|
957
|
+
name: ' Alex '
|
|
958
|
+
})
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
Result:
|
|
962
|
+
|
|
963
|
+
```javascript
|
|
964
|
+
{
|
|
965
|
+
validatedValue: 'Alex',
|
|
966
|
+
errors: {}
|
|
967
|
+
}
|
|
968
|
+
```
|
|
969
|
+
|
|
970
|
+
By default, path validation uses **`patch` semantics**. That means:
|
|
971
|
+
|
|
972
|
+
* only the selected path is validated
|
|
973
|
+
* missing required siblings do not produce errors
|
|
974
|
+
* defaults do not apply unless you explicitly choose an operation that applies them
|
|
975
|
+
|
|
976
|
+
If you want create-style or replace-style behavior for the exact selected path, pass `operation`.
|
|
977
|
+
|
|
978
|
+
```javascript
|
|
979
|
+
profileSchema.validateAt('role', {}, { operation: 'create' })
|
|
980
|
+
```
|
|
981
|
+
|
|
982
|
+
Result:
|
|
983
|
+
|
|
984
|
+
```javascript
|
|
985
|
+
{
|
|
986
|
+
validatedValue: 'guest',
|
|
987
|
+
errors: {}
|
|
988
|
+
}
|
|
989
|
+
```
|
|
990
|
+
|
|
991
|
+
If you want required checks for the exact selected field:
|
|
992
|
+
|
|
993
|
+
```javascript
|
|
994
|
+
profileSchema.validateAt('name', {}, { operation: 'create' })
|
|
995
|
+
```
|
|
996
|
+
|
|
997
|
+
Result:
|
|
998
|
+
|
|
999
|
+
```javascript
|
|
1000
|
+
{
|
|
1001
|
+
validatedValue: undefined,
|
|
1002
|
+
errors: {
|
|
1003
|
+
name: {
|
|
1004
|
+
field: 'name',
|
|
1005
|
+
code: 'REQUIRED',
|
|
1006
|
+
message: 'Field is required',
|
|
1007
|
+
params: {}
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
```
|
|
1012
|
+
|
|
1013
|
+
### Nested path example
|
|
1014
|
+
|
|
1015
|
+
This is where path-scoped validation becomes most useful.
|
|
1016
|
+
|
|
1017
|
+
```javascript
|
|
1018
|
+
const workspaceSummarySchema = createSchema({
|
|
1019
|
+
id: { type: 'id', required: true },
|
|
1020
|
+
slug: { type: 'string', required: true, minLength: 3 },
|
|
1021
|
+
ownerUserId: { type: 'id', required: true }
|
|
1022
|
+
})
|
|
1023
|
+
|
|
1024
|
+
const workspaceSchema = createSchema({
|
|
1025
|
+
workspace: {
|
|
1026
|
+
type: 'object',
|
|
1027
|
+
required: true,
|
|
1028
|
+
schema: workspaceSummarySchema
|
|
1029
|
+
}
|
|
1030
|
+
})
|
|
1031
|
+
```
|
|
1032
|
+
|
|
1033
|
+
Validate only `workspace.slug`:
|
|
1034
|
+
|
|
1035
|
+
```javascript
|
|
1036
|
+
workspaceSchema.validateAt('workspace.slug', {
|
|
1037
|
+
workspace: {
|
|
1038
|
+
slug: ' primary '
|
|
1039
|
+
}
|
|
1040
|
+
}, {
|
|
1041
|
+
operation: 'create'
|
|
1042
|
+
})
|
|
1043
|
+
```
|
|
1044
|
+
|
|
1045
|
+
Result:
|
|
1046
|
+
|
|
1047
|
+
```javascript
|
|
1048
|
+
{
|
|
1049
|
+
validatedValue: 'primary',
|
|
1050
|
+
errors: {}
|
|
1051
|
+
}
|
|
1052
|
+
```
|
|
1053
|
+
|
|
1054
|
+
Notice what did **not** happen:
|
|
1055
|
+
|
|
1056
|
+
* `workspace.id` was not required
|
|
1057
|
+
* `workspace.ownerUserId` was not required
|
|
1058
|
+
* unrelated nested keys were not validated
|
|
1059
|
+
|
|
1060
|
+
That is the point of the API. It validates the **selected path**, not the whole object.
|
|
1061
|
+
|
|
1062
|
+
If you select the whole object path instead:
|
|
1063
|
+
|
|
1064
|
+
```javascript
|
|
1065
|
+
workspaceSchema.validateAt('workspace', {
|
|
1066
|
+
workspace: {
|
|
1067
|
+
slug: ' primary '
|
|
1068
|
+
}
|
|
1069
|
+
}, {
|
|
1070
|
+
operation: 'create'
|
|
1071
|
+
})
|
|
1072
|
+
```
|
|
1073
|
+
|
|
1074
|
+
Result:
|
|
1075
|
+
|
|
1076
|
+
```javascript
|
|
1077
|
+
{
|
|
1078
|
+
validatedValue: {
|
|
1079
|
+
slug: 'primary'
|
|
1080
|
+
},
|
|
1081
|
+
errors: {
|
|
1082
|
+
'workspace.id': {
|
|
1083
|
+
field: 'workspace.id',
|
|
1084
|
+
code: 'REQUIRED',
|
|
1085
|
+
message: 'Field is required',
|
|
1086
|
+
params: {}
|
|
1087
|
+
},
|
|
1088
|
+
'workspace.ownerUserId': {
|
|
1089
|
+
field: 'workspace.ownerUserId',
|
|
1090
|
+
code: 'REQUIRED',
|
|
1091
|
+
message: 'Field is required',
|
|
1092
|
+
params: {}
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
That distinction is intentional:
|
|
1099
|
+
|
|
1100
|
+
* selecting `workspace.slug` validates one field
|
|
1101
|
+
* selecting `workspace` validates the whole nested object contract
|
|
1102
|
+
|
|
1103
|
+
### `validatePaths(paths, object, options)`
|
|
1104
|
+
|
|
1105
|
+
Use `validatePaths()` when you want a subset of fields or a whole form step.
|
|
1106
|
+
|
|
1107
|
+
```javascript
|
|
1108
|
+
const stepSchema = createSchema({
|
|
1109
|
+
workspace: {
|
|
1110
|
+
type: 'object',
|
|
1111
|
+
schema: workspaceSummarySchema
|
|
1112
|
+
},
|
|
1113
|
+
status: { type: 'string', defaultTo: 'draft' }
|
|
1114
|
+
})
|
|
1115
|
+
|
|
1116
|
+
stepSchema.validatePaths([
|
|
1117
|
+
'workspace.slug',
|
|
1118
|
+
'status'
|
|
1119
|
+
], {
|
|
1120
|
+
workspace: {
|
|
1121
|
+
slug: ' next '
|
|
1122
|
+
}
|
|
1123
|
+
}, {
|
|
1124
|
+
operation: 'create'
|
|
1125
|
+
})
|
|
1126
|
+
```
|
|
1127
|
+
|
|
1128
|
+
Result:
|
|
1129
|
+
|
|
1130
|
+
```javascript
|
|
1131
|
+
{
|
|
1132
|
+
validatedObject: {
|
|
1133
|
+
workspace: {
|
|
1134
|
+
slug: 'next'
|
|
1135
|
+
},
|
|
1136
|
+
status: 'draft'
|
|
1137
|
+
},
|
|
1138
|
+
errors: {}
|
|
1139
|
+
}
|
|
1140
|
+
```
|
|
1141
|
+
|
|
1142
|
+
This is useful for:
|
|
1143
|
+
|
|
1144
|
+
* wizard-step validation
|
|
1145
|
+
* validating only dirty fields
|
|
1146
|
+
* validating a form section before moving on
|
|
1147
|
+
|
|
1148
|
+
### Path options and compatibility
|
|
1149
|
+
|
|
1150
|
+
Path-scoped validation supports the same flat nested option model:
|
|
1151
|
+
|
|
1152
|
+
```javascript
|
|
1153
|
+
workspaceSchema.validatePaths([
|
|
1154
|
+
'workspace.slug'
|
|
1155
|
+
], {
|
|
1156
|
+
workspace: {
|
|
1157
|
+
slug: 'x'
|
|
1158
|
+
}
|
|
1159
|
+
}, {
|
|
1160
|
+
operation: 'patch',
|
|
1161
|
+
skipParams: {
|
|
1162
|
+
'workspace.slug': ['minLength']
|
|
1163
|
+
}
|
|
1164
|
+
})
|
|
1165
|
+
```
|
|
1166
|
+
|
|
1167
|
+
`mode` also works as compatibility sugar for the built-in operations:
|
|
1168
|
+
|
|
1169
|
+
```javascript
|
|
1170
|
+
workspaceSchema.validateAt('workspace.slug', values, { mode: 'patch' })
|
|
1171
|
+
```
|
|
1172
|
+
|
|
1173
|
+
### Form integration guidance
|
|
1174
|
+
|
|
1175
|
+
These APIs are meant to help form adapters, but the library still does **not** become a form framework.
|
|
1176
|
+
|
|
1177
|
+
Recommended approach:
|
|
1178
|
+
|
|
1179
|
+
* keep raw input state in the UI while the user is typing
|
|
1180
|
+
* use `validateAt()` or `validatePaths()` to compute errors and normalized values
|
|
1181
|
+
* apply full normalization on submit with `create()`, `replace()`, or `patch()`
|
|
1182
|
+
|
|
1183
|
+
That matters because aggressive normalization during typing can be annoying:
|
|
1184
|
+
|
|
1185
|
+
* trimming on every keypress can move the cursor
|
|
1186
|
+
* number coercion can fight half-finished input such as `12.`
|
|
1187
|
+
* nested defaults can appear before the user has actually submitted anything
|
|
1188
|
+
|
|
1189
|
+
So the intended split is:
|
|
1190
|
+
|
|
1191
|
+
* **interactive validation**: `validateAt()` / `validatePaths()`
|
|
1192
|
+
* **submit boundary validation**: `create()` / `replace()` / `patch()`
|
|
1193
|
+
|
|
1194
|
+
## React Hook Form Resolver
|
|
1195
|
+
|
|
1196
|
+
If you use React Hook Form, this package now ships a dedicated resolver adapter as a separate subpath export:
|
|
1197
|
+
|
|
1198
|
+
```javascript
|
|
1199
|
+
import { useForm } from 'react-hook-form'
|
|
1200
|
+
import { createSchema } from 'json-rest-schema'
|
|
1201
|
+
import { jsonRestSchemaResolver } from 'json-rest-schema/react-hook-form'
|
|
1202
|
+
```
|
|
1203
|
+
|
|
1204
|
+
That import path is intentional. The resolver lives outside the main schema engine so the core library does not become React-specific.
|
|
1205
|
+
|
|
1206
|
+
### Basic usage
|
|
1207
|
+
|
|
1208
|
+
```javascript
|
|
1209
|
+
const profileSchema = createSchema({
|
|
1210
|
+
name: { type: 'string', required: true, minLength: 3 },
|
|
1211
|
+
role: { type: 'string', defaultTo: 'guest' }
|
|
1212
|
+
})
|
|
1213
|
+
|
|
1214
|
+
const form = useForm({
|
|
1215
|
+
resolver: jsonRestSchemaResolver(profileSchema)
|
|
1216
|
+
})
|
|
1217
|
+
```
|
|
1218
|
+
|
|
1219
|
+
By default, the resolver uses **`create` semantics** for full-form validation.
|
|
1220
|
+
|
|
1221
|
+
That means:
|
|
1222
|
+
|
|
1223
|
+
* required fields are enforced
|
|
1224
|
+
* defaults are applied on successful full-form validation
|
|
1225
|
+
* the resolver itself returns normalized success values for full-form validation
|
|
1226
|
+
|
|
1227
|
+
So if the user submits:
|
|
1228
|
+
|
|
1229
|
+
```javascript
|
|
1230
|
+
{
|
|
1231
|
+
name: ' Alex '
|
|
1232
|
+
}
|
|
1233
|
+
```
|
|
1234
|
+
|
|
1235
|
+
the resolver will hand React Hook Form a successful value object equivalent to:
|
|
1236
|
+
|
|
1237
|
+
```javascript
|
|
1238
|
+
{
|
|
1239
|
+
name: 'Alex',
|
|
1240
|
+
role: 'guest'
|
|
1241
|
+
}
|
|
1242
|
+
```
|
|
1243
|
+
|
|
1244
|
+
One real-world nuance matters here: React Hook Form still owns its internal field
|
|
1245
|
+
state. In practice, that means a successful resolver pass does **not** always mean
|
|
1246
|
+
your submit handler receives a canonical normalized payload directly from RHF's state.
|
|
1247
|
+
|
|
1248
|
+
If you need a final REST-ready payload, run one last schema operation in the submit
|
|
1249
|
+
handler:
|
|
1250
|
+
|
|
1251
|
+
```javascript
|
|
1252
|
+
const form = useForm({
|
|
1253
|
+
resolver: jsonRestSchemaResolver(profileSchema)
|
|
1254
|
+
})
|
|
1255
|
+
|
|
1256
|
+
const onSubmit = rawValues => {
|
|
1257
|
+
const { validatedObject, errors } = profileSchema.create(rawValues)
|
|
1258
|
+
if (Object.keys(errors).length > 0) return
|
|
1259
|
+
|
|
1260
|
+
saveProfile(validatedObject)
|
|
1261
|
+
}
|
|
1262
|
+
```
|
|
1263
|
+
|
|
1264
|
+
That split is intentional:
|
|
1265
|
+
|
|
1266
|
+
* RHF keeps raw interactive field state
|
|
1267
|
+
* the schema owns final normalization at the submit boundary
|
|
1268
|
+
* the UI is free to avoid aggressive value rewriting while the user is typing
|
|
1269
|
+
|
|
1270
|
+
### Edit forms and custom operations
|
|
1271
|
+
|
|
1272
|
+
If the form is editing an existing resource, use a different operation explicitly.
|
|
1273
|
+
|
|
1274
|
+
For a patch-style form:
|
|
1275
|
+
|
|
1276
|
+
```javascript
|
|
1277
|
+
const form = useForm({
|
|
1278
|
+
resolver: jsonRestSchemaResolver(profileSchema, {
|
|
1279
|
+
operation: 'patch'
|
|
1280
|
+
})
|
|
1281
|
+
})
|
|
1282
|
+
```
|
|
1283
|
+
|
|
1284
|
+
You can also use any custom operation you have registered on the schema:
|
|
1285
|
+
|
|
1286
|
+
```javascript
|
|
1287
|
+
const form = useForm({
|
|
1288
|
+
resolver: jsonRestSchemaResolver(profileSchema, {
|
|
1289
|
+
operation: 'upsert'
|
|
1290
|
+
})
|
|
1291
|
+
})
|
|
1292
|
+
```
|
|
1293
|
+
|
|
1294
|
+
### Field-level re-validation behavior
|
|
1295
|
+
|
|
1296
|
+
React Hook Form re-validates one field at a time during user interaction. The resolver uses the core path APIs for that subset validation.
|
|
1297
|
+
|
|
1298
|
+
Important behavior:
|
|
1299
|
+
|
|
1300
|
+
* only the selected RHF field names are validated during field-level re-validation
|
|
1301
|
+
* sibling required fields do **not** leak into a single-field re-validation pass
|
|
1302
|
+
* by default, field-level re-validation keeps **raw form values** instead of forcing normalized values back into the UI while the user is typing
|
|
1303
|
+
|
|
1304
|
+
That default matters because aggressive normalization during typing can feel bad:
|
|
1305
|
+
|
|
1306
|
+
* trimmed strings can move the cursor
|
|
1307
|
+
* number coercion can fight half-complete input
|
|
1308
|
+
* defaults can appear before submit
|
|
1309
|
+
|
|
1310
|
+
### Opting into normalized field-level values
|
|
1311
|
+
|
|
1312
|
+
If you explicitly want normalized field values during field-level re-validation, opt in:
|
|
1313
|
+
|
|
1314
|
+
```javascript
|
|
1315
|
+
const form = useForm({
|
|
1316
|
+
resolver: jsonRestSchemaResolver(
|
|
1317
|
+
profileSchema,
|
|
1318
|
+
{},
|
|
1319
|
+
{ normalizeOnFieldValidation: true }
|
|
1320
|
+
)
|
|
1321
|
+
})
|
|
1322
|
+
```
|
|
1323
|
+
|
|
1324
|
+
This is opt-in on purpose.
|
|
1325
|
+
|
|
1326
|
+
### Returning raw values on success
|
|
1327
|
+
|
|
1328
|
+
If you want successful resolver results to return raw input values instead of normalized values, use `raw: true`:
|
|
1329
|
+
|
|
1330
|
+
```javascript
|
|
1331
|
+
const form = useForm({
|
|
1332
|
+
resolver: jsonRestSchemaResolver(
|
|
1333
|
+
profileSchema,
|
|
1334
|
+
{},
|
|
1335
|
+
{ raw: true }
|
|
1336
|
+
)
|
|
1337
|
+
})
|
|
1338
|
+
```
|
|
1339
|
+
|
|
1340
|
+
That applies to successful full-form validation too, so defaults and casts are not pushed into the returned `values` object.
|
|
1341
|
+
|
|
1342
|
+
### Error shape
|
|
1343
|
+
|
|
1344
|
+
React Hook Form requires hierarchical nested errors for deep paths. The resolver converts the library's flat dotted-path errors into the structure RHF expects.
|
|
1345
|
+
|
|
1346
|
+
For example, a schema error like:
|
|
1347
|
+
|
|
1348
|
+
```javascript
|
|
1349
|
+
{
|
|
1350
|
+
'roles.0.label': {
|
|
1351
|
+
field: 'roles.0.label',
|
|
1352
|
+
code: 'REQUIRED',
|
|
1353
|
+
message: 'Field is required',
|
|
1354
|
+
params: {}
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
```
|
|
1358
|
+
|
|
1359
|
+
becomes a React Hook Form error shape equivalent to:
|
|
1360
|
+
|
|
1361
|
+
```javascript
|
|
1362
|
+
{
|
|
1363
|
+
roles: [
|
|
1364
|
+
{
|
|
1365
|
+
label: {
|
|
1366
|
+
type: 'REQUIRED',
|
|
1367
|
+
message: 'Field is required'
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
]
|
|
1371
|
+
}
|
|
1372
|
+
```
|
|
1373
|
+
|
|
1374
|
+
Direct array-field errors are placed under RHF's `root` key for that field array path.
|
|
1375
|
+
|
|
1376
|
+
### Native browser validation
|
|
1377
|
+
|
|
1378
|
+
The resolver also respects React Hook Form's `shouldUseNativeValidation` option. If RHF asks for native validation, the adapter sets `setCustomValidity()` / `reportValidity()` using the schema error messages.
|
|
1379
|
+
|
|
1380
|
+
## Vue Form Adapter
|
|
1381
|
+
|
|
1382
|
+
If you use Vue, this package now ships a small adapter layer as a separate subpath export:
|
|
1383
|
+
|
|
1384
|
+
```javascript
|
|
1385
|
+
import { useSchemaForm, useSchemaField } from 'json-rest-schema/vue'
|
|
1386
|
+
```
|
|
1387
|
+
|
|
1388
|
+
That split is intentional.
|
|
1389
|
+
|
|
1390
|
+
* `json-rest-schema/vue` handles schema-aware form orchestration
|
|
1391
|
+
* the core schema engine stays framework-agnostic
|
|
1392
|
+
|
|
1393
|
+
Just as important: the adapter does **not** import Vue internally.
|
|
1394
|
+
|
|
1395
|
+
They work with:
|
|
1396
|
+
|
|
1397
|
+
* plain objects
|
|
1398
|
+
* Vue reactive proxies
|
|
1399
|
+
* Vue refs such as `ref({ ... })`
|
|
1400
|
+
|
|
1401
|
+
That keeps the published package small and avoids turning Vue into a hard dependency of the core runtime.
|
|
1402
|
+
|
|
1403
|
+
### Basic Vue usage
|
|
1404
|
+
|
|
1405
|
+
Use `useSchemaForm()` when you already own the form values in Vue state.
|
|
1406
|
+
|
|
1407
|
+
```javascript
|
|
1408
|
+
import { reactive } from 'vue'
|
|
1409
|
+
import { createSchema } from 'json-rest-schema'
|
|
1410
|
+
import { useSchemaForm } from 'json-rest-schema/vue'
|
|
1411
|
+
|
|
1412
|
+
const profileSchema = createSchema({
|
|
1413
|
+
name: { type: 'string', required: true, minLength: 3 },
|
|
1414
|
+
role: { type: 'string', defaultTo: 'guest' }
|
|
1415
|
+
})
|
|
1416
|
+
|
|
1417
|
+
const values = reactive({
|
|
1418
|
+
name: ''
|
|
1419
|
+
})
|
|
1420
|
+
|
|
1421
|
+
const form = useSchemaForm(profileSchema, {
|
|
1422
|
+
values
|
|
1423
|
+
})
|
|
1424
|
+
```
|
|
1425
|
+
|
|
1426
|
+
If you want Vue to react to adapter-managed error or result updates, pass Vue-owned
|
|
1427
|
+
containers such as `ref({})`, `reactive({})`, or `ref(null)`:
|
|
1428
|
+
|
|
1429
|
+
```javascript
|
|
1430
|
+
import { reactive, ref } from 'vue'
|
|
1431
|
+
|
|
1432
|
+
const values = reactive({
|
|
1433
|
+
name: ''
|
|
1434
|
+
})
|
|
1435
|
+
|
|
1436
|
+
const errors = ref({})
|
|
1437
|
+
const lastResult = ref(null)
|
|
1438
|
+
|
|
1439
|
+
const form = useSchemaForm(profileSchema, {
|
|
1440
|
+
values,
|
|
1441
|
+
errors,
|
|
1442
|
+
lastResult
|
|
1443
|
+
})
|
|
1444
|
+
```
|
|
1445
|
+
|
|
1446
|
+
That keeps reactivity in the Vue app instead of hiding framework state inside the schema library.
|
|
1447
|
+
|
|
1448
|
+
Important behavior:
|
|
1449
|
+
|
|
1450
|
+
* full-form validation defaults to **`create`** semantics
|
|
1451
|
+
* `form.validate()` returns the usual `{ validatedObject, errors }`
|
|
1452
|
+
* `form.errors` stays in the library's flat dotted-path format
|
|
1453
|
+
* `form.nestedErrors` gives you the nested object/array form if your Vue layer prefers it
|
|
1454
|
+
|
|
1455
|
+
Running a full validation:
|
|
1456
|
+
|
|
1457
|
+
```javascript
|
|
1458
|
+
const result = form.validate()
|
|
1459
|
+
```
|
|
1460
|
+
|
|
1461
|
+
If `values` is:
|
|
1462
|
+
|
|
1463
|
+
```javascript
|
|
1464
|
+
{
|
|
1465
|
+
name: ' Alex '
|
|
1466
|
+
}
|
|
1467
|
+
```
|
|
1468
|
+
|
|
1469
|
+
then `result` will be:
|
|
1470
|
+
|
|
1471
|
+
```javascript
|
|
1472
|
+
{
|
|
1473
|
+
validatedObject: {
|
|
1474
|
+
name: 'Alex',
|
|
1475
|
+
role: 'guest'
|
|
1476
|
+
},
|
|
1477
|
+
errors: {}
|
|
1478
|
+
}
|
|
1479
|
+
```
|
|
1480
|
+
|
|
1481
|
+
That is the same contract as the core schema engine. The Vue adapter does not invent a second validation format.
|
|
1482
|
+
|
|
1483
|
+
### Field-level validation in Vue
|
|
1484
|
+
|
|
1485
|
+
For blur validation, wizard steps, or one-field re-validation, use the path-aware helpers.
|
|
1486
|
+
|
|
1487
|
+
```javascript
|
|
1488
|
+
const fieldResult = form.validateField('name')
|
|
1489
|
+
const stepResult = form.validateFields(['name', 'role'])
|
|
1490
|
+
```
|
|
1491
|
+
|
|
1492
|
+
This matters because the adapter validates **only the selected paths**.
|
|
1493
|
+
|
|
1494
|
+
That means:
|
|
1495
|
+
|
|
1496
|
+
* validating `name` does not suddenly produce `email` or `password` errors
|
|
1497
|
+
* nested paths such as `workspace.slug` work the same way as they do in the core APIs
|
|
1498
|
+
* bracket paths such as `roles[0].label` are accepted too
|
|
1499
|
+
|
|
1500
|
+
If you want a path-focused helper object, use `useSchemaField()`:
|
|
1501
|
+
|
|
1502
|
+
```javascript
|
|
1503
|
+
const nameField = useSchemaField(form, 'name')
|
|
1504
|
+
```
|
|
1505
|
+
|
|
1506
|
+
It gives you:
|
|
1507
|
+
|
|
1508
|
+
* `nameField.value`
|
|
1509
|
+
* `nameField.error`
|
|
1510
|
+
* `nameField.hasError`
|
|
1511
|
+
* `nameField.message`
|
|
1512
|
+
* `nameField.messages`
|
|
1513
|
+
* `nameField.validate()`
|
|
1514
|
+
* `nameField.clearError()`
|
|
1515
|
+
|
|
1516
|
+
Example:
|
|
1517
|
+
|
|
1518
|
+
```javascript
|
|
1519
|
+
nameField.validate()
|
|
1520
|
+
console.log(nameField.messages)
|
|
1521
|
+
```
|
|
1522
|
+
|
|
1523
|
+
### Submit normalization in Vue
|
|
1524
|
+
|
|
1525
|
+
The clean submit path is:
|
|
1526
|
+
|
|
1527
|
+
```javascript
|
|
1528
|
+
const submitProfile = form.submit((validatedObject) => {
|
|
1529
|
+
return api.saveProfile(validatedObject)
|
|
1530
|
+
})
|
|
1531
|
+
```
|
|
1532
|
+
|
|
1533
|
+
`submit()` always validates first.
|
|
1534
|
+
|
|
1535
|
+
If validation fails:
|
|
1536
|
+
|
|
1537
|
+
* the handler is **not** called
|
|
1538
|
+
* the returned value is the validation result
|
|
1539
|
+
* `form.errors` is updated
|
|
1540
|
+
|
|
1541
|
+
If validation succeeds:
|
|
1542
|
+
|
|
1543
|
+
* the handler receives the normalized `validatedObject`
|
|
1544
|
+
* defaults and casts are already applied
|
|
1545
|
+
|
|
1546
|
+
This keeps the same intended split as the rest of the library:
|
|
1547
|
+
|
|
1548
|
+
* raw values while the user is typing
|
|
1549
|
+
* normalized values at the submit boundary
|
|
1550
|
+
|
|
1551
|
+
### Edit forms and custom operations in Vue
|
|
1552
|
+
|
|
1553
|
+
If the form is editing an existing resource, choose a different operation explicitly:
|
|
1554
|
+
|
|
1555
|
+
```javascript
|
|
1556
|
+
const form = useSchemaForm(profileSchema, {
|
|
1557
|
+
values,
|
|
1558
|
+
operation: 'patch'
|
|
1559
|
+
})
|
|
1560
|
+
```
|
|
1561
|
+
|
|
1562
|
+
You can also use a custom schema operation:
|
|
1563
|
+
|
|
1564
|
+
```javascript
|
|
1565
|
+
const form = useSchemaForm(profileSchema, {
|
|
1566
|
+
values,
|
|
1567
|
+
operation: 'upsert'
|
|
1568
|
+
})
|
|
1569
|
+
```
|
|
1570
|
+
|
|
1571
|
+
The adapter routes everything back through the schema operation registry, so custom operations behave the same way here as they do in the core runtime.
|
|
1572
|
+
|
|
1573
|
+
If you render those forms with Vuetify, use the separate bridge below. It stays thin on purpose and translates the Vue adapter's existing validation results into Vuetify-friendly props and rule callbacks.
|
|
1574
|
+
|
|
1575
|
+
## Vuetify Bridge
|
|
1576
|
+
|
|
1577
|
+
If you use Vuetify on top of the Vue adapter, import the bridge from its own subpath:
|
|
1578
|
+
|
|
1579
|
+
```javascript
|
|
1580
|
+
import { createVuetifyRule, fieldProps, getVuetifyErrorMessages } from 'json-rest-schema/vuetify'
|
|
1581
|
+
```
|
|
1582
|
+
|
|
1583
|
+
This split is intentional:
|
|
1584
|
+
|
|
1585
|
+
* `json-rest-schema/vue` owns schema-aware form orchestration
|
|
1586
|
+
* `json-rest-schema/vuetify` translates those results into Vuetify `rules` and `error-messages`
|
|
1587
|
+
* the validation rules still live in the schema layer, not in component glue code
|
|
1588
|
+
|
|
1589
|
+
### Vuetify `rules` integration
|
|
1590
|
+
|
|
1591
|
+
Vuetify's `rules` prop is a natural fit for path-scoped validation.
|
|
1592
|
+
|
|
1593
|
+
```javascript
|
|
1594
|
+
const slugRule = createVuetifyRule(form, 'workspace.slug')
|
|
1595
|
+
```
|
|
1596
|
+
|
|
1597
|
+
Then bind it to a component:
|
|
1598
|
+
|
|
1599
|
+
```vue
|
|
1600
|
+
<v-text-field
|
|
1601
|
+
v-model="values.workspace.slug"
|
|
1602
|
+
:rules="[slugRule]"
|
|
1603
|
+
/>
|
|
1604
|
+
```
|
|
1605
|
+
|
|
1606
|
+
That rule:
|
|
1607
|
+
|
|
1608
|
+
* clones the current form values
|
|
1609
|
+
* injects the field's current candidate value at the selected path
|
|
1610
|
+
* runs `validateField(path, ...)`
|
|
1611
|
+
* returns either `true` or the schema error message
|
|
1612
|
+
|
|
1613
|
+
So the rule stays a thin bridge. It does not re-implement validation logic.
|
|
1614
|
+
|
|
1615
|
+
### Vuetify `fieldProps()` helper
|
|
1616
|
+
|
|
1617
|
+
If you want a compact helper for Vuetify inputs, use `fieldProps()`:
|
|
1618
|
+
|
|
1619
|
+
```javascript
|
|
1620
|
+
const slugProps = fieldProps(form, 'workspace.slug')
|
|
1621
|
+
```
|
|
1622
|
+
|
|
1623
|
+
Then:
|
|
1624
|
+
|
|
1625
|
+
```vue
|
|
1626
|
+
<v-text-field
|
|
1627
|
+
v-model="values.workspace.slug"
|
|
1628
|
+
v-bind="slugProps"
|
|
1629
|
+
/>
|
|
1630
|
+
```
|
|
1631
|
+
|
|
1632
|
+
By default, `fieldProps()` returns only a `rules` array.
|
|
1633
|
+
|
|
1634
|
+
That default is deliberate. Vuetify merges `error-messages` with rule-generated messages, so returning both by default would duplicate the same message on screen.
|
|
1635
|
+
|
|
1636
|
+
If you explicitly want manual `error-messages` too, opt in:
|
|
1637
|
+
|
|
1638
|
+
```javascript
|
|
1639
|
+
const slugProps = fieldProps(form, 'workspace.slug', {
|
|
1640
|
+
includeErrorMessages: true
|
|
1641
|
+
})
|
|
1642
|
+
```
|
|
1643
|
+
|
|
1644
|
+
That adds:
|
|
1645
|
+
|
|
1646
|
+
* `errorMessages`
|
|
1647
|
+
* `error`
|
|
1648
|
+
|
|
1649
|
+
on top of the generated `rules`.
|
|
1650
|
+
|
|
1651
|
+
### Manual Vuetify error messages
|
|
1652
|
+
|
|
1653
|
+
If you only want the message bridge without generated rules, use `getVuetifyErrorMessages()` directly:
|
|
1654
|
+
|
|
1655
|
+
```javascript
|
|
1656
|
+
const messages = getVuetifyErrorMessages(form, 'workspace.slug')
|
|
1657
|
+
```
|
|
1658
|
+
|
|
1659
|
+
Then:
|
|
1660
|
+
|
|
1661
|
+
```vue
|
|
1662
|
+
<v-text-field
|
|
1663
|
+
v-model="values.workspace.slug"
|
|
1664
|
+
:error-messages="getVuetifyErrorMessages(form, 'workspace.slug')"
|
|
1665
|
+
/>
|
|
1666
|
+
```
|
|
1667
|
+
|
|
1668
|
+
This is useful when:
|
|
1669
|
+
|
|
1670
|
+
* you validate on submit instead of on blur/input
|
|
1671
|
+
* you already ran `form.validate()` or `form.validateField()`
|
|
1672
|
+
* you want Vuetify to display stored schema errors without re-running rules immediately
|
|
1673
|
+
|
|
1674
|
+
### Worked Vue + Vuetify example
|
|
1675
|
+
|
|
1676
|
+
```javascript
|
|
1677
|
+
import { reactive } from 'vue'
|
|
1678
|
+
import { createSchema } from 'json-rest-schema'
|
|
1679
|
+
import { useSchemaForm, useSchemaField } from 'json-rest-schema/vue'
|
|
1680
|
+
import { fieldProps } from 'json-rest-schema/vuetify'
|
|
1681
|
+
|
|
1682
|
+
const workspaceSummarySchema = createSchema({
|
|
1683
|
+
id: { type: 'id', required: true },
|
|
1684
|
+
slug: { type: 'string', required: true, minLength: 3 },
|
|
1685
|
+
ownerUserId: { type: 'id', required: true }
|
|
1686
|
+
})
|
|
1687
|
+
|
|
1688
|
+
const workspaceSchema = createSchema({
|
|
1689
|
+
workspace: {
|
|
1690
|
+
type: 'object',
|
|
1691
|
+
required: true,
|
|
1692
|
+
schema: workspaceSummarySchema
|
|
1693
|
+
}
|
|
1694
|
+
})
|
|
1695
|
+
|
|
1696
|
+
const values = reactive({
|
|
1697
|
+
workspace: {
|
|
1698
|
+
slug: ''
|
|
1699
|
+
}
|
|
1700
|
+
})
|
|
1701
|
+
|
|
1702
|
+
const form = useSchemaForm(workspaceSchema, {
|
|
1703
|
+
values,
|
|
1704
|
+
operation: 'patch'
|
|
1705
|
+
})
|
|
1706
|
+
|
|
1707
|
+
const slugField = useSchemaField(form, 'workspace.slug')
|
|
1708
|
+
const slugProps = fieldProps(form, 'workspace.slug')
|
|
1709
|
+
|
|
1710
|
+
const saveWorkspace = form.submit(async (validatedObject) => {
|
|
1711
|
+
await api.saveWorkspace(validatedObject)
|
|
1712
|
+
})
|
|
1713
|
+
```
|
|
1714
|
+
|
|
1715
|
+
```vue
|
|
1716
|
+
<template>
|
|
1717
|
+
<v-form @submit.prevent="saveWorkspace">
|
|
1718
|
+
<v-text-field
|
|
1719
|
+
v-model="values.workspace.slug"
|
|
1720
|
+
label="Workspace slug"
|
|
1721
|
+
v-bind="slugProps"
|
|
1722
|
+
@blur="slugField.validate()"
|
|
1723
|
+
/>
|
|
1724
|
+
|
|
1725
|
+
<v-btn type="submit">Save</v-btn>
|
|
1726
|
+
</v-form>
|
|
1727
|
+
</template>
|
|
1728
|
+
```
|
|
1729
|
+
|
|
1730
|
+
That example preserves the intended layering:
|
|
1731
|
+
|
|
1732
|
+
* the schema owns normalization and validation
|
|
1733
|
+
* Vue owns local form state
|
|
1734
|
+
* Vuetify owns rendering and input UX
|
|
1735
|
+
* submit handlers own business logic and API calls
|
|
1736
|
+
|
|
1737
|
+
## Demo Apps and Browser Smoke Tests
|
|
1738
|
+
|
|
1739
|
+
This repo now includes two minimal demo apps documented in `demos/README.md`:
|
|
1740
|
+
|
|
1741
|
+
* `demos/react-rhf`
|
|
1742
|
+
* `demos/vue-vuetify`
|
|
1743
|
+
|
|
1744
|
+
They alias package imports back to the local source files in this checkout, so they
|
|
1745
|
+
always exercise the current repo state instead of a published npm copy.
|
|
1746
|
+
|
|
1747
|
+
What each demo proves:
|
|
1748
|
+
|
|
1749
|
+
* `demos/react-rhf`: the React Hook Form resolver works in a real browser app, and the submit flow can still perform one final canonical schema pass before handing the payload to your API layer.
|
|
1750
|
+
* `demos/vue-vuetify`: the Vue and Vuetify adapters work in a real browser app, including visible Vuetify controls, blur validation, and normalized submit output.
|
|
1751
|
+
|
|
1752
|
+
To install and run them:
|
|
1753
|
+
|
|
1754
|
+
```bash
|
|
1755
|
+
npm run demo:install
|
|
1756
|
+
```
|
|
1757
|
+
|
|
1758
|
+
Then in separate terminals:
|
|
1759
|
+
|
|
1760
|
+
```bash
|
|
1761
|
+
npm run demo:react
|
|
1762
|
+
npm run demo:vue
|
|
1763
|
+
```
|
|
1764
|
+
|
|
1765
|
+
Vite will print the local URLs it chose. If the default port is busy, it will pick the next open one automatically.
|
|
1766
|
+
|
|
1767
|
+
To run the browser smoke tests:
|
|
1768
|
+
|
|
1769
|
+
```bash
|
|
1770
|
+
npx playwright install chromium
|
|
1771
|
+
npm run test:demos
|
|
1772
|
+
```
|
|
1773
|
+
|
|
1774
|
+
The Playwright coverage is intentionally small and concrete:
|
|
1775
|
+
|
|
1776
|
+
* the React demo validates through the RHF resolver and performs one final canonical schema submit
|
|
1777
|
+
* the Vue demo validates through the Vue and Vuetify adapters and submits a normalized payload in a real browser runtime
|
|
1778
|
+
|
|
1779
|
+
Small troubleshooting notes:
|
|
1780
|
+
|
|
1781
|
+
* If a Vuetify control appears blank, make sure you ran the Vue demo's local install step. The demo now declares and imports the Material Design icon font explicitly.
|
|
1782
|
+
* If Playwright complains about missing browsers, run `npx playwright install chromium` once from the repo root.
|
|
1783
|
+
|
|
1784
|
+
## VeeValidate v5 Bridge
|
|
1785
|
+
|
|
1786
|
+
VeeValidate v5 accepts Standard Schema-compatible validators as `validationSchema`.
|
|
1787
|
+
|
|
1788
|
+
That means `json-rest-schema` does not need a heavy VeeValidate-specific runtime adapter. This package now ships a small bridge that wraps a schema instance in the Standard Schema interface VeeValidate already understands.
|
|
1789
|
+
|
|
1790
|
+
Import it like this:
|
|
1791
|
+
|
|
1792
|
+
```javascript
|
|
1793
|
+
import { useForm } from 'vee-validate'
|
|
1794
|
+
import { createSchema } from 'json-rest-schema'
|
|
1795
|
+
import { toVeeValidateSchema } from 'json-rest-schema/vee-validate'
|
|
1796
|
+
```
|
|
1797
|
+
|
|
1798
|
+
### Basic usage
|
|
1799
|
+
|
|
1800
|
+
```javascript
|
|
1801
|
+
const profileSchema = createSchema({
|
|
1802
|
+
name: { type: 'string', required: true, minLength: 3 },
|
|
1803
|
+
role: { type: 'string', defaultTo: 'guest' }
|
|
1804
|
+
})
|
|
1805
|
+
|
|
1806
|
+
const { handleSubmit, errors, values } = useForm({
|
|
1807
|
+
initialValues: {
|
|
1808
|
+
name: ''
|
|
1809
|
+
},
|
|
1810
|
+
validationSchema: toVeeValidateSchema(profileSchema)
|
|
1811
|
+
})
|
|
1812
|
+
```
|
|
1813
|
+
|
|
1814
|
+
That default bridge uses **`create` semantics**.
|
|
1815
|
+
|
|
1816
|
+
So on successful submit:
|
|
1817
|
+
|
|
1818
|
+
* required fields are enforced
|
|
1819
|
+
* normalized values are returned
|
|
1820
|
+
* defaults are applied to the submitted output
|
|
1821
|
+
|
|
1822
|
+
If the user submits:
|
|
1823
|
+
|
|
1824
|
+
```javascript
|
|
1825
|
+
{
|
|
1826
|
+
name: ' Alex '
|
|
1827
|
+
}
|
|
1828
|
+
```
|
|
1829
|
+
|
|
1830
|
+
then the validated submit payload is equivalent to:
|
|
1831
|
+
|
|
1832
|
+
```javascript
|
|
1833
|
+
{
|
|
1834
|
+
name: 'Alex',
|
|
1835
|
+
role: 'guest'
|
|
1836
|
+
}
|
|
1837
|
+
```
|
|
1838
|
+
|
|
1839
|
+
### Edit forms and custom operations
|
|
1840
|
+
|
|
1841
|
+
If the form is editing an existing resource, pass the operation explicitly:
|
|
1842
|
+
|
|
1843
|
+
```javascript
|
|
1844
|
+
const { handleSubmit } = useForm({
|
|
1845
|
+
initialValues,
|
|
1846
|
+
validationSchema: toVeeValidateSchema(profileSchema, {
|
|
1847
|
+
operation: 'patch'
|
|
1848
|
+
})
|
|
1849
|
+
})
|
|
1850
|
+
```
|
|
1851
|
+
|
|
1852
|
+
Custom operations work too:
|
|
1853
|
+
|
|
1854
|
+
```javascript
|
|
1855
|
+
const { handleSubmit } = useForm({
|
|
1856
|
+
initialValues,
|
|
1857
|
+
validationSchema: toVeeValidateSchema(profileSchema, {
|
|
1858
|
+
operation: 'upsert'
|
|
1859
|
+
})
|
|
1860
|
+
})
|
|
1861
|
+
```
|
|
1862
|
+
|
|
1863
|
+
### Important VeeValidate limitation: defaults do not initialize form state
|
|
1864
|
+
|
|
1865
|
+
This is important enough to say clearly:
|
|
1866
|
+
|
|
1867
|
+
* the bridge validates and normalizes the schema output
|
|
1868
|
+
* VeeValidate still expects you to provide your own `initialValues`
|
|
1869
|
+
* schema defaults do **not** automatically populate the form's starting state
|
|
1870
|
+
|
|
1871
|
+
So this is the intended split:
|
|
1872
|
+
|
|
1873
|
+
* `initialValues` controls the raw form state
|
|
1874
|
+
* `toVeeValidateSchema(...)` controls validation and normalized submit output
|
|
1875
|
+
|
|
1876
|
+
If you want a default field visible in the UI before submit, put it in `initialValues`.
|
|
1877
|
+
|
|
1878
|
+
If you only want the normalized payload to contain the default when the user submits, let the schema apply it.
|
|
1879
|
+
|
|
1880
|
+
### Error paths
|
|
1881
|
+
|
|
1882
|
+
The bridge turns the library's flat error map into Standard Schema issues with nested paths.
|
|
1883
|
+
|
|
1884
|
+
So an internal error like:
|
|
1885
|
+
|
|
1886
|
+
```javascript
|
|
1887
|
+
{
|
|
1888
|
+
'roles.0.label': {
|
|
1889
|
+
field: 'roles.0.label',
|
|
1890
|
+
code: 'REQUIRED',
|
|
1891
|
+
message: 'Field is required',
|
|
1892
|
+
params: {}
|
|
1893
|
+
}
|
|
1894
|
+
}
|
|
1895
|
+
```
|
|
1896
|
+
|
|
1897
|
+
becomes Standard Schema issues equivalent to:
|
|
1898
|
+
|
|
1899
|
+
```javascript
|
|
1900
|
+
[
|
|
1901
|
+
{
|
|
1902
|
+
message: 'Field is required',
|
|
1903
|
+
path: ['roles', 0, 'label']
|
|
1904
|
+
}
|
|
1905
|
+
]
|
|
1906
|
+
```
|
|
1907
|
+
|
|
1908
|
+
That is what lets VeeValidate map nested array/object errors back onto the right field state.
|
|
1909
|
+
|
|
1910
|
+
### Worked VeeValidate example
|
|
1911
|
+
|
|
1912
|
+
```javascript
|
|
1913
|
+
import { useForm } from 'vee-validate'
|
|
1914
|
+
import { createSchema } from 'json-rest-schema'
|
|
1915
|
+
import { toVeeValidateSchema } from 'json-rest-schema/vee-validate'
|
|
1916
|
+
|
|
1917
|
+
const workspaceSummarySchema = createSchema({
|
|
1918
|
+
id: { type: 'id', required: true },
|
|
1919
|
+
slug: { type: 'string', required: true, minLength: 3 },
|
|
1920
|
+
ownerUserId: { type: 'id', required: true }
|
|
1921
|
+
})
|
|
1922
|
+
|
|
1923
|
+
const workspaceSchema = createSchema({
|
|
1924
|
+
workspace: {
|
|
1925
|
+
type: 'object',
|
|
1926
|
+
required: true,
|
|
1927
|
+
schema: workspaceSummarySchema
|
|
1928
|
+
}
|
|
1929
|
+
})
|
|
1930
|
+
|
|
1931
|
+
const { defineField, handleSubmit, errors } = useForm({
|
|
1932
|
+
initialValues: {
|
|
1933
|
+
workspace: {
|
|
1934
|
+
slug: ''
|
|
1935
|
+
}
|
|
1936
|
+
},
|
|
1937
|
+
validationSchema: toVeeValidateSchema(workspaceSchema, {
|
|
1938
|
+
operation: 'patch'
|
|
1939
|
+
})
|
|
1940
|
+
})
|
|
1941
|
+
|
|
1942
|
+
const [slug, slugAttrs] = defineField('workspace.slug')
|
|
1943
|
+
|
|
1944
|
+
const saveWorkspace = handleSubmit((validatedObject) => {
|
|
1945
|
+
return api.saveWorkspace(validatedObject)
|
|
1946
|
+
})
|
|
1947
|
+
```
|
|
1948
|
+
|
|
1949
|
+
```vue
|
|
1950
|
+
<template>
|
|
1951
|
+
<form @submit.prevent="saveWorkspace">
|
|
1952
|
+
<input v-model="slug" v-bind="slugAttrs">
|
|
1953
|
+
<span>{{ errors['workspace.slug'] }}</span>
|
|
1954
|
+
<button type="submit">Save</button>
|
|
1955
|
+
</form>
|
|
1956
|
+
</template>
|
|
1957
|
+
```
|
|
1958
|
+
|
|
1959
|
+
This keeps the responsibilities clean:
|
|
1960
|
+
|
|
1961
|
+
* VeeValidate owns touched/dirty/submit orchestration
|
|
1962
|
+
* `json-rest-schema` owns validation and normalization
|
|
1963
|
+
* your submit handler owns business logic
|
|
1964
|
+
|
|
1965
|
+
## Transport JSON Schema Export
|
|
1966
|
+
|
|
1967
|
+
`json-rest-schema` can also export a transport-facing JSON Schema document for adapters that want pre-handler validation.
|
|
1968
|
+
|
|
1969
|
+
```javascript
|
|
1970
|
+
const userSchema = createSchema({
|
|
1971
|
+
id: { type: 'id', required: true },
|
|
1972
|
+
email: { type: 'string', required: true },
|
|
1973
|
+
age: { type: 'number', min: 18, defaultTo: 18 },
|
|
1974
|
+
status: { type: 'string', enum: ['draft', 'published'] }
|
|
1975
|
+
})
|
|
1976
|
+
|
|
1977
|
+
const createTransportSchema = userSchema.toJsonSchema()
|
|
1978
|
+
const patchTransportSchema = userSchema.toJsonSchema({ operation: 'patch' })
|
|
1979
|
+
```
|
|
1980
|
+
|
|
1981
|
+
Key points:
|
|
1982
|
+
|
|
1983
|
+
* **Draft**: exports draft-07 JSON Schema.
|
|
1984
|
+
* **Operation-aware**: `operation: '<name>'` controls the `required` list and whether `defaultTo` is emitted.
|
|
1985
|
+
* **Compatibility**: `mode: 'create' | 'replace' | 'patch'` still works as shorthand for the built-in operations.
|
|
1986
|
+
* **Transport-facing**: the export is intended for JSON/Ajv/Fastify-style request validation, not for reproducing every in-process coercion path.
|
|
1987
|
+
* **Strict field shape**: `additionalProperties` defaults to `false` because runtime validation rejects unknown fields. Override it with `toJsonSchema({ additionalProperties: true })` if needed.
|
|
1988
|
+
* **Nested export**: schema-backed nested object contracts are hoisted into draft-07 `definitions` and referenced with `$ref`, so repeated and recursive graphs stay finite. Nested object fields inherit the active operation, while object schemas used as array items or object-map values are exported in `replace` mode.
|
|
1989
|
+
* **Recursive graph support**: runtime validation and `toJsonSchema()` both support self-recursive schema graphs. Direct self-recursive object fields point back to `#`, while recursive nested contracts are emitted through `definitions`.
|
|
1990
|
+
* **Opaque bags stay opaque**: `type: 'object'` plus `additionalProperties: true` exports as a permissive object field and does not invent child property rules.
|
|
1991
|
+
* **Single source of truth**: only rules owned by `json-rest-schema` are exported. External metadata keys from other layers are ignored.
|
|
1992
|
+
* **Passive metadata preserved**: schema-owned passive metadata such as `precision`, `scale`, `unsigned`, and `temporalPrecision` is preserved under `x-json-rest-schema.metadata`.
|
|
1993
|
+
* **Custom rules**: if a custom type or validator needs transport export support, attach a `toJsonSchema()` hook to the handler. If you register a custom validator without that hook, export fails loudly instead of silently drifting.
|
|
1994
|
+
|
|
1995
|
+
### Worked nested export example
|
|
1996
|
+
|
|
1997
|
+
```javascript
|
|
1998
|
+
const schema = createSchema({
|
|
1999
|
+
workspace: {
|
|
2000
|
+
type: 'object',
|
|
2001
|
+
required: true,
|
|
2002
|
+
schema: workspaceSummarySchema
|
|
2003
|
+
},
|
|
2004
|
+
roles: {
|
|
2005
|
+
type: 'array',
|
|
2006
|
+
items: roleSchema
|
|
2007
|
+
},
|
|
2008
|
+
metadata: {
|
|
2009
|
+
type: 'object',
|
|
2010
|
+
additionalProperties: true
|
|
2011
|
+
}
|
|
2012
|
+
})
|
|
2013
|
+
```
|
|
2014
|
+
|
|
2015
|
+
Exporting `schema.toJsonSchema()` gives you:
|
|
2016
|
+
|
|
2017
|
+
* `workspace` as a `$ref` to a definition whose `required` fields still inherit the active operation
|
|
2018
|
+
* `roles.items` as a `$ref` to a nested object definition exported in `replace` mode
|
|
2019
|
+
* `metadata` as `{ type: 'object', additionalProperties: true }`
|
|
2020
|
+
* object maps as `{ type: 'object', additionalProperties: <value schema> }`
|
|
2021
|
+
* passthrough nested objects as validated `properties` plus `additionalProperties: true`
|
|
2022
|
+
|
|
2023
|
+
That means the transport export stays aligned with runtime semantics:
|
|
2024
|
+
|
|
2025
|
+
* nested objects behave like nested contracts even when the runtime schema graph is recursive
|
|
2026
|
+
* array object items behave like complete replacements
|
|
2027
|
+
* opaque bags stay opaque instead of pretending to be structured
|
|
2028
|
+
|
|
2029
|
+
### Worked recursive export example
|
|
2030
|
+
|
|
2031
|
+
Using the same recursive `nodeSchema` from the `Recursive Schemas` chapter above:
|
|
2032
|
+
|
|
2033
|
+
```javascript
|
|
2034
|
+
const transportSchema = nodeSchema.toJsonSchema()
|
|
2035
|
+
```
|
|
2036
|
+
|
|
2037
|
+
Key recursive export behaviors:
|
|
2038
|
+
|
|
2039
|
+
* a direct self-recursive object field such as `parent` becomes a reference back to `#`
|
|
2040
|
+
* recursive nested contracts reached through array items or dynamic object values are hoisted into `definitions`
|
|
2041
|
+
* the exporter stays finite because it tracks schema graph nodes, not just call depth
|
|
2042
|
+
|
|
2043
|
+
For the `parent` field above, the transport shape is:
|
|
2044
|
+
|
|
2045
|
+
```javascript
|
|
2046
|
+
{
|
|
2047
|
+
allOf: [
|
|
2048
|
+
{
|
|
2049
|
+
$ref: '#'
|
|
2050
|
+
}
|
|
2051
|
+
],
|
|
2052
|
+
'x-json-rest-schema': {
|
|
2053
|
+
castType: 'object'
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
2056
|
+
```
|
|
2057
|
+
|
|
2058
|
+
For the `children.items` edge, the transport shape becomes a `$ref` into `definitions`, and that referenced definition points back to itself for deeper `children.items` recursion.
|
|
2059
|
+
|
|
2060
|
+
---
|
|
2061
|
+
|
|
2062
|
+
## Common REST Recipes
|
|
2063
|
+
|
|
2064
|
+
This section is intentionally practical. These are the shapes you are likely to define in a real API.
|
|
2065
|
+
|
|
2066
|
+
### Recipe: create payload
|
|
2067
|
+
|
|
2068
|
+
```javascript
|
|
2069
|
+
const createUserSchema = createSchema({
|
|
2070
|
+
email: { type: 'string', required: true, notEmpty: true, lowercase: true },
|
|
2071
|
+
displayName: { type: 'string', required: true, minLength: 2 },
|
|
2072
|
+
role: { type: 'string', defaultTo: 'member' },
|
|
2073
|
+
marketingOptIn: { type: 'boolean', defaultTo: false }
|
|
2074
|
+
})
|
|
2075
|
+
```
|
|
2076
|
+
|
|
2077
|
+
Use it like this:
|
|
2078
|
+
|
|
2079
|
+
```javascript
|
|
2080
|
+
const result = createUserSchema.create({
|
|
2081
|
+
email: ' ALEX@EXAMPLE.COM ',
|
|
2082
|
+
displayName: ' Alex '
|
|
2083
|
+
})
|
|
2084
|
+
```
|
|
2085
|
+
|
|
2086
|
+
Result:
|
|
2087
|
+
|
|
2088
|
+
```javascript
|
|
2089
|
+
{
|
|
2090
|
+
validatedObject: {
|
|
2091
|
+
email: 'alex@example.com',
|
|
2092
|
+
displayName: 'Alex',
|
|
2093
|
+
role: 'member',
|
|
2094
|
+
marketingOptIn: false
|
|
2095
|
+
},
|
|
2096
|
+
errors: {}
|
|
2097
|
+
}
|
|
2098
|
+
```
|
|
2099
|
+
|
|
2100
|
+
Use this pattern when:
|
|
2101
|
+
|
|
2102
|
+
* the client is creating a new resource
|
|
2103
|
+
* missing `required` fields should fail
|
|
2104
|
+
* omitted defaults should be materialized
|
|
2105
|
+
|
|
2106
|
+
### Recipe: patch payload
|
|
2107
|
+
|
|
2108
|
+
Use the same schema, but call `patch()`:
|
|
2109
|
+
|
|
2110
|
+
```javascript
|
|
2111
|
+
const result = createUserSchema.patch({
|
|
2112
|
+
displayName: ' Updated Name '
|
|
2113
|
+
})
|
|
2114
|
+
```
|
|
2115
|
+
|
|
2116
|
+
Result:
|
|
2117
|
+
|
|
2118
|
+
```javascript
|
|
2119
|
+
{
|
|
2120
|
+
validatedObject: {
|
|
2121
|
+
displayName: 'Updated Name'
|
|
2122
|
+
},
|
|
2123
|
+
errors: {}
|
|
2124
|
+
}
|
|
2125
|
+
```
|
|
2126
|
+
|
|
2127
|
+
Use this pattern when:
|
|
2128
|
+
|
|
2129
|
+
* the client is updating only a subset of fields
|
|
2130
|
+
* missing `required` fields should **not** fail just because they were omitted
|
|
2131
|
+
* defaults should **not** be invented during a patch
|
|
2132
|
+
|
|
2133
|
+
### Recipe: nested detail response
|
|
2134
|
+
|
|
2135
|
+
This is a common “show one resource” response shape.
|
|
2136
|
+
|
|
2137
|
+
```javascript
|
|
2138
|
+
const userSummarySchema = createSchema({
|
|
2139
|
+
id: { type: 'id', required: true },
|
|
2140
|
+
email: { type: 'string', required: true }
|
|
2141
|
+
})
|
|
2142
|
+
|
|
2143
|
+
const projectSummarySchema = createSchema({
|
|
2144
|
+
id: { type: 'id', required: true },
|
|
2145
|
+
slug: { type: 'string', required: true }
|
|
2146
|
+
})
|
|
2147
|
+
|
|
2148
|
+
const projectDetailSchema = createSchema({
|
|
2149
|
+
project: {
|
|
2150
|
+
type: 'object',
|
|
2151
|
+
required: true,
|
|
2152
|
+
schema: projectSummarySchema
|
|
2153
|
+
},
|
|
2154
|
+
owner: {
|
|
2155
|
+
type: 'object',
|
|
2156
|
+
required: true,
|
|
2157
|
+
schema: userSummarySchema
|
|
2158
|
+
},
|
|
2159
|
+
permissions: {
|
|
2160
|
+
type: 'array',
|
|
2161
|
+
required: true,
|
|
2162
|
+
items: { type: 'string', minLength: 1 }
|
|
2163
|
+
}
|
|
2164
|
+
})
|
|
2165
|
+
```
|
|
2166
|
+
|
|
2167
|
+
Validate it with `create()` or `replace()` depending on your calling style:
|
|
2168
|
+
|
|
2169
|
+
```javascript
|
|
2170
|
+
const result = projectDetailSchema.create({
|
|
2171
|
+
project: {
|
|
2172
|
+
id: '10',
|
|
2173
|
+
slug: ' api-redesign '
|
|
2174
|
+
},
|
|
2175
|
+
owner: {
|
|
2176
|
+
id: '7',
|
|
2177
|
+
email: 'owner@example.com'
|
|
2178
|
+
},
|
|
2179
|
+
permissions: ['read', 'write']
|
|
2180
|
+
})
|
|
2181
|
+
```
|
|
2182
|
+
|
|
2183
|
+
Result:
|
|
2184
|
+
|
|
2185
|
+
```javascript
|
|
2186
|
+
{
|
|
2187
|
+
validatedObject: {
|
|
2188
|
+
project: {
|
|
2189
|
+
id: 10,
|
|
2190
|
+
slug: 'api-redesign'
|
|
2191
|
+
},
|
|
2192
|
+
owner: {
|
|
2193
|
+
id: 7,
|
|
2194
|
+
email: 'owner@example.com'
|
|
2195
|
+
},
|
|
2196
|
+
permissions: ['read', 'write']
|
|
2197
|
+
},
|
|
2198
|
+
errors: {}
|
|
2199
|
+
}
|
|
2200
|
+
```
|
|
2201
|
+
|
|
2202
|
+
### Recipe: list response envelope
|
|
2203
|
+
|
|
2204
|
+
This library validates objects, so for list endpoints the usual pattern is an envelope object instead of a top-level array.
|
|
2205
|
+
|
|
2206
|
+
```javascript
|
|
2207
|
+
const workspaceSummarySchema = createSchema({
|
|
2208
|
+
id: { type: 'id', required: true },
|
|
2209
|
+
slug: { type: 'string', required: true },
|
|
2210
|
+
ownerUserId: { type: 'id', required: true }
|
|
2211
|
+
})
|
|
2212
|
+
|
|
2213
|
+
const workspaceListSchema = createSchema({
|
|
2214
|
+
items: {
|
|
2215
|
+
type: 'array',
|
|
2216
|
+
required: true,
|
|
2217
|
+
items: workspaceSummarySchema
|
|
2218
|
+
},
|
|
2219
|
+
total: { type: 'integer', required: true, min: 0 }
|
|
2220
|
+
})
|
|
2221
|
+
```
|
|
2222
|
+
|
|
2223
|
+
Example:
|
|
2224
|
+
|
|
2225
|
+
```javascript
|
|
2226
|
+
const result = workspaceListSchema.create({
|
|
2227
|
+
items: [
|
|
2228
|
+
{ id: '1', slug: 'alpha', ownerUserId: '7' },
|
|
2229
|
+
{ id: '2', slug: 'beta', ownerUserId: '9' }
|
|
2230
|
+
],
|
|
2231
|
+
total: '2'
|
|
2232
|
+
})
|
|
2233
|
+
```
|
|
2234
|
+
|
|
2235
|
+
Result:
|
|
2236
|
+
|
|
2237
|
+
```javascript
|
|
2238
|
+
{
|
|
2239
|
+
validatedObject: {
|
|
2240
|
+
items: [
|
|
2241
|
+
{ id: 1, slug: 'alpha', ownerUserId: 7 },
|
|
2242
|
+
{ id: 2, slug: 'beta', ownerUserId: 9 }
|
|
2243
|
+
],
|
|
2244
|
+
total: 2
|
|
2245
|
+
},
|
|
2246
|
+
errors: {}
|
|
2247
|
+
}
|
|
2248
|
+
```
|
|
2249
|
+
|
|
2250
|
+
### Recipe: settings or metadata bag
|
|
2251
|
+
|
|
2252
|
+
When part of the payload belongs to another layer and should not be field-by-field validated here, use an opaque object bag.
|
|
2253
|
+
|
|
2254
|
+
```javascript
|
|
2255
|
+
const updatePreferencesSchema = createSchema({
|
|
2256
|
+
userId: { type: 'id', required: true },
|
|
2257
|
+
preferences: {
|
|
2258
|
+
type: 'object',
|
|
2259
|
+
additionalProperties: true
|
|
2260
|
+
}
|
|
2261
|
+
})
|
|
2262
|
+
```
|
|
2263
|
+
|
|
2264
|
+
Example:
|
|
2265
|
+
|
|
2266
|
+
```javascript
|
|
2267
|
+
const result = updatePreferencesSchema.patch({
|
|
2268
|
+
preferences: {
|
|
2269
|
+
theme: 'dark',
|
|
2270
|
+
shortcuts: {
|
|
2271
|
+
save: 'cmd+s'
|
|
2272
|
+
},
|
|
2273
|
+
labs: ['new-sidebar']
|
|
2274
|
+
}
|
|
2275
|
+
})
|
|
2276
|
+
```
|
|
2277
|
+
|
|
2278
|
+
Result:
|
|
2279
|
+
|
|
2280
|
+
```javascript
|
|
2281
|
+
{
|
|
2282
|
+
validatedObject: {
|
|
2283
|
+
preferences: {
|
|
2284
|
+
theme: 'dark',
|
|
2285
|
+
shortcuts: {
|
|
2286
|
+
save: 'cmd+s'
|
|
2287
|
+
},
|
|
2288
|
+
labs: ['new-sidebar']
|
|
2289
|
+
}
|
|
2290
|
+
},
|
|
2291
|
+
errors: {}
|
|
2292
|
+
}
|
|
2293
|
+
```
|
|
2294
|
+
|
|
2295
|
+
Use this only when you intentionally want:
|
|
2296
|
+
|
|
2297
|
+
* object-ness to be enforced
|
|
2298
|
+
* inner keys and values to pass through untouched
|
|
2299
|
+
* no nested validation contract owned by this library
|
|
2300
|
+
|
|
2301
|
+
### Recipe: custom operation for an upsert-like boundary
|
|
2302
|
+
|
|
2303
|
+
Sometimes you want “validate the whole shape, apply defaults, but do not require every required field.”
|
|
2304
|
+
|
|
2305
|
+
```javascript
|
|
2306
|
+
const accountSchema = createSchema({
|
|
2307
|
+
email: { type: 'string', required: true, lowercase: true },
|
|
2308
|
+
role: { type: 'string', defaultTo: 'member' }
|
|
2309
|
+
}, {
|
|
2310
|
+
operations: {
|
|
2311
|
+
upsert: {
|
|
2312
|
+
targetFields: 'schema',
|
|
2313
|
+
enforceRequired: false,
|
|
2314
|
+
applyDefaults: true,
|
|
2315
|
+
outputFields: 'validated'
|
|
2316
|
+
}
|
|
2317
|
+
}
|
|
2318
|
+
})
|
|
2319
|
+
```
|
|
2320
|
+
|
|
2321
|
+
Example:
|
|
2322
|
+
|
|
2323
|
+
```javascript
|
|
2324
|
+
accountSchema.upsert({})
|
|
2325
|
+
```
|
|
2326
|
+
|
|
2327
|
+
Result:
|
|
2328
|
+
|
|
2329
|
+
```javascript
|
|
2330
|
+
{
|
|
2331
|
+
validatedObject: {
|
|
2332
|
+
role: 'member'
|
|
2333
|
+
},
|
|
2334
|
+
errors: {}
|
|
2335
|
+
}
|
|
2336
|
+
```
|
|
2337
|
+
|
|
2338
|
+
This is useful when the persistence layer or surrounding business logic decides whether the resource already exists, and the schema’s job is only to normalize a shared contract.
|
|
2339
|
+
|
|
2340
|
+
---
|
|
2341
|
+
|
|
2342
|
+
## Built-in Rules Reference
|
|
2343
|
+
|
|
2344
|
+
Here is a complete list of all types and validators available out of the box.
|
|
2345
|
+
|
|
2346
|
+
### Built-in Types (Casting Rules)
|
|
2347
|
+
|
|
2348
|
+
A field's `type` defines how the input value will be converted before any other validation rules are run.
|
|
2349
|
+
|
|
2350
|
+
| Type Name | Description |
|
|
2351
|
+
|---|---|
|
|
2352
|
+
| `string` | Converts the input to a string. By default, it trims whitespace. Fails if the input is an object or array. |
|
|
2353
|
+
| `number` | Converts the input to a finite number. Empty strings, whitespace-only strings, and non-finite values fail validation. |
|
|
2354
|
+
| `integer` | Converts the input to a finite integer. Non-integer numeric values fail validation. |
|
|
2355
|
+
| `boolean`| Converts the input to a boolean using explicit true/false tokens such as `true`, `false`, `1`, `0`, `yes`, `no`, `on`, and `off`. Unknown values fail validation. |
|
|
2356
|
+
| `array` | Ensures the value is an array. If the input is not already an array, it will be wrapped in one (e.g., `'tag1'` becomes `['tag1']`). If `items` is present, every item is validated recursively. |
|
|
2357
|
+
| `id` | Parses the value into a positive safe integer identifier. It rejects non-canonical forms such as leading zeroes or strings with junk suffixes. |
|
|
2358
|
+
| `date` | Converts a valid date string or timestamp into a `Date` object normalized to midnight UTC for that calendar day. |
|
|
2359
|
+
| `dateTime`| Converts a valid date string or timestamp into a `Date` object. MySQL-style `YYYY-MM-DD HH:MM:SS` strings are interpreted as UTC. |
|
|
2360
|
+
| `timestamp`| Converts the input to a number, suitable for storing Unix timestamps. |
|
|
2361
|
+
| `time` | Converts the input to a normalized `HH:MM:SS` string. |
|
|
2362
|
+
| `serialize`| Converts any JavaScript value (including objects with circular references) into a single JSON-like string using `flatted`. |
|
|
2363
|
+
| `object` | Requires a plain object value. With `schema`, it becomes a nested object contract. With `values`, it becomes a typed object map. With `additionalProperties: true`, it becomes either an opaque pass-through object bag or a passthrough nested object when combined with `schema`. Without any of those options, it is simply a validated plain object value with no child-field rules. |
|
|
2364
|
+
| `blob` | Passes the value through unchanged. Intended for binary data like files that don't need casting. |
|
|
2365
|
+
| `file` | Converts primitive file-handle-like values to strings and rejects objects or arrays. |
|
|
2366
|
+
| `none` | The "identity" type. Passes the value through completely unchanged without any casting. |
|
|
2367
|
+
|
|
2368
|
+
### Built-in Validators (Validation Parameters)
|
|
2369
|
+
|
|
2370
|
+
Validators are rules that run after a value has been cast to its proper type.
|
|
2371
|
+
|
|
2372
|
+
| Parameter | Description |
|
|
2373
|
+
|---|---|
|
|
2374
|
+
| `required: true` | The field must be present in the input object. Fails if the key is `undefined`. |
|
|
2375
|
+
| `minLength: <number>` | For `string` types, validates the minimum character length. |
|
|
2376
|
+
| `maxLength: <number>` | For `string` types, validates the maximum character length. |
|
|
2377
|
+
| `min: <number>` | For `number` types, validates the minimum value. |
|
|
2378
|
+
| `max: <number>` | For `number` types, validates the maximum value. |
|
|
2379
|
+
| `enum: <array>` | Restricts the field to one of the declared values. Exported as a standard JSON Schema `enum`. |
|
|
2380
|
+
| `notEmpty: true` | The field cannot be an empty string (`''`). This is different from `required`, as an empty string is still a defined value. |
|
|
2381
|
+
| `length: <number>`| For `string` types, it **truncates** the string to the specified length. For `number` types, it throws an error if the number of digits in the original input exceeds the specified length. |
|
|
2382
|
+
| `nullable: true`| Allows the value for this field to be `null`. By default, `null` is not allowed. |
|
|
2383
|
+
| `nullOnEmpty: true`| If the input value is an empty string (`''`), it will be cast to `null` before other validators run. |
|
|
2384
|
+
| `lowercase: true` | **Transforms** the string to all lowercase. |
|
|
2385
|
+
| `uppercase: true` | **Transforms** the string to all uppercase. |
|
|
2386
|
+
| `strictBoolean: true` | Restricts a `boolean` field so the original input must already be a real boolean. |
|
|
2387
|
+
| `validator: <function>`| Allows you to provide your own **synchronous** custom validation function for complex, one-off logic. |
|
|
2388
|
+
| `defaultTo: <value>` | If the field is not present in the input object, this value will be used in validation modes that apply defaults. Can be a value or a function that returns a value. |
|
|
2389
|
+
| `unsigned: true` | Passive schema metadata indicating non-negative numeric storage intent. Preserved in transport export metadata. |
|
|
2390
|
+
| `precision: <number>` | Passive schema metadata for decimal total digits. Preserved in transport export metadata. |
|
|
2391
|
+
| `scale: <number>` | Passive schema metadata for decimal fractional digits. Preserved in transport export metadata. |
|
|
2392
|
+
| `temporalPrecision: <number>` | Passive schema metadata for time or datetime fractional-second precision. Preserved in transport export metadata. |
|
|
2393
|
+
|
|
2394
|
+
---
|
|
2395
|
+
|
|
2396
|
+
## Extending the Library: Custom Rules
|
|
2397
|
+
|
|
2398
|
+
The real power of the library comes from its extensibility. You can easily add your own reusable types and validators. They must stay synchronous so the schema remains portable across environments. When you do this, you'll be passed a powerful `context` object.
|
|
2399
|
+
|
|
2400
|
+
### The `context` Object
|
|
2401
|
+
|
|
2402
|
+
Every custom type and validator handler receives a `context` object as its only argument. This object is your toolbox, giving you all the information you need to perform complex logic. Here are its properties:
|
|
2403
|
+
|
|
2404
|
+
* **`value`**: The current value of the field being processed. Be aware that this value may have already been changed by the type handler or a previous validator.
|
|
2405
|
+
* **`fieldName`**: A string containing the name of the field currently being validated (e.g., `'username'`).
|
|
2406
|
+
* **`object`**: The entire object that is being validated. Its properties reflect the data *after* any casting or transformations have been applied up to this point. This is useful for cross-field validation.
|
|
2407
|
+
* **`valueBeforeCast`**: The original, raw value for the field, exactly as it was in the input object before any type casting occurred.
|
|
2408
|
+
* **`objectBeforeCast`**: The original, raw input object, before any modifications were made.
|
|
2409
|
+
* **`definition`**: The schema definition object for the current field. For a field defined as `{ type: 'string', min: 5 }`, this would be that exact object.
|
|
2410
|
+
* **`parameterName`**: *(For validators only)* The name of the validation rule currently being executed (e.g., `'min'`).
|
|
2411
|
+
* **`parameterValue`**: *(For validators only)* The value of the validation rule currently being executed (e.g., the `5` in `min: 5`).
|
|
2412
|
+
* **`mode`**: The active validation contract. Preserved as a compatibility alias for `operation`.
|
|
2413
|
+
* **`operation`**: The active validation contract name (for example `'create'`, `'patch'`, or a custom operation such as `'upsert'`).
|
|
2414
|
+
* **`fieldPresent`**: A boolean indicating whether the field was explicitly present in the original input object.
|
|
2415
|
+
* **`throwTypeError()`**: A function you can call to throw a standardized `TYPE_CAST_FAILED` error. This is the preferred way to report an error from within a type handler.
|
|
2416
|
+
* **`throwParamError(code, message, params)`**: A function you can call to throw a standardized validation error from within a validator. It accepts a custom error `code`, a `message`, and an optional `params` object.
|
|
2417
|
+
|
|
2418
|
+
### Creating a Custom Validator
|
|
2419
|
+
|
|
2420
|
+
Let's say you frequently need to validate that a field is a URL-friendly "slug" (e.g., `my-blog-post`).
|
|
2421
|
+
|
|
2422
|
+
You can define a new validator once and use it anywhere.
|
|
2423
|
+
|
|
2424
|
+
Custom validators must be synchronous and local. If you need to ask a database or external API something, validate the payload first and run that business rule afterward in your service layer.
|
|
2425
|
+
|
|
2426
|
+
```javascript
|
|
2427
|
+
// Do this once when your application starts
|
|
2428
|
+
createSchema.addValidator('slug', (context) => {
|
|
2429
|
+
const slugRegex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
2430
|
+
|
|
2431
|
+
if (typeof context.value !== 'string' || !slugRegex.test(context.value)) {
|
|
2432
|
+
// Use the public context method to throw a standardized error
|
|
2433
|
+
context.throwParamError(
|
|
2434
|
+
'INVALID_SLUG', // Custom error code
|
|
2435
|
+
'Value must be a valid slug (e.g., my-post).'
|
|
2436
|
+
);
|
|
2437
|
+
}
|
|
2438
|
+
});
|
|
2439
|
+
|
|
2440
|
+
// Now you can use 'slug' in any schema!
|
|
2441
|
+
const articleSchema = createSchema({
|
|
2442
|
+
title: { type: 'string', required: true },
|
|
2443
|
+
slug: { type: 'string', required: true, slug: true } // Use it here
|
|
2444
|
+
});
|
|
2445
|
+
```
|
|
2446
|
+
|
|
2447
|
+
### Creating a Custom Type
|
|
2448
|
+
|
|
2449
|
+
A `Type` is used for casting. Imagine you want a `csv` type that takes a string like `"apple,banana,cherry"` and turns it into an array `['apple', 'banana', 'cherry']`.
|
|
2450
|
+
|
|
2451
|
+
```javascript
|
|
2452
|
+
// Do this once when your application starts
|
|
2453
|
+
createSchema.addType('csv', (context) => {
|
|
2454
|
+
if (context.value === undefined || context.value === null) {
|
|
2455
|
+
return [];
|
|
2456
|
+
}
|
|
2457
|
+
if (typeof context.value !== 'string') {
|
|
2458
|
+
// Use the public context method to throw a standardized type error
|
|
2459
|
+
context.throwTypeError();
|
|
2460
|
+
}
|
|
2461
|
+
// Trim whitespace from each item
|
|
2462
|
+
return context.value.split(',').map(item => item.trim());
|
|
2463
|
+
});
|
|
2464
|
+
|
|
2465
|
+
// Now use your new 'csv' type
|
|
2466
|
+
const productSchema = createSchema({
|
|
2467
|
+
name: { type: 'string', required: true },
|
|
2468
|
+
tags: { type: 'csv' }
|
|
2469
|
+
});
|
|
2470
|
+
|
|
2471
|
+
const product = { name: 'Laptop', tags: ' electronics, computers, tech ' };
|
|
2472
|
+
const { validatedObject } = productSchema.create(product);
|
|
2473
|
+
|
|
2474
|
+
// validatedObject.tags will be: ['electronics', 'computers', 'tech']
|
|
2475
|
+
console.log(validatedObject.tags);
|
|
2476
|
+
```
|
|
2477
|
+
|
|
2478
|
+
### Creating an Isolated Schema Factory
|
|
2479
|
+
|
|
2480
|
+
Sometimes you want local custom types or validators without mutating the default `createSchema` factory for the whole application.
|
|
2481
|
+
|
|
2482
|
+
Use `createSchemaFactory()` for that:
|
|
2483
|
+
|
|
2484
|
+
```javascript
|
|
2485
|
+
import { createSchemaFactory } from 'json-rest-schema'
|
|
2486
|
+
|
|
2487
|
+
const adminSchemaFactory = createSchemaFactory()
|
|
2488
|
+
|
|
2489
|
+
adminSchemaFactory.addType('admin-prefix-string', context => {
|
|
2490
|
+
return `admin-${context.value}`
|
|
2491
|
+
})
|
|
2492
|
+
|
|
2493
|
+
const adminSchema = adminSchemaFactory({
|
|
2494
|
+
name: { type: 'string', required: true },
|
|
2495
|
+
internalCode: { type: 'admin-prefix-string' }
|
|
2496
|
+
})
|
|
2497
|
+
|
|
2498
|
+
const { validatedObject } = adminSchema.create({
|
|
2499
|
+
name: ' Alice ',
|
|
2500
|
+
internalCode: 'ops'
|
|
2501
|
+
})
|
|
2502
|
+
|
|
2503
|
+
// Built-in handlers still work.
|
|
2504
|
+
console.log(validatedObject.name) // 'Alice'
|
|
2505
|
+
|
|
2506
|
+
// Custom handlers stay local to this factory.
|
|
2507
|
+
console.log(validatedObject.internalCode) // 'admin-ops'
|
|
2508
|
+
```
|
|
2509
|
+
|
|
2510
|
+
`createSchemaFactory()` installs the built-in core handlers by default so it is usable out of the box.
|
|
2511
|
+
|
|
2512
|
+
If you really want a completely bare registry, make that explicit:
|
|
2513
|
+
|
|
2514
|
+
```javascript
|
|
2515
|
+
import { createSchemaFactory } from 'json-rest-schema'
|
|
2516
|
+
|
|
2517
|
+
const bareFactory = createSchemaFactory({ installCore: false })
|
|
2518
|
+
```
|
|
2519
|
+
|
|
2520
|
+
That mode is useful only when you intentionally want to provide every type and validator yourself.
|
|
2521
|
+
|
|
2522
|
+
---
|
|
2523
|
+
|
|
2524
|
+
## Advanced: Creating a Plugin
|
|
2525
|
+
|
|
2526
|
+
If you create a lot of custom types and validators for your project, you can bundle them into a single, reusable **Plugin**. A plugin is just an object with an `install` method.
|
|
2527
|
+
|
|
2528
|
+
```javascript
|
|
2529
|
+
// my-custom-plugin.js
|
|
2530
|
+
const MyCustomPlugin = {
|
|
2531
|
+
install(manager) { // The 'manager' object has .addType and .addValidator
|
|
2532
|
+
manager.addType('csv', context => {
|
|
2533
|
+
if (context.value === undefined || context.value === null) return [];
|
|
2534
|
+
if (typeof context.value !== 'string') context.throwTypeError();
|
|
2535
|
+
return context.value.split(',').map(item => item.trim());
|
|
2536
|
+
});
|
|
2537
|
+
|
|
2538
|
+
manager.addValidator('slug', context => {
|
|
2539
|
+
const slugRegex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
2540
|
+
if (typeof context.value !== 'string' || !slugRegex.test(context.value)) {
|
|
2541
|
+
context.throwParamError('INVALID_SLUG', 'Value must be a valid slug.');
|
|
2542
|
+
}
|
|
2543
|
+
});
|
|
2544
|
+
}
|
|
2545
|
+
};
|
|
2546
|
+
|
|
2547
|
+
export default MyCustomPlugin;
|
|
2548
|
+
|
|
2549
|
+
// in your main app file:
|
|
2550
|
+
import { createSchema } from 'json-rest-schema';
|
|
2551
|
+
import MyCustomPlugin from './my-custom-plugin.js';
|
|
2552
|
+
|
|
2553
|
+
// Install all your custom rules in one line!
|
|
2554
|
+
createSchema.use(MyCustomPlugin);
|
|
2555
|
+
|
|
2556
|
+
// Now 'slug' and 'csv' are available to all schemas.
|
|
2557
|
+
const mySchema = createSchema({
|
|
2558
|
+
tags: { type: 'csv' },
|
|
2559
|
+
pageUrl: { type: 'string', slug: true }
|
|
2560
|
+
});
|
|
2561
|
+
```
|
|
2562
|
+
|
|
2563
|
+
This makes your custom rules portable and keeps your main application setup clean.
|
|
2564
|
+
|
|
2565
|
+
---
|
|
2566
|
+
|
|
2567
|
+
## Design Scope
|
|
2568
|
+
|
|
2569
|
+
`json-rest-schema` is intentionally **synchronous**. Shared schemas need to run the same way on the client and the server, so this library is scoped to:
|
|
2570
|
+
|
|
2571
|
+
* typing and casting
|
|
2572
|
+
* normalization
|
|
2573
|
+
* local field validation
|
|
2574
|
+
* local cross-field validation
|
|
2575
|
+
|
|
2576
|
+
It is **not** the place for database-backed uniqueness checks, external API lookups, or any other stateful async business rule. Put those checks in higher layers such as services, repositories, or actions after schema validation has produced a normalized payload.
|
|
2577
|
+
|
|
2578
|
+
`json-rest-schema` is also deliberately scoped to runtime validation and transformation. It does not prescribe a specific persistence layer. Treat the schemas you build with this library as the canonical description of your data when you design storage models, migrations, API responses, or documentation.
|
|
2579
|
+
|
|
2580
|
+
If you pair the library with a database toolkit (such as Knex), keep the tooling concerns separate: write migrations and models in the tool that best fits your project, then reuse the same field definitions inside `createSchema` so validation, casting, and persistence stay aligned.
|
|
2581
|
+
|
|
2582
|
+
> Looking for automation around database schema generation? See `FUTURE_MIGRATION_MODULE.md` for a high-level proposal of an optional companion package.
|