@stackcraftmx/calcita 0.0.0-stage → 0.25.0
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/LICENSE +110 -0
- package/README.md +700 -2
- package/cli/askQuestions.js +63 -0
- package/cli/calcita.js +150 -0
- package/cli/makeComponent.js +50 -0
- package/cli/makeForm.js +68 -0
- package/cli/makeModule.js +78 -0
- package/cli/makePage.js +62 -0
- package/cli/names.js +64 -0
- package/cli/newProject.js +103 -0
- package/cli/packageVersions.js +38 -0
- package/cli/projectAnswers.js +145 -0
- package/cli/projectConfig.js +38 -0
- package/cli/projectFiles.js +128 -0
- package/cli/screenLabels.js +41 -0
- package/cli/templateFiles.js +186 -0
- package/cli/templates/component/core/__ComponentName__.jsx.tpl +23 -0
- package/cli/templates/component/module/__ComponentName__.jsx.tpl +21 -0
- package/cli/templates/form/formik/__FormName__.jsx.tpl +50 -0
- package/cli/templates/form/hookForm/__FormName__.jsx.tpl +53 -0
- package/cli/templates/form/shared/__formName__Schema.js.tpl +20 -0
- package/cli/templates/form/shared/__formName__Texts.js.tpl +6 -0
- package/cli/templates/module/__Name__Page.jsx.tpl +75 -0
- package/cli/templates/module/__name__Api.js.tpl +39 -0
- package/cli/templates/module/__name__Texts.js.tpl +27 -0
- package/cli/templates/module/menu.js.tpl +21 -0
- package/cli/templates/module/routes.js.tpl +7 -0
- package/cli/templates/moduleServer/__name__Server.js.tpl +68 -0
- package/cli/templates/page/__PageName__Page.jsx.tpl +22 -0
- package/cli/templates/page/__pageName__PageTexts.js.tpl +23 -0
- package/cli/templates/project/README.md.tpl +83 -0
- package/cli/templates/project/dot-gitignore.tpl +11 -0
- package/cli/templates/project/index.html.tpl +20 -0
- package/cli/templates/project/jsconfig.json.tpl +16 -0
- package/cli/templates/project/pnpm-workspace.yaml.tpl +5 -0
- package/cli/templates/project/public/favicon.svg +1 -0
- package/cli/templates/project/public/icons/apple-touch-icon.png +0 -0
- package/cli/templates/project/public/icons/icon-192.png +0 -0
- package/cli/templates/project/public/icons/icon-512-maskable.png +0 -0
- package/cli/templates/project/public/icons/icon-512.png +0 -0
- package/cli/templates/project/public/manifest.webmanifest.tpl +17 -0
- package/cli/templates/project/src/app/AppProviders.jsx.tpl +107 -0
- package/cli/templates/project/src/app/AppShell.jsx.tpl +87 -0
- package/cli/templates/project/src/app/appRouter.jsx.tpl +51 -0
- package/cli/templates/project/src/app/appSettings.js.tpl +27 -0
- package/cli/templates/project/src/app/appTexts.js.tpl +15 -0
- package/cli/templates/project/src/app/combineTexts.js.tpl +31 -0
- package/cli/templates/project/src/app/i18n.js.tpl +19 -0
- package/cli/templates/project/src/app/shellTexts.js.tpl +16 -0
- package/cli/templates/project/src/core/AppLogo.jsx.tpl +14 -0
- package/cli/templates/project/src/core/accountConnector.js.tpl +36 -0
- package/cli/templates/project/src/core/apiClient.js.tpl +15 -0
- package/cli/templates/project/src/core/appPaths.js.tpl +11 -0
- package/cli/templates/project/src/core/index.js.tpl +9 -0
- package/cli/templates/project/src/core/publicPaths.js.tpl +24 -0
- package/cli/templates/project/src/fakeServer/networkDelay.js.tpl +40 -0
- package/cli/templates/project/src/fakeServer/serverText.js.tpl +20 -0
- package/cli/templates/project/src/main.jsx.tpl +24 -0
- package/cli/templates/project/src/modules/auth/ForgotPasswordPage.jsx.tpl +14 -0
- package/cli/templates/project/src/modules/auth/ResetPasswordPage.jsx.tpl +15 -0
- package/cli/templates/project/src/modules/auth/SignInPage.jsx.tpl +29 -0
- package/cli/templates/project/src/modules/auth/authTexts.js.tpl +6 -0
- package/cli/templates/project/src/modules/auth/routes.js.tpl +11 -0
- package/cli/templates/project/src/modules/home/HomePage.jsx.tpl +38 -0
- package/cli/templates/project/src/modules/home/homeTexts.js.tpl +29 -0
- package/cli/templates/project/src/modules/home/menu.js.tpl +17 -0
- package/cli/templates/project/src/modules/home/routes.js.tpl +4 -0
- package/cli/templates/project/src/modules/profile/ProfilePage.jsx.tpl +13 -0
- package/cli/templates/project/src/modules/profile/routes.js.tpl +6 -0
- package/cli/templates/project/vite.config.js.tpl +53 -0
- package/dist/DataTable/AuditTrailDialog.js +40 -0
- package/dist/DataTable/AuditTrailDialog.js.map +1 -0
- package/dist/DataTable/AuditTrailTable.js +89 -0
- package/dist/DataTable/AuditTrailTable.js.map +1 -0
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js +71 -0
- package/dist/DataTable/ColumnFilters/HeaderFilterPopover.js.map +1 -0
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js +51 -0
- package/dist/DataTable/ColumnFilters/MultiSelectColumnFilter.js.map +1 -0
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js +54 -0
- package/dist/DataTable/ColumnFilters/SortableFilterHeader.js.map +1 -0
- package/dist/DataTable/ColumnFilters/TextColumnFilter.js +24 -0
- package/dist/DataTable/ColumnFilters/TextColumnFilter.js.map +1 -0
- package/dist/DataTable/EmptyState.js +22 -0
- package/dist/DataTable/EmptyState.js.map +1 -0
- package/dist/DataTable/FilterChips.js +39 -0
- package/dist/DataTable/FilterChips.js.map +1 -0
- package/dist/DataTable/GoToPage.js +63 -0
- package/dist/DataTable/GoToPage.js.map +1 -0
- package/dist/DataTable/ServerTable.js +477 -0
- package/dist/DataTable/ServerTable.js.map +1 -0
- package/dist/DataTable/buildChipConfig.js +27 -0
- package/dist/DataTable/buildChipConfig.js.map +1 -0
- package/dist/DataTable/columns.js +122 -0
- package/dist/DataTable/columns.js.map +1 -0
- package/dist/DataTable/filterContext.js +15 -0
- package/dist/DataTable/filterContext.js.map +1 -0
- package/dist/DataTable/rowSelection.js +61 -0
- package/dist/DataTable/rowSelection.js.map +1 -0
- package/dist/DataTable/serverTableParams.js +19 -0
- package/dist/DataTable/serverTableParams.js.map +1 -0
- package/dist/DataTable/tableMachine.js +87 -0
- package/dist/DataTable/tableMachine.js.map +1 -0
- package/dist/DataTable/useDebouncedFilter.js +29 -0
- package/dist/DataTable/useDebouncedFilter.js.map +1 -0
- package/dist/DataTable/useTableState.js +132 -0
- package/dist/DataTable/useTableState.js.map +1 -0
- package/dist/access/Can.js +9 -0
- package/dist/access/Can.js.map +1 -0
- package/dist/access/PermissionMatrix.js +84 -0
- package/dist/access/PermissionMatrix.js.map +1 -0
- package/dist/access/RequireAccess.js +14 -0
- package/dist/access/RequireAccess.js.map +1 -0
- package/dist/access/accessRules.js +49 -0
- package/dist/access/accessRules.js.map +1 -0
- package/dist/access/permissionGroups.js +43 -0
- package/dist/access/permissionGroups.js.map +1 -0
- package/dist/access/useCan.js +12 -0
- package/dist/access/useCan.js.map +1 -0
- package/dist/account/AccountProvider.js +58 -0
- package/dist/account/AccountProvider.js.map +1 -0
- package/dist/account/AccountSecuritySection.js +81 -0
- package/dist/account/AccountSecuritySection.js.map +1 -0
- package/dist/account/DemoTotpCodeButton.js +26 -0
- package/dist/account/DemoTotpCodeButton.js.map +1 -0
- package/dist/account/ForgotPasswordScreen.js +27 -0
- package/dist/account/ForgotPasswordScreen.js.map +1 -0
- package/dist/account/ProfileScreen.js +134 -0
- package/dist/account/ProfileScreen.js.map +1 -0
- package/dist/account/ResetPasswordScreen.js +58 -0
- package/dist/account/ResetPasswordScreen.js.map +1 -0
- package/dist/account/SignInScreen.js +102 -0
- package/dist/account/SignInScreen.js.map +1 -0
- package/dist/account/accountConnector.js +31 -0
- package/dist/account/accountConnector.js.map +1 -0
- package/dist/account/demo/createDemoAccountConnector.js +368 -0
- package/dist/account/demo/createDemoAccountConnector.js.map +1 -0
- package/dist/account/demo/totp.js +61 -0
- package/dist/account/demo/totp.js.map +1 -0
- package/dist/account/restAccountConnector.js +118 -0
- package/dist/account/restAccountConnector.js.map +1 -0
- package/dist/account-demo.js +12 -0
- package/dist/account-demo.js.map +1 -0
- package/dist/account.js +25 -0
- package/dist/account.js.map +1 -0
- package/dist/adapters/i18next.js +7 -0
- package/dist/adapters/i18next.js.map +1 -0
- package/dist/adapters/nextNavigation.js +36 -0
- package/dist/adapters/nextNavigation.js.map +1 -0
- package/dist/adapters/reactRouter.js +7 -0
- package/dist/adapters/reactRouter.js.map +1 -0
- package/dist/adapters/reactRouterRoutes.js +49 -0
- package/dist/adapters/reactRouterRoutes.js.map +1 -0
- package/dist/api/ApiError.js +58 -0
- package/dist/api/ApiError.js.map +1 -0
- package/dist/api/createApiClient.js +256 -0
- package/dist/api/createApiClient.js.map +1 -0
- package/dist/api/staleChunks.js +47 -0
- package/dist/api/staleChunks.js.map +1 -0
- package/dist/appShell/AccountMenu.js +86 -0
- package/dist/appShell/AccountMenu.js.map +1 -0
- package/dist/appShell/AppLayout.js +513 -0
- package/dist/appShell/AppLayout.js.map +1 -0
- package/dist/appShell/AppearanceSettings.js +116 -0
- package/dist/appShell/AppearanceSettings.js.map +1 -0
- package/dist/appShell/AuthLayout.js +46 -0
- package/dist/appShell/AuthLayout.js.map +1 -0
- package/dist/appShell/BarActionButton.js +31 -0
- package/dist/appShell/BarActionButton.js.map +1 -0
- package/dist/appShell/BarActions.js +105 -0
- package/dist/appShell/BarActions.js.map +1 -0
- package/dist/appShell/BarCapsule.js +50 -0
- package/dist/appShell/BarCapsule.js.map +1 -0
- package/dist/appShell/BarSearch.js +92 -0
- package/dist/appShell/BarSearch.js.map +1 -0
- package/dist/appShell/HeaderTools.js +53 -0
- package/dist/appShell/HeaderTools.js.map +1 -0
- package/dist/appShell/MobileTabBar.js +348 -0
- package/dist/appShell/MobileTabBar.js.map +1 -0
- package/dist/appShell/SettingsMenu.js +41 -0
- package/dist/appShell/SettingsMenu.js.map +1 -0
- package/dist/appShell/SideMenu.js +217 -0
- package/dist/appShell/SideMenu.js.map +1 -0
- package/dist/appShell/SideMenuEntry.js +140 -0
- package/dist/appShell/SideMenuEntry.js.map +1 -0
- package/dist/appShell/SubmenuActionsMenu.js +71 -0
- package/dist/appShell/SubmenuActionsMenu.js.map +1 -0
- package/dist/appShell/TabBarEditor.js +55 -0
- package/dist/appShell/TabBarEditor.js.map +1 -0
- package/dist/appShell/TopMenu.js +80 -0
- package/dist/appShell/TopMenu.js.map +1 -0
- package/dist/appShell/appMenuContext.js +11 -0
- package/dist/appShell/appMenuContext.js.map +1 -0
- package/dist/appShell/barActionsSlot.js +26 -0
- package/dist/appShell/barActionsSlot.js.map +1 -0
- package/dist/appShell/barMenuPlacement.js +33 -0
- package/dist/appShell/barMenuPlacement.js.map +1 -0
- package/dist/appShell/menuItemText.js +33 -0
- package/dist/appShell/menuItemText.js.map +1 -0
- package/dist/appShell/pageTitle.js +45 -0
- package/dist/appShell/pageTitle.js.map +1 -0
- package/dist/appShell/shellSizes.js +40 -0
- package/dist/appShell/shellSizes.js.map +1 -0
- package/dist/appShell/tabBarRule.js +12 -0
- package/dist/appShell/tabBarRule.js.map +1 -0
- package/dist/appShell/tabBarScroll.js +23 -0
- package/dist/appShell/tabBarScroll.js.map +1 -0
- package/dist/appShell/useDrawerCollapsed.js +29 -0
- package/dist/appShell/useDrawerCollapsed.js.map +1 -0
- package/dist/appShell/useFittingActionCount.js +45 -0
- package/dist/appShell/useFittingActionCount.js.map +1 -0
- package/dist/appShell/usePinnedMobileTabs.js +32 -0
- package/dist/appShell/usePinnedMobileTabs.js.map +1 -0
- package/dist/appShell/useTabBarMinimized.js +33 -0
- package/dist/appShell/useTabBarMinimized.js.map +1 -0
- package/dist/auth/PasswordChecklist.js +44 -0
- package/dist/auth/PasswordChecklist.js.map +1 -0
- package/dist/auth/passwordRules.js +43 -0
- package/dist/auth/passwordRules.js.map +1 -0
- package/dist/calendar/EventCalendar.js +149 -0
- package/dist/calendar/EventCalendar.js.map +1 -0
- package/dist/calendar/EventDetails.js +74 -0
- package/dist/calendar/EventDetails.js.map +1 -0
- package/dist/calendar/calendarEvents.js +31 -0
- package/dist/calendar/calendarEvents.js.map +1 -0
- package/dist/calendar.js +13 -0
- package/dist/calendar.js.map +1 -0
- package/dist/charts.js +16 -0
- package/dist/charts.js.map +1 -0
- package/dist/date-pickers.js +8 -0
- package/dist/date-pickers.js.map +1 -0
- package/dist/datePickers/DateInput.js +76 -0
- package/dist/datePickers/DateInput.js.map +1 -0
- package/dist/datePickers/FormDateField.js +12 -0
- package/dist/datePickers/FormDateField.js.map +1 -0
- package/dist/dates.js +25 -0
- package/dist/dates.js.map +1 -0
- package/dist/dictionaries/dictionaries.js +48 -0
- package/dist/dictionaries/dictionaries.js.map +1 -0
- package/dist/downloads/DownloadManager.js +195 -0
- package/dist/downloads/DownloadManager.js.map +1 -0
- package/dist/downloads/downloadQueue.js +56 -0
- package/dist/downloads/downloadQueue.js.map +1 -0
- package/dist/downloads/downloadsMachine.js +80 -0
- package/dist/downloads/downloadsMachine.js.map +1 -0
- package/dist/downloads/fileTypes.js +22 -0
- package/dist/downloads/fileTypes.js.map +1 -0
- package/dist/excel/reportWorkbook.js +299 -0
- package/dist/excel/reportWorkbook.js.map +1 -0
- package/dist/excel.js +13 -0
- package/dist/excel.js.map +1 -0
- package/dist/feedback/ConfirmDialog.js +73 -0
- package/dist/feedback/ConfirmDialog.js.map +1 -0
- package/dist/feedback/ModalWaiting.js +23 -0
- package/dist/feedback/ModalWaiting.js.map +1 -0
- package/dist/feedback/NewBuildNotice.js +79 -0
- package/dist/feedback/NewBuildNotice.js.map +1 -0
- package/dist/feedback/StaleBuildBoundary.js +36 -0
- package/dist/feedback/StaleBuildBoundary.js.map +1 -0
- package/dist/feedback/Toaster.js +20 -0
- package/dist/feedback/Toaster.js.map +1 -0
- package/dist/feedback/confirmActionMachine.js +67 -0
- package/dist/feedback/confirmActionMachine.js.map +1 -0
- package/dist/feedback/toast.js +88 -0
- package/dist/feedback/toast.js.map +1 -0
- package/dist/feedback/useConfirmAction.js +40 -0
- package/dist/feedback/useConfirmAction.js.map +1 -0
- package/dist/filepond/FileDropzone.js +256 -0
- package/dist/filepond/FileDropzone.js.map +1 -0
- package/dist/filepond/pondServer.js +48 -0
- package/dist/filepond/pondServer.js.map +1 -0
- package/dist/filepond.js +10 -0
- package/dist/filepond.js.map +1 -0
- package/dist/files.js +43 -0
- package/dist/files.js.map +1 -0
- package/dist/formatting.js +205 -0
- package/dist/formatting.js.map +1 -0
- package/dist/forms/FormCatalogField.js +12 -0
- package/dist/forms/FormCatalogField.js.map +1 -0
- package/dist/forms/FormColorField.js +12 -0
- package/dist/forms/FormColorField.js.map +1 -0
- package/dist/forms/FormNumberField.js +12 -0
- package/dist/forms/FormNumberField.js.map +1 -0
- package/dist/forms/FormProblemAlert.js +15 -0
- package/dist/forms/FormProblemAlert.js.map +1 -0
- package/dist/forms/FormSelectField.js +12 -0
- package/dist/forms/FormSelectField.js.map +1 -0
- package/dist/forms/FormServerProblem.js +23 -0
- package/dist/forms/FormServerProblem.js.map +1 -0
- package/dist/forms/FormTextField.js +12 -0
- package/dist/forms/FormTextField.js.map +1 -0
- package/dist/forms/FormWizard.js +63 -0
- package/dist/forms/FormWizard.js.map +1 -0
- package/dist/forms/SubmitButton.js +14 -0
- package/dist/forms/SubmitButton.js.map +1 -0
- package/dist/forms/applyServerProblem.js +15 -0
- package/dist/forms/applyServerProblem.js.map +1 -0
- package/dist/forms/auth/ChangePasswordForm.js +47 -0
- package/dist/forms/auth/ChangePasswordForm.js.map +1 -0
- package/dist/forms/auth/ForgotPasswordForm.js +50 -0
- package/dist/forms/auth/ForgotPasswordForm.js.map +1 -0
- package/dist/forms/auth/SignInForm.js +48 -0
- package/dist/forms/auth/SignInForm.js.map +1 -0
- package/dist/forms/security/SecondStepForm.js +122 -0
- package/dist/forms/security/SecondStepForm.js.map +1 -0
- package/dist/forms/security/TwoStepVerificationCard.js +338 -0
- package/dist/forms/security/TwoStepVerificationCard.js.map +1 -0
- package/dist/forms/security/securityRules.js +28 -0
- package/dist/forms/security/securityRules.js.map +1 -0
- package/dist/forms/serverProblemFields.js +25 -0
- package/dist/forms/serverProblemFields.js.map +1 -0
- package/dist/forms/useFormikField.js +16 -0
- package/dist/forms/useFormikField.js.map +1 -0
- package/dist/forms/validation.js +55 -0
- package/dist/forms/validation.js.map +1 -0
- package/dist/forms/validationMessages.js +16 -0
- package/dist/forms/validationMessages.js.map +1 -0
- package/dist/forms.js +57 -0
- package/dist/forms.js.map +1 -0
- package/dist/hookForm/FormCatalogField.js +12 -0
- package/dist/hookForm/FormCatalogField.js.map +1 -0
- package/dist/hookForm/FormColorField.js +12 -0
- package/dist/hookForm/FormColorField.js.map +1 -0
- package/dist/hookForm/FormNumberField.js +12 -0
- package/dist/hookForm/FormNumberField.js.map +1 -0
- package/dist/hookForm/FormProblemAlert.js +17 -0
- package/dist/hookForm/FormProblemAlert.js.map +1 -0
- package/dist/hookForm/FormSelectField.js +12 -0
- package/dist/hookForm/FormSelectField.js.map +1 -0
- package/dist/hookForm/FormTextField.js +12 -0
- package/dist/hookForm/FormTextField.js.map +1 -0
- package/dist/hookForm/FormWizard.js +59 -0
- package/dist/hookForm/FormWizard.js.map +1 -0
- package/dist/hookForm/SubmitButton.js +15 -0
- package/dist/hookForm/SubmitButton.js.map +1 -0
- package/dist/hookForm/applyServerProblem.js +21 -0
- package/dist/hookForm/applyServerProblem.js.map +1 -0
- package/dist/hookForm/useHookFormField.js +19 -0
- package/dist/hookForm/useHookFormField.js.map +1 -0
- package/dist/i18next.js +5 -0
- package/dist/i18next.js.map +1 -0
- package/dist/identifiers.js +8 -0
- package/dist/identifiers.js.map +1 -0
- package/dist/inbox/InboxLayout.js +104 -0
- package/dist/inbox/InboxLayout.js.map +1 -0
- package/dist/inbox/MessageList.js +114 -0
- package/dist/inbox/MessageList.js.map +1 -0
- package/dist/inbox/MessageView.js +104 -0
- package/dist/inbox/MessageView.js.map +1 -0
- package/dist/inbox/inboxDates.js +9 -0
- package/dist/inbox/inboxDates.js.map +1 -0
- package/dist/index.js +407 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs/CatalogInput.js +66 -0
- package/dist/inputs/CatalogInput.js.map +1 -0
- package/dist/inputs/ColorInput.js +109 -0
- package/dist/inputs/ColorInput.js.map +1 -0
- package/dist/inputs/FieldFrame.js +20 -0
- package/dist/inputs/FieldFrame.js.map +1 -0
- package/dist/inputs/FormSection.js +105 -0
- package/dist/inputs/FormSection.js.map +1 -0
- package/dist/inputs/NumberInput.js +70 -0
- package/dist/inputs/NumberInput.js.map +1 -0
- package/dist/inputs/SelectInput.js +84 -0
- package/dist/inputs/SelectInput.js.map +1 -0
- package/dist/inputs/TextInput.js +101 -0
- package/dist/inputs/TextInput.js.map +1 -0
- package/dist/inputs/WizardLayout.js +54 -0
- package/dist/inputs/WizardLayout.js.map +1 -0
- package/dist/inputs/colorContrast.js +46 -0
- package/dist/inputs/colorContrast.js.map +1 -0
- package/dist/inputs/formLayoutContext.js +9 -0
- package/dist/inputs/formLayoutContext.js.map +1 -0
- package/dist/inputs/numberText.js +48 -0
- package/dist/inputs/numberText.js.map +1 -0
- package/dist/kanban/KanbanBoard.js +338 -0
- package/dist/kanban/KanbanBoard.js.map +1 -0
- package/dist/kanban/kanbanCards.js +19 -0
- package/dist/kanban/kanbanCards.js.map +1 -0
- package/dist/kanban/kanbanMoves.js +29 -0
- package/dist/kanban/kanbanMoves.js.map +1 -0
- package/dist/kanban.js +15 -0
- package/dist/kanban.js.map +1 -0
- package/dist/laravel/csrfRetry.js +18 -0
- package/dist/laravel/csrfRetry.js.map +1 -0
- package/dist/laravel.js +6 -0
- package/dist/laravel.js.map +1 -0
- package/dist/lastListUrl.js +35 -0
- package/dist/lastListUrl.js.map +1 -0
- package/dist/locales/en.js +787 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/es.js +787 -0
- package/dist/locales/es.js.map +1 -0
- package/dist/maps/MapView.js +116 -0
- package/dist/maps/MapView.js.map +1 -0
- package/dist/maps/mapMarkers.js +19 -0
- package/dist/maps/mapMarkers.js.map +1 -0
- package/dist/maps.js +10 -0
- package/dist/maps.js.map +1 -0
- package/dist/money/money.js +380 -0
- package/dist/money/money.js.map +1 -0
- package/dist/money.js +6 -0
- package/dist/money.js.map +1 -0
- package/dist/navigation/appMenu.js +93 -0
- package/dist/navigation/appMenu.js.map +1 -0
- package/dist/navigation/useMenuBadges.js +45 -0
- package/dist/navigation/useMenuBadges.js.map +1 -0
- package/dist/navigation.js +30 -0
- package/dist/navigation.js.map +1 -0
- package/dist/navigationTrail.js +82 -0
- package/dist/navigationTrail.js.map +1 -0
- package/dist/next.js +5 -0
- package/dist/next.js.map +1 -0
- package/dist/observability/buildWatch.js +19 -0
- package/dist/observability/buildWatch.js.map +1 -0
- package/dist/observability/logger.js +43 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/publishedBuild.js +39 -0
- package/dist/observability/publishedBuild.js.map +1 -0
- package/dist/observability/usePublishedBuildWatch.js +77 -0
- package/dist/observability/usePublishedBuildWatch.js.map +1 -0
- package/dist/passkeys.js +7 -0
- package/dist/passkeys.js.map +1 -0
- package/dist/periodRanges.js +33 -0
- package/dist/periodRanges.js.map +1 -0
- package/dist/problems.js +51 -0
- package/dist/problems.js.map +1 -0
- package/dist/pwa/InstallAppSetting.js +34 -0
- package/dist/pwa/InstallAppSetting.js.map +1 -0
- package/dist/pwa/InstallInstructionsDialog.js +35 -0
- package/dist/pwa/InstallInstructionsDialog.js.map +1 -0
- package/dist/pwa/InstallPromptBanner.js +70 -0
- package/dist/pwa/InstallPromptBanner.js.map +1 -0
- package/dist/pwa/installInstructions.js +60 -0
- package/dist/pwa/installInstructions.js.map +1 -0
- package/dist/pwa/useInstallPrompt.js +71 -0
- package/dist/pwa/useInstallPrompt.js.map +1 -0
- package/dist/react-hook-form.js +32 -0
- package/dist/react-hook-form.js.map +1 -0
- package/dist/react-router.js +10 -0
- package/dist/react-router.js.map +1 -0
- package/dist/security/ActivityLog.js +80 -0
- package/dist/security/ActivityLog.js.map +1 -0
- package/dist/security/RecoveryCodesDialog.js +85 -0
- package/dist/security/RecoveryCodesDialog.js.map +1 -0
- package/dist/security/SessionsCard.js +83 -0
- package/dist/security/SessionsCard.js.map +1 -0
- package/dist/security/passkeys.js +39 -0
- package/dist/security/passkeys.js.map +1 -0
- package/dist/table.js +37 -0
- package/dist/table.js.map +1 -0
- package/dist/theme/androidDevice.js +16 -0
- package/dist/theme/androidDevice.js.map +1 -0
- package/dist/theme/appleTracking.js +34 -0
- package/dist/theme/appleTracking.js.map +1 -0
- package/dist/theme/components/MuiAppBar.js +27 -0
- package/dist/theme/components/MuiAppBar.js.map +1 -0
- package/dist/theme/components/MuiBackdrop.js +13 -0
- package/dist/theme/components/MuiBackdrop.js.map +1 -0
- package/dist/theme/components/MuiButton.js +25 -0
- package/dist/theme/components/MuiButton.js.map +1 -0
- package/dist/theme/components/MuiButtonBase.js +16 -0
- package/dist/theme/components/MuiButtonBase.js.map +1 -0
- package/dist/theme/components/MuiChip.js +30 -0
- package/dist/theme/components/MuiChip.js.map +1 -0
- package/dist/theme/components/MuiDataGrid.js +30 -0
- package/dist/theme/components/MuiDataGrid.js.map +1 -0
- package/dist/theme/components/MuiDialog.js +13 -0
- package/dist/theme/components/MuiDialog.js.map +1 -0
- package/dist/theme/components/MuiDrawer.js +18 -0
- package/dist/theme/components/MuiDrawer.js.map +1 -0
- package/dist/theme/components/MuiMenuItem.js +17 -0
- package/dist/theme/components/MuiMenuItem.js.map +1 -0
- package/dist/theme/components/MuiTypography.js +22 -0
- package/dist/theme/components/MuiTypography.js.map +1 -0
- package/dist/theme/components/glassComponents.js +885 -0
- package/dist/theme/components/glassComponents.js.map +1 -0
- package/dist/theme/components/minimalComponents.js +146 -0
- package/dist/theme/components/minimalComponents.js.map +1 -0
- package/dist/theme/components/paletteOf.js +7 -0
- package/dist/theme/components/paletteOf.js.map +1 -0
- package/dist/theme/createToolkitTheme.js +100 -0
- package/dist/theme/createToolkitTheme.js.map +1 -0
- package/dist/theme/glassSurface.js +328 -0
- package/dist/theme/glassSurface.js.map +1 -0
- package/dist/theme/glassToasterStyles.js +50 -0
- package/dist/theme/glassToasterStyles.js.map +1 -0
- package/dist/theme/mergeComponents.js +42 -0
- package/dist/theme/mergeComponents.js.map +1 -0
- package/dist/theme/stackcraftPalette.js +59 -0
- package/dist/theme/stackcraftPalette.js.map +1 -0
- package/dist/theme/toolkitComponents.js +28 -0
- package/dist/theme/toolkitComponents.js.map +1 -0
- package/dist/timeline.js +8 -0
- package/dist/timeline.js.map +1 -0
- package/dist/toolkit/ComponentTexts.js +13 -0
- package/dist/toolkit/ComponentTexts.js.map +1 -0
- package/dist/toolkit/ToolkitProvider.js +57 -0
- package/dist/toolkit/ToolkitProvider.js.map +1 -0
- package/dist/toolkit/browserNavigation.js +33 -0
- package/dist/toolkit/browserNavigation.js.map +1 -0
- package/dist/toolkit/componentTextsContext.js +15 -0
- package/dist/toolkit/componentTextsContext.js.map +1 -0
- package/dist/toolkit/hashNavigation.js +40 -0
- package/dist/toolkit/hashNavigation.js.map +1 -0
- package/dist/toolkit/navigationPaths.js +49 -0
- package/dist/toolkit/navigationPaths.js.map +1 -0
- package/dist/toolkit/toolkitContext.js +19 -0
- package/dist/toolkit/toolkitContext.js.map +1 -0
- package/dist/toolkit/toolkitSettings.js +107 -0
- package/dist/toolkit/toolkitSettings.js.map +1 -0
- package/dist/toolkit/useFormatters.js +12 -0
- package/dist/toolkit/useFormatters.js.map +1 -0
- package/dist/toolkit/useToolkitTranslation.js +22 -0
- package/dist/toolkit/useToolkitTranslation.js.map +1 -0
- package/dist/types/DataTable/AuditTrailDialog.d.ts +32 -0
- package/dist/types/DataTable/AuditTrailTable.d.ts +30 -0
- package/dist/types/DataTable/ColumnFilters/HeaderFilterPopover.d.ts +8 -0
- package/dist/types/DataTable/ColumnFilters/MultiSelectColumnFilter.d.ts +16 -0
- package/dist/types/DataTable/ColumnFilters/SortableFilterHeader.d.ts +26 -0
- package/dist/types/DataTable/ColumnFilters/TextColumnFilter.d.ts +8 -0
- package/dist/types/DataTable/ColumnFilters/index.d.ts +4 -0
- package/dist/types/DataTable/EmptyState.d.ts +13 -0
- package/dist/types/DataTable/FilterChips.d.ts +17 -0
- package/dist/types/DataTable/GoToPage.d.ts +13 -0
- package/dist/types/DataTable/SelectionBar.d.ts +32 -0
- package/dist/types/DataTable/ServerTable.d.ts +171 -0
- package/dist/types/DataTable/buildChipConfig.d.ts +22 -0
- package/dist/types/DataTable/columns.d.ts +93 -0
- package/dist/types/DataTable/filterContext.d.ts +13 -0
- package/dist/types/DataTable/index.d.ts +13 -0
- package/dist/types/DataTable/rowSelection.d.ts +113 -0
- package/dist/types/DataTable/serverTableParams.d.ts +16 -0
- package/dist/types/DataTable/tableMachine.d.ts +41 -0
- package/dist/types/DataTable/useDebouncedFilter.d.ts +8 -0
- package/dist/types/DataTable/useTableState.d.ts +93 -0
- package/dist/types/access/Can.d.ts +11 -0
- package/dist/types/access/PermissionMatrix.d.ts +23 -0
- package/dist/types/access/RequireAccess.d.ts +11 -0
- package/dist/types/access/accessRules.d.ts +24 -0
- package/dist/types/access/permissionGroups.d.ts +56 -0
- package/dist/types/access/useCan.d.ts +11 -0
- package/dist/types/account/AccountProvider.d.ts +27 -0
- package/dist/types/account/AccountSecuritySection.d.ts +9 -0
- package/dist/types/account/DemoTotpCodeButton.d.ts +6 -0
- package/dist/types/account/ForgotPasswordScreen.d.ts +17 -0
- package/dist/types/account/ProfileScreen.d.ts +43 -0
- package/dist/types/account/ResetPasswordScreen.d.ts +21 -0
- package/dist/types/account/SignInScreen.d.ts +27 -0
- package/dist/types/account/accountConnector.d.ts +268 -0
- package/dist/types/account/demo/createDemoAccountConnector.d.ts +30 -0
- package/dist/types/account/demo/totp.d.ts +45 -0
- package/dist/types/account/restAccountConnector.d.ts +49 -0
- package/dist/types/account-demo.d.ts +2 -0
- package/dist/types/account.d.ts +16 -0
- package/dist/types/adapters/i18next.d.ts +11 -0
- package/dist/types/adapters/nextNavigation.d.ts +33 -0
- package/dist/types/adapters/reactRouter.d.ts +6 -0
- package/dist/types/adapters/reactRouterRoutes.d.ts +42 -0
- package/dist/types/api/ApiError.d.ts +42 -0
- package/dist/types/api/createApiClient.d.ts +174 -0
- package/dist/types/api/staleChunks.d.ts +15 -0
- package/dist/types/appShell/AccountMenu.d.ts +28 -0
- package/dist/types/appShell/AppLayout.d.ts +76 -0
- package/dist/types/appShell/AppearanceSettings.d.ts +41 -0
- package/dist/types/appShell/AuthLayout.d.ts +21 -0
- package/dist/types/appShell/BarActionButton.d.ts +15 -0
- package/dist/types/appShell/BarActions.d.ts +23 -0
- package/dist/types/appShell/BarCapsule.d.ts +20 -0
- package/dist/types/appShell/BarSearch.d.ts +24 -0
- package/dist/types/appShell/HeaderTools.d.ts +27 -0
- package/dist/types/appShell/MobileTabBar.d.ts +20 -0
- package/dist/types/appShell/SettingsMenu.d.ts +13 -0
- package/dist/types/appShell/SideMenu.d.ts +31 -0
- package/dist/types/appShell/SideMenuEntry.d.ts +17 -0
- package/dist/types/appShell/SubmenuActionsMenu.d.ts +24 -0
- package/dist/types/appShell/TabBarEditor.d.ts +13 -0
- package/dist/types/appShell/TopMenu.d.ts +7 -0
- package/dist/types/appShell/appMenuContext.d.ts +9 -0
- package/dist/types/appShell/barActionsSlot.d.ts +35 -0
- package/dist/types/appShell/barMenuPlacement.d.ts +9 -0
- package/dist/types/appShell/menuItemText.d.ts +55 -0
- package/dist/types/appShell/pageTitle.d.ts +26 -0
- package/dist/types/appShell/shellSizes.d.ts +46 -0
- package/dist/types/appShell/tabBarRule.d.ts +5 -0
- package/dist/types/appShell/tabBarScroll.d.ts +26 -0
- package/dist/types/appShell/useDrawerCollapsed.d.ts +8 -0
- package/dist/types/appShell/useFittingActionCount.d.ts +7 -0
- package/dist/types/appShell/usePinnedMobileTabs.d.ts +7 -0
- package/dist/types/appShell/useTabBarMinimized.d.ts +8 -0
- package/dist/types/auth/PasswordChecklist.d.ts +13 -0
- package/dist/types/auth/passwordRules.d.ts +34 -0
- package/dist/types/calendar/EventCalendar.d.ts +63 -0
- package/dist/types/calendar/EventDetails.d.ts +36 -0
- package/dist/types/calendar/calendarEvents.d.ts +27 -0
- package/dist/types/calendar.d.ts +3 -0
- package/dist/types/charts.d.ts +6 -0
- package/dist/types/date-pickers.d.ts +2 -0
- package/dist/types/datePickers/DateInput.d.ts +41 -0
- package/dist/types/datePickers/FormDateField.d.ts +7 -0
- package/dist/types/dates.d.ts +18 -0
- package/dist/types/dictionaries/dictionaries.d.ts +54 -0
- package/dist/types/downloads/DownloadManager.d.ts +7 -0
- package/dist/types/downloads/downloadQueue.d.ts +50 -0
- package/dist/types/downloads/downloadsMachine.d.ts +10 -0
- package/dist/types/downloads/fileTypes.d.ts +39 -0
- package/dist/types/downloads/index.d.ts +4 -0
- package/dist/types/excel/reportWorkbook.d.ts +157 -0
- package/dist/types/excel.d.ts +1 -0
- package/dist/types/feedback/ConfirmDialog.d.ts +31 -0
- package/dist/types/feedback/ModalWaiting.d.ts +13 -0
- package/dist/types/feedback/NewBuildNotice.d.ts +20 -0
- package/dist/types/feedback/StaleBuildBoundary.d.ts +21 -0
- package/dist/types/feedback/Toaster.d.ts +1 -0
- package/dist/types/feedback/confirmActionMachine.d.ts +19 -0
- package/dist/types/feedback/index.d.ts +8 -0
- package/dist/types/feedback/toast.d.ts +100 -0
- package/dist/types/feedback/useConfirmAction.d.ts +33 -0
- package/dist/types/filepond/FileDropzone.d.ts +61 -0
- package/dist/types/filepond/pondServer.d.ts +17 -0
- package/dist/types/filepond.d.ts +3 -0
- package/dist/types/files.d.ts +29 -0
- package/dist/types/formatting.d.ts +61 -0
- package/dist/types/forms/FormCatalogField.d.ts +6 -0
- package/dist/types/forms/FormColorField.d.ts +6 -0
- package/dist/types/forms/FormNumberField.d.ts +6 -0
- package/dist/types/forms/FormProblemAlert.d.ts +6 -0
- package/dist/types/forms/FormSelectField.d.ts +6 -0
- package/dist/types/forms/FormServerProblem.d.ts +8 -0
- package/dist/types/forms/FormTextField.d.ts +6 -0
- package/dist/types/forms/FormWizard.d.ts +22 -0
- package/dist/types/forms/SubmitButton.d.ts +9 -0
- package/dist/types/forms/applyServerProblem.d.ts +9 -0
- package/dist/types/forms/auth/ChangePasswordForm.d.ts +17 -0
- package/dist/types/forms/auth/ForgotPasswordForm.d.ts +14 -0
- package/dist/types/forms/auth/SignInForm.d.ts +20 -0
- package/dist/types/forms/index.d.ts +19 -0
- package/dist/types/forms/security/SecondStepForm.d.ts +30 -0
- package/dist/types/forms/security/TwoStepVerificationCard.d.ts +83 -0
- package/dist/types/forms/security/securityRules.d.ts +24 -0
- package/dist/types/forms/serverProblemFields.d.ts +19 -0
- package/dist/types/forms/useFormikField.d.ts +11 -0
- package/dist/types/forms/validation.d.ts +251 -0
- package/dist/types/forms/validationMessages.d.ts +12 -0
- package/dist/types/forms.d.ts +2 -0
- package/dist/types/hookForm/FormCatalogField.d.ts +8 -0
- package/dist/types/hookForm/FormColorField.d.ts +8 -0
- package/dist/types/hookForm/FormNumberField.d.ts +8 -0
- package/dist/types/hookForm/FormProblemAlert.d.ts +7 -0
- package/dist/types/hookForm/FormSelectField.d.ts +8 -0
- package/dist/types/hookForm/FormTextField.d.ts +8 -0
- package/dist/types/hookForm/FormWizard.d.ts +22 -0
- package/dist/types/hookForm/SubmitButton.d.ts +21 -0
- package/dist/types/hookForm/applyServerProblem.d.ts +10 -0
- package/dist/types/hookForm/useHookFormField.d.ts +13 -0
- package/dist/types/i18next.d.ts +1 -0
- package/dist/types/identifiers.d.ts +2 -0
- package/dist/types/inbox/InboxLayout.d.ts +38 -0
- package/dist/types/inbox/MessageList.d.ts +52 -0
- package/dist/types/inbox/MessageView.d.ts +55 -0
- package/dist/types/inbox/inboxDates.d.ts +11 -0
- package/dist/types/index.d.ts +91 -0
- package/dist/types/inputs/CatalogInput.d.ts +45 -0
- package/dist/types/inputs/ColorInput.d.ts +30 -0
- package/dist/types/inputs/FieldFrame.d.ts +14 -0
- package/dist/types/inputs/FormSection.d.ts +29 -0
- package/dist/types/inputs/NumberInput.d.ts +38 -0
- package/dist/types/inputs/SelectInput.d.ts +38 -0
- package/dist/types/inputs/TextInput.d.ts +62 -0
- package/dist/types/inputs/WizardLayout.d.ts +34 -0
- package/dist/types/inputs/colorContrast.d.ts +18 -0
- package/dist/types/inputs/formLayoutContext.d.ts +3 -0
- package/dist/types/inputs/numberText.d.ts +25 -0
- package/dist/types/kanban/KanbanBoard.d.ts +88 -0
- package/dist/types/kanban/kanbanCards.d.ts +22 -0
- package/dist/types/kanban/kanbanMoves.d.ts +38 -0
- package/dist/types/kanban.d.ts +3 -0
- package/dist/types/laravel/csrfRetry.d.ts +21 -0
- package/dist/types/laravel.d.ts +1 -0
- package/dist/types/lastListUrl.d.ts +20 -0
- package/dist/types/locales/en.d.ts +788 -0
- package/dist/types/locales/es.d.ts +788 -0
- package/dist/types/maps/MapView.d.ts +41 -0
- package/dist/types/maps/mapMarkers.d.ts +23 -0
- package/dist/types/maps.d.ts +2 -0
- package/dist/types/money/money.d.ts +203 -0
- package/dist/types/money.d.ts +1 -0
- package/dist/types/navigation/appMenu.d.ts +92 -0
- package/dist/types/navigation/useMenuBadges.d.ts +16 -0
- package/dist/types/navigation.d.ts +22 -0
- package/dist/types/navigationTrail.d.ts +49 -0
- package/dist/types/next.d.ts +1 -0
- package/dist/types/observability/buildWatch.d.ts +28 -0
- package/dist/types/observability/logger.d.ts +19 -0
- package/dist/types/observability/publishedBuild.d.ts +35 -0
- package/dist/types/observability/usePublishedBuildWatch.d.ts +18 -0
- package/dist/types/passkeys.d.ts +1 -0
- package/dist/types/periodRanges.d.ts +32 -0
- package/dist/types/problems.d.ts +31 -0
- package/dist/types/pwa/InstallAppSetting.d.ts +7 -0
- package/dist/types/pwa/InstallInstructionsDialog.d.ts +20 -0
- package/dist/types/pwa/InstallPromptBanner.d.ts +16 -0
- package/dist/types/pwa/installInstructions.d.ts +52 -0
- package/dist/types/pwa/useInstallPrompt.d.ts +13 -0
- package/dist/types/react-hook-form.d.ts +12 -0
- package/dist/types/react-router.d.ts +2 -0
- package/dist/types/security/ActivityLog.d.ts +33 -0
- package/dist/types/security/RecoveryCodesDialog.d.ts +16 -0
- package/dist/types/security/SessionsCard.d.ts +24 -0
- package/dist/types/security/passkeys.d.ts +18 -0
- package/dist/types/table.d.ts +3 -0
- package/dist/types/theme/androidDevice.d.ts +11 -0
- package/dist/types/theme/appleTracking.d.ts +17 -0
- package/dist/types/theme/components/MuiAppBar.d.ts +13 -0
- package/dist/types/theme/components/MuiBackdrop.d.ts +11 -0
- package/dist/types/theme/components/MuiButton.d.ts +27 -0
- package/dist/types/theme/components/MuiButtonBase.d.ts +14 -0
- package/dist/types/theme/components/MuiChip.d.ts +29 -0
- package/dist/types/theme/components/MuiDataGrid.d.ts +45 -0
- package/dist/types/theme/components/MuiDialog.d.ts +9 -0
- package/dist/types/theme/components/MuiDrawer.d.ts +13 -0
- package/dist/types/theme/components/MuiMenuItem.d.ts +17 -0
- package/dist/types/theme/components/MuiTypography.d.ts +20 -0
- package/dist/types/theme/components/glassComponents.d.ts +8 -0
- package/dist/types/theme/components/minimalComponents.d.ts +22 -0
- package/dist/types/theme/components/paletteOf.d.ts +5 -0
- package/dist/types/theme/createToolkitTheme.d.ts +48 -0
- package/dist/types/theme/glassSurface.d.ts +247 -0
- package/dist/types/theme/glassToasterStyles.d.ts +7 -0
- package/dist/types/theme/mergeComponents.d.ts +15 -0
- package/dist/types/theme/stackcraftPalette.d.ts +142 -0
- package/dist/types/theme/toolkitComponents.d.ts +4 -0
- package/dist/types/timeline.d.ts +2 -0
- package/dist/types/toolkit/ComponentTexts.d.ts +11 -0
- package/dist/types/toolkit/ToolkitProvider.d.ts +47 -0
- package/dist/types/toolkit/browserNavigation.d.ts +27 -0
- package/dist/types/toolkit/componentTextsContext.d.ts +20 -0
- package/dist/types/toolkit/hashNavigation.d.ts +12 -0
- package/dist/types/toolkit/navigationPaths.d.ts +43 -0
- package/dist/types/toolkit/toolkitContext.d.ts +28 -0
- package/dist/types/toolkit/toolkitSettings.d.ts +113 -0
- package/dist/types/toolkit/useFormatters.d.ts +6 -0
- package/dist/types/toolkit/useToolkitTranslation.d.ts +11 -0
- package/dist/types/ui/actions/ActionsMenu.d.ts +20 -0
- package/dist/types/ui/actions/CopyButton.d.ts +15 -0
- package/dist/types/ui/actions/DownloadMenu.d.ts +55 -0
- package/dist/types/ui/actions/SecretField.d.ts +17 -0
- package/dist/types/ui/actions/SelectionActions.d.ts +39 -0
- package/dist/types/ui/filters/DateRangeFilter.d.ts +18 -0
- package/dist/types/ui/filters/PeriodRangeSelector.d.ts +28 -0
- package/dist/types/ui/filters/QuickFilters.d.ts +23 -0
- package/dist/types/ui/filters/SegmentedControl.d.ts +44 -0
- package/dist/types/ui/index.d.ts +33 -0
- package/dist/types/ui/labels/DictionaryText.d.ts +7 -0
- package/dist/types/ui/labels/StatusChip.d.ts +21 -0
- package/dist/types/ui/labels/Tag.d.ts +19 -0
- package/dist/types/ui/labels/tagOf.d.ts +13 -0
- package/dist/types/ui/layout/CollapsibleSection.d.ts +18 -0
- package/dist/types/ui/layout/ContentDialog.d.ts +15 -0
- package/dist/types/ui/layout/DefinitionList.d.ts +15 -0
- package/dist/types/ui/layout/DetailHeader.d.ts +15 -0
- package/dist/types/ui/layout/ErrorPage.d.ts +35 -0
- package/dist/types/ui/layout/FullPageLoader.d.ts +7 -0
- package/dist/types/ui/layout/GlassLensFilter.d.ts +1 -0
- package/dist/types/ui/layout/GlassPanel.d.ts +11 -0
- package/dist/types/ui/layout/PageHeader.d.ts +15 -0
- package/dist/types/ui/layout/PageHeading.d.ts +20 -0
- package/dist/types/ui/layout/ProfileHeader.d.ts +17 -0
- package/dist/types/ui/layout/ScrollableRow.d.ts +33 -0
- package/dist/types/ui/layout/SectionCard.d.ts +11 -0
- package/dist/types/ui/layout/appBarHeight.d.ts +13 -0
- package/dist/types/ui/metrics/BarList.d.ts +25 -0
- package/dist/types/ui/metrics/CalendarHeatmap.d.ts +34 -0
- package/dist/types/ui/metrics/ChartTooltip.d.ts +11 -0
- package/dist/types/ui/metrics/ColumnChart.d.ts +47 -0
- package/dist/types/ui/metrics/LineChart.d.ts +41 -0
- package/dist/types/ui/metrics/MetricCard.d.ts +39 -0
- package/dist/types/ui/metrics/TableToggle.d.ts +14 -0
- package/dist/types/ui/metrics/barListLabels.d.ts +17 -0
- package/dist/types/ui/metrics/chartParts.d.ts +112 -0
- package/dist/types/ui/metrics/heatmapScale.d.ts +45 -0
- package/dist/types/ui/navigation/BackButton.d.ts +13 -0
- package/dist/types/ui/navigation/ColorSchemeToggle.d.ts +13 -0
- package/dist/types/ui/navigation/DocumentTitle.d.ts +6 -0
- package/dist/types/ui/navigation/FontSizeToggle.d.ts +11 -0
- package/dist/types/ui/navigation/LanguageToggle.d.ts +13 -0
- package/dist/types/ui/navigation/PageBreadcrumbs.d.ts +12 -0
- package/dist/types/ui/navigation/colorMode.d.ts +18 -0
- package/dist/types/ui/navigation/fontSizeLevels.d.ts +25 -0
- package/dist/types/ui/navigation/useFontSize.d.ts +10 -0
- package/dist/types/ui/timeline/GroupedTimeline.d.ts +41 -0
- package/dist/types/ui/timeline/timelineDot.d.ts +19 -0
- package/dist/types/upload/FileDropzone.d.ts +36 -0
- package/dist/types/upload/fileRules.d.ts +51 -0
- package/dist/types/upload/uploadMachine.d.ts +23 -0
- package/dist/types/upload/uploadWithProgress.d.ts +16 -0
- package/dist/ui/actions/ActionsMenu.js +51 -0
- package/dist/ui/actions/ActionsMenu.js.map +1 -0
- package/dist/ui/actions/CopyButton.js +28 -0
- package/dist/ui/actions/CopyButton.js.map +1 -0
- package/dist/ui/actions/DownloadMenu.js +162 -0
- package/dist/ui/actions/DownloadMenu.js.map +1 -0
- package/dist/ui/actions/SecretField.js +61 -0
- package/dist/ui/actions/SecretField.js.map +1 -0
- package/dist/ui/actions/SelectionActions.js +142 -0
- package/dist/ui/actions/SelectionActions.js.map +1 -0
- package/dist/ui/filters/DateRangeFilter.js +87 -0
- package/dist/ui/filters/DateRangeFilter.js.map +1 -0
- package/dist/ui/filters/PeriodRangeSelector.js +56 -0
- package/dist/ui/filters/PeriodRangeSelector.js.map +1 -0
- package/dist/ui/filters/QuickFilters.js +91 -0
- package/dist/ui/filters/QuickFilters.js.map +1 -0
- package/dist/ui/filters/SegmentedControl.js +80 -0
- package/dist/ui/filters/SegmentedControl.js.map +1 -0
- package/dist/ui/labels/DictionaryText.js +11 -0
- package/dist/ui/labels/DictionaryText.js.map +1 -0
- package/dist/ui/labels/StatusChip.js +52 -0
- package/dist/ui/labels/StatusChip.js.map +1 -0
- package/dist/ui/labels/Tag.js +26 -0
- package/dist/ui/labels/Tag.js.map +1 -0
- package/dist/ui/labels/tagOf.js +7 -0
- package/dist/ui/labels/tagOf.js.map +1 -0
- package/dist/ui/layout/CollapsibleSection.js +52 -0
- package/dist/ui/layout/CollapsibleSection.js.map +1 -0
- package/dist/ui/layout/ContentDialog.js +97 -0
- package/dist/ui/layout/ContentDialog.js.map +1 -0
- package/dist/ui/layout/DefinitionList.js +30 -0
- package/dist/ui/layout/DefinitionList.js.map +1 -0
- package/dist/ui/layout/DetailHeader.js +27 -0
- package/dist/ui/layout/DetailHeader.js.map +1 -0
- package/dist/ui/layout/ErrorPage.js +54 -0
- package/dist/ui/layout/ErrorPage.js.map +1 -0
- package/dist/ui/layout/FullPageLoader.js +13 -0
- package/dist/ui/layout/FullPageLoader.js.map +1 -0
- package/dist/ui/layout/GlassLensFilter.js +53 -0
- package/dist/ui/layout/GlassLensFilter.js.map +1 -0
- package/dist/ui/layout/GlassPanel.js +18 -0
- package/dist/ui/layout/GlassPanel.js.map +1 -0
- package/dist/ui/layout/PageHeader.js +23 -0
- package/dist/ui/layout/PageHeader.js.map +1 -0
- package/dist/ui/layout/PageHeading.js +51 -0
- package/dist/ui/layout/PageHeading.js.map +1 -0
- package/dist/ui/layout/ProfileHeader.js +64 -0
- package/dist/ui/layout/ProfileHeader.js.map +1 -0
- package/dist/ui/layout/ScrollableRow.js +156 -0
- package/dist/ui/layout/ScrollableRow.js.map +1 -0
- package/dist/ui/layout/SectionCard.js +18 -0
- package/dist/ui/layout/SectionCard.js.map +1 -0
- package/dist/ui/layout/appBarHeight.js +42 -0
- package/dist/ui/layout/appBarHeight.js.map +1 -0
- package/dist/ui/metrics/BarList.js +94 -0
- package/dist/ui/metrics/BarList.js.map +1 -0
- package/dist/ui/metrics/CalendarHeatmap.js +136 -0
- package/dist/ui/metrics/CalendarHeatmap.js.map +1 -0
- package/dist/ui/metrics/ChartTooltip.js +16 -0
- package/dist/ui/metrics/ChartTooltip.js.map +1 -0
- package/dist/ui/metrics/ColumnChart.js +106 -0
- package/dist/ui/metrics/ColumnChart.js.map +1 -0
- package/dist/ui/metrics/LineChart.js +117 -0
- package/dist/ui/metrics/LineChart.js.map +1 -0
- package/dist/ui/metrics/MetricCard.js +97 -0
- package/dist/ui/metrics/MetricCard.js.map +1 -0
- package/dist/ui/metrics/TableToggle.js +15 -0
- package/dist/ui/metrics/TableToggle.js.map +1 -0
- package/dist/ui/metrics/barListLabels.js +9 -0
- package/dist/ui/metrics/barListLabels.js.map +1 -0
- package/dist/ui/metrics/chartParts.js +93 -0
- package/dist/ui/metrics/chartParts.js.map +1 -0
- package/dist/ui/metrics/heatmapScale.js +67 -0
- package/dist/ui/metrics/heatmapScale.js.map +1 -0
- package/dist/ui/navigation/BackButton.js +28 -0
- package/dist/ui/navigation/BackButton.js.map +1 -0
- package/dist/ui/navigation/ColorSchemeToggle.js +40 -0
- package/dist/ui/navigation/ColorSchemeToggle.js.map +1 -0
- package/dist/ui/navigation/DocumentTitle.js +11 -0
- package/dist/ui/navigation/DocumentTitle.js.map +1 -0
- package/dist/ui/navigation/FontSizeToggle.js +41 -0
- package/dist/ui/navigation/FontSizeToggle.js.map +1 -0
- package/dist/ui/navigation/LanguageToggle.js +48 -0
- package/dist/ui/navigation/LanguageToggle.js.map +1 -0
- package/dist/ui/navigation/PageBreadcrumbs.js +51 -0
- package/dist/ui/navigation/PageBreadcrumbs.js.map +1 -0
- package/dist/ui/navigation/colorMode.js +13 -0
- package/dist/ui/navigation/colorMode.js.map +1 -0
- package/dist/ui/navigation/fontSizeLevels.js +24 -0
- package/dist/ui/navigation/fontSizeLevels.js.map +1 -0
- package/dist/ui/navigation/useFontSize.js +44 -0
- package/dist/ui/navigation/useFontSize.js.map +1 -0
- package/dist/ui/timeline/GroupedTimeline.js +106 -0
- package/dist/ui/timeline/GroupedTimeline.js.map +1 -0
- package/dist/ui/timeline/timelineDot.js +20 -0
- package/dist/ui/timeline/timelineDot.js.map +1 -0
- package/dist/upload/FileDropzone.js +145 -0
- package/dist/upload/FileDropzone.js.map +1 -0
- package/dist/upload/fileRules.js +62 -0
- package/dist/upload/fileRules.js.map +1 -0
- package/dist/upload/uploadMachine.js +73 -0
- package/dist/upload/uploadMachine.js.map +1 -0
- package/dist/upload/uploadWithProgress.js +45 -0
- package/dist/upload/uploadWithProgress.js.map +1 -0
- package/package.json +311 -5
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Las preguntas de «calcita new» en la terminal: cada una con sus opciones numeradas y la recomendada marcada; Enter acepta
|
|
2
|
+
// la recomendada. Una respuesta que no sirve se vuelve a preguntar con su motivo.
|
|
3
|
+
//
|
|
4
|
+
// Funciones de node, sin React: function (regla de la casa).
|
|
5
|
+
import {createInterface} from 'node:readline/promises';
|
|
6
|
+
import {stdin, stdout} from 'node:process';
|
|
7
|
+
|
|
8
|
+
import {QUESTIONS, problemWithAnswer} from './projectAnswers.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @param {Record<string, string>} recommendedAnswers las de defaultAnswersOf
|
|
12
|
+
* @param {Record<string, string>} [presetAnswers] las que ya llegaron como opciones: esas no se preguntan
|
|
13
|
+
* @returns {Promise<Record<string, string>>}
|
|
14
|
+
*/
|
|
15
|
+
export async function askQuestions(recommendedAnswers, presetAnswers = {}) {
|
|
16
|
+
const terminal = createInterface({input: stdin, output: stdout});
|
|
17
|
+
const answers = {...presetAnswers};
|
|
18
|
+
try {
|
|
19
|
+
for (const question of QUESTIONS) {
|
|
20
|
+
if (question.key in presetAnswers || (question.when && !question.when(answers))) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
answers[question.key] = question.options
|
|
24
|
+
? await askOption(terminal, question, recommendedAnswers[question.key])
|
|
25
|
+
: await askText(terminal, question, recommendedAnswers[question.key]);
|
|
26
|
+
}
|
|
27
|
+
} finally {
|
|
28
|
+
terminal.close();
|
|
29
|
+
}
|
|
30
|
+
return answers;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Una pregunta de opciones: se contesta con su número; Enter, la recomendada. */
|
|
34
|
+
async function askOption(terminal, question, recommendedValue) {
|
|
35
|
+
stdout.write(`\n${question.text}\n`);
|
|
36
|
+
question.options.forEach(([value, label], index) => {
|
|
37
|
+
stdout.write(` ${index + 1}) ${label}${value === recommendedValue ? ' ← recomendada' : ''}\n`);
|
|
38
|
+
});
|
|
39
|
+
for (;;) {
|
|
40
|
+
const reply = (await terminal.question('Número (Enter = recomendada): ')).trim();
|
|
41
|
+
if (reply === '') {
|
|
42
|
+
return recommendedValue;
|
|
43
|
+
}
|
|
44
|
+
const option = question.options[Number(reply) - 1];
|
|
45
|
+
if (option) {
|
|
46
|
+
return option[0];
|
|
47
|
+
}
|
|
48
|
+
stdout.write(`Escriba un número del 1 al ${question.options.length}.\n`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Una pregunta de texto; Enter, la recomendada (si hay). */
|
|
53
|
+
async function askText(terminal, question, recommendedValue) {
|
|
54
|
+
for (;;) {
|
|
55
|
+
const hint = recommendedValue ? ` [${recommendedValue}]` : '';
|
|
56
|
+
const reply = (await terminal.question(`\n${question.text}${hint}: `)).trim() || recommendedValue || '';
|
|
57
|
+
const problem = problemWithAnswer(question.key, reply);
|
|
58
|
+
if (!problem) {
|
|
59
|
+
return reply;
|
|
60
|
+
}
|
|
61
|
+
stdout.write(`${problem}\n`);
|
|
62
|
+
}
|
|
63
|
+
}
|
package/cli/calcita.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// El CLI de Calcita: arma un proyecto nuevo con preguntas y el esqueleto de módulos, pantallas, formularios y componentes,
|
|
3
|
+
// con la forma de los ejemplos (un módulo por carpeta, con su menú, sus rutas, sus textos y su API).
|
|
4
|
+
//
|
|
5
|
+
// npx @stackcraftmx/calcita new mi-tienda (o: pnpm dlx @stackcraftmx/calcita new mi-tienda)
|
|
6
|
+
// pnpm exec calcita make:module purchase-orders (dentro del proyecto)
|
|
7
|
+
//
|
|
8
|
+
// Solo node, sin dependencias: corre antes de que el proyecto tenga nada instalado. Los textos para la persona van en
|
|
9
|
+
// español; los nombres que escribe (módulos, pantallas…), en inglés y sin acentos, como el resto del código.
|
|
10
|
+
//
|
|
11
|
+
// OJO: los imports del CLI van con «./» y no con el alias @/: el CLI se publica tal cual y node no conoce el alias.
|
|
12
|
+
import {basename, resolve} from 'node:path';
|
|
13
|
+
import {argv, cwd, exit, stdin, stdout} from 'node:process';
|
|
14
|
+
import {parseArgs} from 'node:util';
|
|
15
|
+
|
|
16
|
+
import {askQuestions} from './askQuestions.js';
|
|
17
|
+
import {makeComponent} from './makeComponent.js';
|
|
18
|
+
import {makeForm} from './makeForm.js';
|
|
19
|
+
import {makeModule} from './makeModule.js';
|
|
20
|
+
import {makePage} from './makePage.js';
|
|
21
|
+
import {namesOf} from './names.js';
|
|
22
|
+
import {newProject} from './newProject.js';
|
|
23
|
+
import {QUESTIONS, answersFromFlags, checkedAnswers, defaultAnswersOf} from './projectAnswers.js';
|
|
24
|
+
import {screenLabelsOf} from './screenLabels.js';
|
|
25
|
+
import {CliError} from './templateFiles.js';
|
|
26
|
+
|
|
27
|
+
const HELP = `Calcita: proyectos y esqueletos con la forma de los ejemplos.
|
|
28
|
+
|
|
29
|
+
calcita new <carpeta> un proyecto nuevo (pregunta cómo lo quiere)
|
|
30
|
+
calcita init lo mismo, en la carpeta actual (vacía)
|
|
31
|
+
calcita make:module <módulo> un módulo: menú, ruta, pantalla, formulario, API, textos y servidor de mentira
|
|
32
|
+
calcita make:page <módulo> <Pantalla> otra pantalla en un módulo, con su ruta
|
|
33
|
+
calcita make:form <módulo> <Formulario> un formulario con sus reglas y sus textos
|
|
34
|
+
calcita make:component <Componente> un componente en src/core (lo usan varios módulos)
|
|
35
|
+
--module <módulo> … o solo de un módulo
|
|
36
|
+
|
|
37
|
+
Opciones:
|
|
38
|
+
-y, --yes sin preguntas: lo recomendado, más lo que diga cada opción
|
|
39
|
+
--label-es, --label-en el nombre en pantalla de un módulo o una pantalla nueva
|
|
40
|
+
${QUESTIONS.map((question) => ` --${namesOf(question.key).kebab}=${question.options ? question.options.map(([value]) => value).join('|') : '…'}`).join('\n')}
|
|
41
|
+
|
|
42
|
+
Los nombres van en inglés y sin acentos (purchase-orders, OrderDetail); el texto en pantalla, con --label-es y --label-en.`;
|
|
43
|
+
|
|
44
|
+
// las respuestas de «new» también llegan como opciones: --menu-position=top
|
|
45
|
+
const ANSWER_OPTIONS = Object.fromEntries(QUESTIONS.map((question) => [namesOf(question.key).kebab, {type: 'string'}]));
|
|
46
|
+
|
|
47
|
+
const {values: options, positionals} = parseArgs({
|
|
48
|
+
args: argv.slice(2),
|
|
49
|
+
allowPositionals: true,
|
|
50
|
+
options: {
|
|
51
|
+
'yes': {type: 'boolean', short: 'y'},
|
|
52
|
+
'help': {type: 'boolean', short: 'h'},
|
|
53
|
+
'module': {type: 'string'},
|
|
54
|
+
'label-es': {type: 'string'},
|
|
55
|
+
'label-en': {type: 'string'},
|
|
56
|
+
...ANSWER_OPTIONS,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
const [command, ...commandArguments] = positionals;
|
|
60
|
+
// se pregunta solo en una terminal de verdad y sin --yes (en un script se usa lo recomendado)
|
|
61
|
+
const canAsk = Boolean(stdin.isTTY) && !options.yes;
|
|
62
|
+
|
|
63
|
+
/** Las respuestas que llegaron como opciones, con la llave de su pregunta (menuPosition). */
|
|
64
|
+
function answersInOptions() {
|
|
65
|
+
return Object.fromEntries(QUESTIONS
|
|
66
|
+
.map((question) => [question.key, options[namesOf(question.key).kebab]])
|
|
67
|
+
.filter(([, value]) => value !== undefined));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Imprime lo escrito, una ruta por renglón. */
|
|
71
|
+
function printWritten(written) {
|
|
72
|
+
stdout.write(`${written.map((path) => ` + ${path}`).join('\n')}\n`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function runNew(folder) {
|
|
76
|
+
if (!folder) {
|
|
77
|
+
throw new CliError('Falta la carpeta del proyecto: calcita new mi-tienda');
|
|
78
|
+
}
|
|
79
|
+
const folderName = basename(resolve(folder));
|
|
80
|
+
const presetAnswers = answersInOptions();
|
|
81
|
+
const answers = canAsk
|
|
82
|
+
? checkedAnswers({...defaultAnswersOf(folderName), ...presetAnswers, ...await askQuestions({...defaultAnswersOf(folderName), ...presetAnswers}, presetAnswers)})
|
|
83
|
+
: answersFromFlags(folderName, presetAnswers);
|
|
84
|
+
const {projectRoot, written} = await newProject({folder, answers});
|
|
85
|
+
stdout.write(`\nListo: ${projectRoot}\n`);
|
|
86
|
+
printWritten(written);
|
|
87
|
+
const enterFolder = folder === '.' ? '' : ` cd ${folder}\n`;
|
|
88
|
+
stdout.write(`\nPara arrancar:\n${enterFolder} pnpm install\n pnpm dev\n`);
|
|
89
|
+
if (answers.auth === 'yes') {
|
|
90
|
+
stdout.write('\nEn la pantalla de entrar, «Entrar con la cuenta de ejemplo» entra sin escribir nada (servidor de mentira).\n');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function runMakeModule(moduleName) {
|
|
95
|
+
const labels = await screenLabelsOf({
|
|
96
|
+
defaultLabel: namesOf(moduleName ?? 'module').human, labelEs: options['label-es'], labelEn: options['label-en'], canAsk, what: 'el módulo',
|
|
97
|
+
});
|
|
98
|
+
const {written, path} = await makeModule({projectRoot: cwd(), moduleName, labels});
|
|
99
|
+
printWritten(written);
|
|
100
|
+
stdout.write(`\nListo: ya sale en el menú y en ${path}.\n`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function runMakePage(moduleName, pageName) {
|
|
104
|
+
const labels = await screenLabelsOf({
|
|
105
|
+
defaultLabel: namesOf(pageName ?? 'page').human, labelEs: options['label-es'], labelEn: options['label-en'], canAsk, what: 'la pantalla',
|
|
106
|
+
});
|
|
107
|
+
const {written, path, manualLines} = await makePage({projectRoot: cwd(), moduleName, pageName, labels});
|
|
108
|
+
printWritten(written);
|
|
109
|
+
if (manualLines) {
|
|
110
|
+
stdout.write(`\nNo reconocí la forma de routes.js del módulo: agregue a mano estos renglones (la constante y la ruta):\n${manualLines.join('\n')}\n`);
|
|
111
|
+
}
|
|
112
|
+
stdout.write(`\nListo: la pantalla está en ${path}.\n`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function runMakeForm(moduleName, formName) {
|
|
116
|
+
const written = await makeForm({projectRoot: cwd(), moduleName, formName});
|
|
117
|
+
printWritten(written);
|
|
118
|
+
// el componente es el .jsx que se escribió: la pantalla le dice qué hacer con los datos
|
|
119
|
+
const componentName = written.find((path) => path.endsWith('.jsx'))?.split('/').at(-1).replace('.jsx', '');
|
|
120
|
+
stdout.write(`\nListo. En una pantalla del módulo: <${componentName} onSubmit={addRecord} onSaved={showSaved} /> (las funciones de su *Api.js).\n`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function runMakeComponent(componentName) {
|
|
124
|
+
printWritten(await makeComponent({projectRoot: cwd(), componentName, moduleName: options.module}));
|
|
125
|
+
stdout.write('\nListo.\n');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const COMMANDS = Object.freeze({
|
|
129
|
+
'new': runNew,
|
|
130
|
+
'init': () => runNew('.'),
|
|
131
|
+
'make:module': runMakeModule,
|
|
132
|
+
'make:page': runMakePage,
|
|
133
|
+
'make:form': runMakeForm,
|
|
134
|
+
'make:component': runMakeComponent,
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
const run = COMMANDS[command];
|
|
139
|
+
if (options.help || !command) {
|
|
140
|
+
stdout.write(`${HELP}\n`);
|
|
141
|
+
} else if (!run) {
|
|
142
|
+
throw new CliError(`No conozco el comando «${command}». Vea: calcita --help`);
|
|
143
|
+
} else {
|
|
144
|
+
await run(...commandArguments);
|
|
145
|
+
}
|
|
146
|
+
} catch (error) {
|
|
147
|
+
// un error que se le explica a la persona sale solo con su mensaje; uno del CLI, completo (para reportarlo)
|
|
148
|
+
stdout.write(error instanceof CliError ? `\n${error.message}\n` : `\n${error.stack}\n`);
|
|
149
|
+
exit(1);
|
|
150
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// calcita make:component <Componente> [--module <módulo>]: un componente nuevo.
|
|
2
|
+
//
|
|
3
|
+
// - Sin --module va a src/core (lo usan dos o más módulos) y se agrega a la puerta de core (src/core/index.js): se
|
|
4
|
+
// importa de '@/core'. Es genérico y sin estado: function.
|
|
5
|
+
// - Con --module va a src/modules/<módulo>/components (solo de ese módulo): arrow.
|
|
6
|
+
//
|
|
7
|
+
// Funciones de node, sin React: function (regla de la casa).
|
|
8
|
+
import {access, appendFile} from 'node:fs/promises';
|
|
9
|
+
import {join} from 'node:path';
|
|
10
|
+
import {fileURLToPath} from 'node:url';
|
|
11
|
+
|
|
12
|
+
import {existingModuleOf} from './makeForm.js';
|
|
13
|
+
import {isValidName, namesOf} from './names.js';
|
|
14
|
+
import {CliError, copyTemplateFolder} from './templateFiles.js';
|
|
15
|
+
|
|
16
|
+
const COMPONENT_TEMPLATES = fileURLToPath(new URL('templates/component/', import.meta.url));
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param {object} options
|
|
20
|
+
* @param {string} options.projectRoot
|
|
21
|
+
* @param {string} options.componentName
|
|
22
|
+
* @param {string} [options.moduleName] sin él, a core
|
|
23
|
+
* @returns {Promise<string[]>} las rutas escritas, relativas al proyecto
|
|
24
|
+
*/
|
|
25
|
+
export async function makeComponent({projectRoot, componentName, moduleName}) {
|
|
26
|
+
if (!isValidName(componentName ?? '')) {
|
|
27
|
+
throw new CliError('Falta el nombre del componente, en inglés y sin acentos (p. ej. StatusBadge).');
|
|
28
|
+
}
|
|
29
|
+
const componentNames = namesOf(componentName);
|
|
30
|
+
|
|
31
|
+
if (moduleName) {
|
|
32
|
+
const {folder, names: moduleNames} = await existingModuleOf(projectRoot, moduleName);
|
|
33
|
+
const written = await copyTemplateFolder({
|
|
34
|
+
templateFolder: join(COMPONENT_TEMPLATES, 'module'), targetFolder: join(folder, 'components'),
|
|
35
|
+
values: {ComponentName: componentNames.pascal, module: moduleNames.camel},
|
|
36
|
+
});
|
|
37
|
+
return written.map((path) => `src/modules/${moduleNames.camel}/components/${path}`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const coreFolder = join(projectRoot, 'src', 'core');
|
|
41
|
+
const coreIndex = join(coreFolder, 'index.js');
|
|
42
|
+
await access(coreIndex).catch(() => {
|
|
43
|
+
throw new CliError('No encontré src/core/index.js (la puerta de core).');
|
|
44
|
+
});
|
|
45
|
+
const written = await copyTemplateFolder({
|
|
46
|
+
templateFolder: join(COMPONENT_TEMPLATES, 'core'), targetFolder: coreFolder, values: {ComponentName: componentNames.pascal},
|
|
47
|
+
});
|
|
48
|
+
await appendFile(coreIndex, `export {${componentNames.pascal}} from '@/core/${componentNames.pascal}.jsx';\n`);
|
|
49
|
+
return [...written.map((path) => `src/core/${path}`), 'src/core/index.js (se agregó a la puerta de core)'];
|
|
50
|
+
}
|
package/cli/makeForm.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// calcita make:form <módulo> <Formulario>: un formulario dentro de un módulo, con la librería del proyecto (formik o
|
|
2
|
+
// react-hook-form, la de calcita.json): el componente, sus reglas (yup) y sus textos.
|
|
3
|
+
//
|
|
4
|
+
// calcita make:form contacts ContactForm
|
|
5
|
+
// → src/modules/contacts/ContactForm.jsx, contactFormSchema.js, contactFormTexts.js
|
|
6
|
+
//
|
|
7
|
+
// El formulario no sabe del servidor: la pantalla le pasa qué hacer con los datos (onSubmit).
|
|
8
|
+
//
|
|
9
|
+
// Funciones de node, sin React: function (regla de la casa).
|
|
10
|
+
import {access} from 'node:fs/promises';
|
|
11
|
+
import {join} from 'node:path';
|
|
12
|
+
import {fileURLToPath} from 'node:url';
|
|
13
|
+
|
|
14
|
+
import {isValidName, namesOf, withoutSuffixWord} from './names.js';
|
|
15
|
+
import {readProjectConfig} from './projectConfig.js';
|
|
16
|
+
import {CliError, copyTemplateFolder} from './templateFiles.js';
|
|
17
|
+
|
|
18
|
+
const FORM_TEMPLATES = fileURLToPath(new URL('templates/form/', import.meta.url));
|
|
19
|
+
// la carpeta de plantillas de cada librería de formularios
|
|
20
|
+
const TEMPLATE_FOLDER_OF_LIBRARY = Object.freeze({'formik': 'formik', 'react-hook-form': 'hookForm'});
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* La carpeta del módulo, que ya debe existir.
|
|
24
|
+
*
|
|
25
|
+
* @param {string} projectRoot
|
|
26
|
+
* @param {string} moduleName como lo escribió la persona
|
|
27
|
+
* @returns {Promise<{folder: string, names: ReturnType<typeof namesOf>}>}
|
|
28
|
+
*/
|
|
29
|
+
export async function existingModuleOf(projectRoot, moduleName) {
|
|
30
|
+
if (!isValidName(moduleName ?? '')) {
|
|
31
|
+
throw new CliError('Falta el módulo, en inglés y sin acentos (p. ej. contacts).');
|
|
32
|
+
}
|
|
33
|
+
const names = namesOf(moduleName);
|
|
34
|
+
const folder = join(projectRoot, 'src', 'modules', names.camel);
|
|
35
|
+
try {
|
|
36
|
+
await access(folder);
|
|
37
|
+
} catch {
|
|
38
|
+
throw new CliError(`No existe el módulo src/modules/${names.camel}. Créelo antes con: calcita make:module ${names.kebab}`);
|
|
39
|
+
}
|
|
40
|
+
return {folder, names};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param {object} options
|
|
45
|
+
* @param {string} options.projectRoot
|
|
46
|
+
* @param {string} options.moduleName
|
|
47
|
+
* @param {string} options.formName «ContactForm» o «contact» (se le agrega Form)
|
|
48
|
+
* @returns {Promise<string[]>} las rutas escritas, relativas al proyecto
|
|
49
|
+
*/
|
|
50
|
+
export async function makeForm({projectRoot, moduleName, formName}) {
|
|
51
|
+
const {folder, names: moduleNames} = await existingModuleOf(projectRoot, moduleName);
|
|
52
|
+
if (!isValidName(formName ?? '')) {
|
|
53
|
+
throw new CliError('Falta el nombre del formulario, en inglés y sin acentos (p. ej. ContactForm).');
|
|
54
|
+
}
|
|
55
|
+
const {forms} = await readProjectConfig(projectRoot);
|
|
56
|
+
const libraryFolder = TEMPLATE_FOLDER_OF_LIBRARY[forms];
|
|
57
|
+
if (!libraryFolder) {
|
|
58
|
+
throw new CliError(`calcita.json dice forms: «${forms}»; use formik o react-hook-form.`);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const formNames = namesOf(`${withoutSuffixWord(formName, 'form')} form`);
|
|
62
|
+
const values = {module: moduleNames.camel, FormName: formNames.pascal, formName: formNames.camel, FORM_NAME: formNames.constant};
|
|
63
|
+
const written = [
|
|
64
|
+
...await copyTemplateFolder({templateFolder: join(FORM_TEMPLATES, 'shared'), targetFolder: folder, values}),
|
|
65
|
+
...await copyTemplateFolder({templateFolder: join(FORM_TEMPLATES, libraryFolder), targetFolder: folder, values}),
|
|
66
|
+
];
|
|
67
|
+
return written.map((path) => `src/modules/${moduleNames.camel}/${path}`);
|
|
68
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// calcita make:module <nombre>: un módulo nuevo con la forma de los demás, en su carpeta y sin tocar ningún otro archivo:
|
|
2
|
+
// su entrada en el menú (menu.js), su ruta (routes.js), su pantalla con la lista y el formulario para agregar, su API (la
|
|
3
|
+
// única puerta al servidor), sus textos en español e inglés y su servidor de mentira (src/fakeServer).
|
|
4
|
+
//
|
|
5
|
+
// calcita make:module purchase-orders
|
|
6
|
+
// → src/modules/purchaseOrders/… y src/fakeServer/purchaseOrdersServer.js, en /purchase-orders
|
|
7
|
+
//
|
|
8
|
+
// El menú, las rutas y los textos se descubren solos (import.meta.glob): el módulo sale en la app sin más ediciones.
|
|
9
|
+
//
|
|
10
|
+
// Funciones de node, sin React: function (regla de la casa).
|
|
11
|
+
import {access, readFile, readdir} from 'node:fs/promises';
|
|
12
|
+
import {join} from 'node:path';
|
|
13
|
+
import {fileURLToPath} from 'node:url';
|
|
14
|
+
|
|
15
|
+
import {makeForm} from './makeForm.js';
|
|
16
|
+
import {isValidName, namesOf} from './names.js';
|
|
17
|
+
import {CliError, copyTemplateFolder} from './templateFiles.js';
|
|
18
|
+
|
|
19
|
+
const MODULE_TEMPLATES = fileURLToPath(new URL('templates/module/', import.meta.url));
|
|
20
|
+
const MODULE_SERVER_TEMPLATES = fileURLToPath(new URL('templates/moduleServer/', import.meta.url));
|
|
21
|
+
// el orden de un módulo nuevo: después del último, con espacio para meter otros en medio
|
|
22
|
+
const ORDER_STEP = 10;
|
|
23
|
+
const ORDER_PATTERN = /export const order = (\d+);/;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* El lugar en el menú para el módulo nuevo: el siguiente múltiplo de 10 después del mayor que ya hay.
|
|
27
|
+
*
|
|
28
|
+
* @param {string} projectRoot
|
|
29
|
+
* @returns {Promise<number>}
|
|
30
|
+
*/
|
|
31
|
+
async function nextMenuOrderOf(projectRoot) {
|
|
32
|
+
const modulesFolder = join(projectRoot, 'src', 'modules');
|
|
33
|
+
const orders = [];
|
|
34
|
+
for (const moduleFolder of await readdir(modulesFolder)) {
|
|
35
|
+
try {
|
|
36
|
+
const match = ORDER_PATTERN.exec(await readFile(join(modulesFolder, moduleFolder, 'menu.js'), 'utf8'));
|
|
37
|
+
if (match) {
|
|
38
|
+
orders.push(Number(match[1]));
|
|
39
|
+
}
|
|
40
|
+
} catch {
|
|
41
|
+
// un módulo sin menu.js (las pantallas de entrar): no cuenta
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return (Math.floor(Math.max(0, ...orders) / ORDER_STEP) + 1) * ORDER_STEP;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @param {object} options
|
|
49
|
+
* @param {string} options.projectRoot
|
|
50
|
+
* @param {string} options.moduleName como lo escribió la persona
|
|
51
|
+
* @param {{es: string, en: string}} options.labels su nombre en pantalla
|
|
52
|
+
* @returns {Promise<{written: string[], path: string}>} las rutas escritas (relativas al proyecto) y su dirección en la app
|
|
53
|
+
*/
|
|
54
|
+
export async function makeModule({projectRoot, moduleName, labels}) {
|
|
55
|
+
if (!isValidName(moduleName ?? '')) {
|
|
56
|
+
throw new CliError('Falta el nombre del módulo, en inglés y sin acentos (p. ej. purchase-orders).');
|
|
57
|
+
}
|
|
58
|
+
const names = namesOf(moduleName);
|
|
59
|
+
const moduleFolder = join(projectRoot, 'src', 'modules', names.camel);
|
|
60
|
+
const exists = await access(moduleFolder).then(() => true, () => false);
|
|
61
|
+
if (exists) {
|
|
62
|
+
throw new CliError(`Ya existe src/modules/${names.camel}; no se tocó nada.`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const values = {
|
|
66
|
+
name: names.camel, Name: names.pascal, NAME: names.constant, kebab: names.kebab,
|
|
67
|
+
LABEL_ES: labels.es, LABEL_EN: labels.en, ORDER: String(await nextMenuOrderOf(projectRoot)),
|
|
68
|
+
};
|
|
69
|
+
const moduleFiles = await copyTemplateFolder({templateFolder: MODULE_TEMPLATES, targetFolder: moduleFolder, values});
|
|
70
|
+
const serverFiles = await copyTemplateFolder({templateFolder: MODULE_SERVER_TEMPLATES, targetFolder: join(projectRoot, 'src', 'fakeServer'), values});
|
|
71
|
+
// su formulario, con la librería del proyecto: el mismo que arma «calcita make:form»
|
|
72
|
+
const formFiles = await makeForm({projectRoot, moduleName: names.camel, formName: `${names.pascal}Form`});
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
written: [...moduleFiles.map((path) => `src/modules/${names.camel}/${path}`), ...serverFiles.map((path) => `src/fakeServer/${path}`), ...formFiles],
|
|
76
|
+
path: `/${names.kebab}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
package/cli/makePage.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// calcita make:page <módulo> <Pantalla>: otra pantalla dentro de un módulo: el componente, sus textos y su ruta (se agrega
|
|
2
|
+
// a routes.js del módulo, con su constante _PATH).
|
|
3
|
+
//
|
|
4
|
+
// calcita make:page contacts ContactDetail
|
|
5
|
+
// → src/modules/contacts/ContactDetailPage.jsx y contactDetailPageTexts.js, en /contacts/contact-detail
|
|
6
|
+
//
|
|
7
|
+
// Si routes.js ya no tiene la forma de la plantilla (alguien lo cambió), no se adivina: se dice qué renglones agregar.
|
|
8
|
+
//
|
|
9
|
+
// Funciones de node, sin React: function (regla de la casa).
|
|
10
|
+
import {readFile, writeFile} from 'node:fs/promises';
|
|
11
|
+
import {join} from 'node:path';
|
|
12
|
+
import {fileURLToPath} from 'node:url';
|
|
13
|
+
|
|
14
|
+
import {existingModuleOf} from './makeForm.js';
|
|
15
|
+
import {isValidName, namesOf, withoutSuffixWord} from './names.js';
|
|
16
|
+
import {CliError, copyTemplateFolder, insertAfterLastMatch, insertIntoArray} from './templateFiles.js';
|
|
17
|
+
|
|
18
|
+
const PAGE_TEMPLATES = fileURLToPath(new URL('templates/page/', import.meta.url));
|
|
19
|
+
const PATH_CONSTANT_LINE = /^export const \w+_PATH = '([^']*)';$/m;
|
|
20
|
+
const ROUTES_DECLARATION = 'export const routes = [';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @param {object} options
|
|
24
|
+
* @param {string} options.projectRoot
|
|
25
|
+
* @param {string} options.moduleName
|
|
26
|
+
* @param {string} options.pageName «ContactDetail» o «ContactDetailPage»
|
|
27
|
+
* @param {{es: string, en: string}} options.labels su título en pantalla
|
|
28
|
+
* @returns {Promise<{written: string[], path: string, manualLines: string[]|null}>} manualLines: los renglones que hay
|
|
29
|
+
* que agregar a mano a routes.js si no se pudo
|
|
30
|
+
*/
|
|
31
|
+
export async function makePage({projectRoot, moduleName, pageName, labels}) {
|
|
32
|
+
const {folder, names: moduleNames} = await existingModuleOf(projectRoot, moduleName);
|
|
33
|
+
if (!isValidName(pageName ?? '')) {
|
|
34
|
+
throw new CliError('Falta el nombre de la pantalla, en inglés y sin acentos (p. ej. ContactDetail).');
|
|
35
|
+
}
|
|
36
|
+
const pageNames = namesOf(withoutSuffixWord(pageName, 'page'));
|
|
37
|
+
const routesFile = join(folder, 'routes.js');
|
|
38
|
+
const routesText = await readFile(routesFile, 'utf8').catch(() => {
|
|
39
|
+
throw new CliError(`El módulo ${moduleNames.camel} no tiene routes.js.`);
|
|
40
|
+
});
|
|
41
|
+
// la dirección del módulo (su primera constante _PATH) y la de la pantalla, debajo
|
|
42
|
+
const modulePath = PATH_CONSTANT_LINE.exec(routesText)?.[1] ?? `/${moduleNames.kebab}`;
|
|
43
|
+
const pagePath = `${modulePath.replace(/\/$/, '')}/${pageNames.kebab}`;
|
|
44
|
+
|
|
45
|
+
const values = {
|
|
46
|
+
module: moduleNames.camel, PageName: pageNames.pascal, pageName: pageNames.camel, PAGE_NAME: pageNames.constant,
|
|
47
|
+
PAGE_LABEL_ES: labels.es, PAGE_LABEL_EN: labels.en,
|
|
48
|
+
};
|
|
49
|
+
const written = (await copyTemplateFolder({templateFolder: PAGE_TEMPLATES, targetFolder: folder, values}))
|
|
50
|
+
.map((path) => `src/modules/${moduleNames.camel}/${path}`);
|
|
51
|
+
|
|
52
|
+
const pathLine = `export const ${pageNames.constant}_PATH = '${pagePath}';`;
|
|
53
|
+
const routeLine = ` {path: ${pageNames.constant}_PATH, lazy: async () => ({Component: (await import('@/modules/${moduleNames.camel}/${pageNames.pascal}Page.jsx')).${pageNames.pascal}Page})},`;
|
|
54
|
+
const withPath = insertAfterLastMatch(routesText, PATH_CONSTANT_LINE, pathLine);
|
|
55
|
+
const withRoute = withPath && insertIntoArray(withPath, ROUTES_DECLARATION, routeLine);
|
|
56
|
+
if (!withRoute) {
|
|
57
|
+
return {written, path: pagePath, manualLines: [pathLine, routeLine]};
|
|
58
|
+
}
|
|
59
|
+
await writeFile(routesFile, withRoute);
|
|
60
|
+
written.push(`src/modules/${moduleNames.camel}/routes.js (se agregó su ruta)`);
|
|
61
|
+
return {written, path: pagePath, manualLines: null};
|
|
62
|
+
}
|
package/cli/names.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Los nombres que salen de lo que escribe la persona («purchase-orders», «PurchaseOrders», «purchase orders»). Cada parte
|
|
2
|
+
// del proyecto pide el suyo: la carpeta y el namespace de textos en camelCase, el componente en PascalCase, la ruta en
|
|
3
|
+
// kebab-case y la constante en MAYÚSCULAS. Se arman aquí, en un solo lugar, para que no salgan distintos de un archivo a otro.
|
|
4
|
+
//
|
|
5
|
+
// Funciones puras: function (regla de la casa). Pruebas en names.test.js.
|
|
6
|
+
|
|
7
|
+
// una palabra: minúsculas con números («orders2»), una con mayúscula inicial («Orders») o unas siglas («PDF»)
|
|
8
|
+
const WORD_PATTERN = /[A-Z]?[a-z0-9]+|[A-Z]+(?![a-z])/g;
|
|
9
|
+
// lo que se acepta: letras sin acentos, números, espacios, guiones; empieza con letra. Los nombres van en inglés (regla de
|
|
10
|
+
// la casa) y un acento en el nombre de un archivo o de una variable da problemas entre sistemas
|
|
11
|
+
const NAME_PATTERN = /^[A-Za-z][A-Za-z0-9 _-]*$/;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Las palabras del nombre, en minúsculas: «PurchaseOrders» y «purchase-orders» dan ['purchase', 'orders'].
|
|
15
|
+
*
|
|
16
|
+
* @param {string} text
|
|
17
|
+
* @returns {string[]}
|
|
18
|
+
*/
|
|
19
|
+
export function wordsOf(text) {
|
|
20
|
+
return (text.match(WORD_PATTERN) ?? []).map((word) => word.toLowerCase());
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* ¿Se puede usar como nombre de módulo, pantalla, formulario o componente?
|
|
25
|
+
*
|
|
26
|
+
* @param {string} text
|
|
27
|
+
* @returns {boolean}
|
|
28
|
+
*/
|
|
29
|
+
export function isValidName(text) {
|
|
30
|
+
return typeof text === 'string' && NAME_PATTERN.test(text.trim()) && wordsOf(text).length > 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const capitalized = (word) => word.charAt(0).toUpperCase() + word.slice(1);
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Todas las formas del nombre.
|
|
37
|
+
*
|
|
38
|
+
* @param {string} text
|
|
39
|
+
* @returns {{camel: string, pascal: string, kebab: string, constant: string, human: string}} human: «Purchase orders»,
|
|
40
|
+
* para un texto de pantalla por omisión
|
|
41
|
+
*/
|
|
42
|
+
export function namesOf(text) {
|
|
43
|
+
const words = wordsOf(text);
|
|
44
|
+
return {
|
|
45
|
+
camel: words[0] + words.slice(1).map(capitalized).join(''),
|
|
46
|
+
pascal: words.map(capitalized).join(''),
|
|
47
|
+
kebab: words.join('-'),
|
|
48
|
+
constant: words.join('_').toUpperCase(),
|
|
49
|
+
human: capitalized(words.join(' ')),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* El nombre sin una palabra del final que el CLI ya agrega: «OrderDetailPage» con 'page' da «OrderDetail» (si no, el
|
|
55
|
+
* componente saldría «OrderDetailPagePage»).
|
|
56
|
+
*
|
|
57
|
+
* @param {string} text
|
|
58
|
+
* @param {string} suffixWord en minúsculas
|
|
59
|
+
* @returns {string}
|
|
60
|
+
*/
|
|
61
|
+
export function withoutSuffixWord(text, suffixWord) {
|
|
62
|
+
const words = wordsOf(text);
|
|
63
|
+
return words.length > 1 && words.at(-1) === suffixWord ? words.slice(0, -1).join('-') : text;
|
|
64
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// calcita new <carpeta>: un proyecto nuevo de Vite + React + MUI con Calcita, armado con lo que se contestó (projectAnswers.js):
|
|
2
|
+
// el marco con su menú, el tema, los textos en español e inglés, las rutas que se descubren solas, el servidor de
|
|
3
|
+
// mentira, las pantallas de entrar (si se pidieron) y un módulo de ejemplo (contacts) hecho con «make:module».
|
|
4
|
+
//
|
|
5
|
+
// Nunca escribe en una carpeta con archivos: si ya existe y no está vacía, se detiene sin tocar nada.
|
|
6
|
+
//
|
|
7
|
+
// Funciones de node, sin React: function (regla de la casa).
|
|
8
|
+
import {mkdir, readdir} from 'node:fs/promises';
|
|
9
|
+
import {basename, join, resolve} from 'node:path';
|
|
10
|
+
import {fileURLToPath} from 'node:url';
|
|
11
|
+
|
|
12
|
+
import {makeModule} from './makeModule.js';
|
|
13
|
+
import {isValidName, namesOf} from './names.js';
|
|
14
|
+
import {calcitaPackageJson} from './packageVersions.js';
|
|
15
|
+
import {primaryColorOf, templateFlagsOf} from './projectAnswers.js';
|
|
16
|
+
import {projectConfigOf, PROJECT_CONFIG_FILE} from './projectConfig.js';
|
|
17
|
+
import {appThemeFileOf, packageJsonOf} from './projectFiles.js';
|
|
18
|
+
import {CliError, copyTemplateFolder, writeNewFile} from './templateFiles.js';
|
|
19
|
+
|
|
20
|
+
const PROJECT_TEMPLATES = fileURLToPath(new URL('templates/project/', import.meta.url));
|
|
21
|
+
// los archivos (o carpetas, con «/» al final) que solo van con una opción prendida
|
|
22
|
+
const FILES_ONLY_WITH = Object.freeze({
|
|
23
|
+
'public/manifest.webmanifest.tpl': 'pwa',
|
|
24
|
+
'public/icons/': 'pwa',
|
|
25
|
+
'src/app/i18n.js.tpl': 'i18next',
|
|
26
|
+
'src/core/accountConnector.js.tpl': 'auth',
|
|
27
|
+
'src/modules/auth/': 'auth',
|
|
28
|
+
'src/modules/profile/': 'auth',
|
|
29
|
+
});
|
|
30
|
+
// lo que puede haber en una carpeta «vacía» (la de un repo recién clonado)
|
|
31
|
+
const IGNORED_IN_EMPTY_FOLDER = new Set(['.git', '.DS_Store']);
|
|
32
|
+
// el módulo de ejemplo
|
|
33
|
+
const SAMPLE_MODULE = Object.freeze({name: 'contacts', labels: {es: 'Contactos', en: 'Contacts'}});
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* ¿Va este archivo de la plantilla con estas opciones?
|
|
37
|
+
*
|
|
38
|
+
* @param {string} relativePath
|
|
39
|
+
* @param {Record<string, boolean>} flags
|
|
40
|
+
* @returns {boolean}
|
|
41
|
+
*/
|
|
42
|
+
export function isTemplateFileIncluded(relativePath, flags) {
|
|
43
|
+
for (const [pathOrFolder, flagName] of Object.entries(FILES_ONLY_WITH)) {
|
|
44
|
+
const matches = pathOrFolder.endsWith('/') ? relativePath.startsWith(pathOrFolder) : relativePath === pathOrFolder;
|
|
45
|
+
if (matches) {
|
|
46
|
+
return Boolean(flags[flagName]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Falla si la carpeta tiene algo (se permite que no exista). */
|
|
53
|
+
async function checkEmptyFolder(folder) {
|
|
54
|
+
const entries = await readdir(folder).catch((error) => {
|
|
55
|
+
if (error.code === 'ENOENT') {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
});
|
|
60
|
+
if (entries.some((entry) => !IGNORED_IN_EMPTY_FOLDER.has(entry))) {
|
|
61
|
+
throw new CliError(`La carpeta ${folder} ya tiene archivos; use una nueva o vacía.`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @param {object} options
|
|
67
|
+
* @param {string} options.folder donde se crea (relativa a donde se corre, o «.» para la actual)
|
|
68
|
+
* @param {Record<string, string>} options.answers ya revisadas (checkedAnswers)
|
|
69
|
+
* @returns {Promise<{projectRoot: string, written: string[]}>}
|
|
70
|
+
*/
|
|
71
|
+
export async function newProject({folder, answers}) {
|
|
72
|
+
const projectRoot = resolve(folder);
|
|
73
|
+
const folderName = basename(projectRoot);
|
|
74
|
+
if (!isValidName(folderName)) {
|
|
75
|
+
throw new CliError(`«${folderName}» no sirve como nombre del proyecto: letras sin acentos, números y guiones (p. ej. mi-tienda).`);
|
|
76
|
+
}
|
|
77
|
+
await checkEmptyFolder(projectRoot);
|
|
78
|
+
await mkdir(projectRoot, {recursive: true});
|
|
79
|
+
|
|
80
|
+
const calcitaPackage = await calcitaPackageJson();
|
|
81
|
+
const flags = templateFlagsOf(answers);
|
|
82
|
+
const packageName = namesOf(folderName).kebab;
|
|
83
|
+
const values = {
|
|
84
|
+
APP_TITLE: answers.appTitle,
|
|
85
|
+
APP_SLUG: packageName,
|
|
86
|
+
PRIMARY_COLOR: primaryColorOf(answers),
|
|
87
|
+
MENU_POSITION: answers.menuPosition,
|
|
88
|
+
FORMS_LIBRARY: answers.forms,
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const written = await copyTemplateFolder({
|
|
92
|
+
templateFolder: PROJECT_TEMPLATES, targetFolder: projectRoot, values, flags,
|
|
93
|
+
includes: (relativePath) => isTemplateFileIncluded(relativePath, flags),
|
|
94
|
+
});
|
|
95
|
+
await writeNewFile(join(projectRoot, 'package.json'), packageJsonOf({packageName, answers, calcitaPackage}));
|
|
96
|
+
await writeNewFile(join(projectRoot, PROJECT_CONFIG_FILE), projectConfigOf(answers, calcitaPackage.version));
|
|
97
|
+
await writeNewFile(join(projectRoot, 'src', 'app', 'appTheme.js'), appThemeFileOf(answers));
|
|
98
|
+
written.push('package.json', PROJECT_CONFIG_FILE, 'src/app/appTheme.js');
|
|
99
|
+
|
|
100
|
+
const sample = await makeModule({projectRoot, moduleName: SAMPLE_MODULE.name, labels: SAMPLE_MODULE.labels});
|
|
101
|
+
written.push(...sample.written);
|
|
102
|
+
return {projectRoot, written};
|
|
103
|
+
}
|