akanjs 0.0.1 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CODE_OF_CONDUCT.md +54 -0
- package/CONTRIBUTING.md +83 -0
- package/LICENSE +21 -0
- package/README.ko.md +244 -0
- package/README.md +237 -6
- package/base/base.ts +194 -0
- package/base/baseEnv.ts +162 -0
- package/base/index.ts +6 -0
- package/base/primitiveRegistry.ts +342 -0
- package/base/symbols.ts +11 -0
- package/base/types.ts +137 -0
- package/base/utils.ts +30 -0
- package/cli/application/application.command.ts +213 -0
- package/cli/application/application.interface.tsx +225 -0
- package/cli/application/application.runner.ts +359 -0
- package/cli/application/application.script.ts +244 -0
- package/cli/build.ts +25 -0
- package/cli/cloud/cloud.command.ts +48 -0
- package/cli/cloud/cloud.runner.ts +158 -0
- package/cli/cloud/cloud.script.ts +40 -0
- package/cli/guideline/guideline.command.ts +31 -0
- package/cli/guideline/guideline.prompt.ts +212 -0
- package/cli/guideline/guideline.runner.ts +53 -0
- package/cli/guideline/guideline.script.ts +33 -0
- package/cli/guidelines/___library/sharedUiStructureDescription.en.md +767 -0
- package/cli/guidelines/___library/utilUiStructureDescription.en.md +395 -0
- package/cli/guidelines/___lint/lintRuleDescription.en.md +64 -0
- package/cli/guidelines/___module/moduleStructureDescription.en.md +80 -0
- package/cli/guidelines/componentRule/componentRule.generate.json +131 -0
- package/cli/guidelines/componentRule/componentRule.instruction.md +637 -0
- package/cli/guidelines/cssRule/cssRule.generate.json +93 -0
- package/cli/guidelines/cssRule/cssRule.instruction.md +435 -0
- package/cli/guidelines/databaseModule/databaseModule.generate.json +51 -0
- package/cli/guidelines/databaseModule/databaseModule.instruction.md +612 -0
- package/cli/guidelines/docPageRule/docPageRule.generate.json +72 -0
- package/cli/guidelines/docPageRule/docPageRule.instruction.md +389 -0
- package/cli/guidelines/enumConstant/enumConstant.generate.json +24 -0
- package/cli/guidelines/enumConstant/enumConstant.instruction.md +232 -0
- package/cli/guidelines/framework/framework.generate.json +119 -0
- package/cli/guidelines/framework/framework.instruction.md +1110 -0
- package/cli/guidelines/howToUseStore/howToUseStore.generate.json +0 -0
- package/cli/guidelines/modelConstant/modelConstant.generate.json +128 -0
- package/cli/guidelines/modelConstant/modelConstant.instruction.md +506 -0
- package/cli/guidelines/modelDictionary/modelDictionary.generate.json +108 -0
- package/cli/guidelines/modelDictionary/modelDictionary.instruction.md +547 -0
- package/cli/guidelines/modelDocument/modelDocument.generate.json +129 -0
- package/cli/guidelines/modelDocument/modelDocument.instruction.md +536 -0
- package/cli/guidelines/modelService/modelService.generate.json +135 -0
- package/cli/guidelines/modelService/modelService.instruction.md +708 -0
- package/cli/guidelines/modelSignal/modelSignal.generate.json +201 -0
- package/cli/guidelines/modelSignal/modelSignal.instruction.md +552 -0
- package/cli/guidelines/modelStore/modelStore.generate.json +130 -0
- package/cli/guidelines/modelStore/modelStore.instruction.md +585 -0
- package/cli/guidelines/modelTemplate/modelTemplate.generate.json +104 -0
- package/cli/guidelines/modelTemplate/modelTemplate.instruction.md +604 -0
- package/cli/guidelines/modelUnit/modelUnit.generate.json +92 -0
- package/cli/guidelines/modelUnit/modelUnit.instruction.md +541 -0
- package/cli/guidelines/modelUtil/modelUtil.generate.json +93 -0
- package/cli/guidelines/modelUtil/modelUtil.instruction.md +752 -0
- package/cli/guidelines/modelView/modelView.generate.json +80 -0
- package/cli/guidelines/modelView/modelView.instruction.md +1005 -0
- package/cli/guidelines/modelZone/modelZone.generate.json +126 -0
- package/cli/guidelines/modelZone/modelZone.instruction.md +528 -0
- package/cli/guidelines/scalarConstant/scalarConstant.generate.json +106 -0
- package/cli/guidelines/scalarConstant/scalarConstant.instruction.md +442 -0
- package/cli/guidelines/scalarDictionary/scalarDictionary.generate.json +83 -0
- package/cli/guidelines/scalarDictionary/scalarDictionary.instruction.md +273 -0
- package/cli/guidelines/scalarModule/scalarModule.generate.json +35 -0
- package/cli/guidelines/scalarModule/scalarModule.instruction.md +81 -0
- package/cli/guidelines/sharedUiUsage/sharedUiUsage.generate.json +108 -0
- package/cli/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +310 -0
- package/cli/guidelines/utilUiUsage/utilUiUsage.generate.json +140 -0
- package/cli/guidelines/utilUiUsage/utilUiUsage.instruction.md +339 -0
- package/cli/index.js +11399 -0
- package/cli/index.ts +24 -0
- package/cli/library/library.command.ts +28 -0
- package/cli/library/library.runner.ts +69 -0
- package/cli/library/library.script.ts +39 -0
- package/cli/module/module.command.ts +35 -0
- package/cli/module/module.prompt.ts +18 -0
- package/cli/module/module.request.ts +319 -0
- package/cli/module/module.runner.ts +76 -0
- package/cli/module/module.script.ts +161 -0
- package/cli/package/package.command.ts +32 -0
- package/cli/package/package.runner.ts +64 -0
- package/cli/package/package.script.ts +35 -0
- package/cli/page/page.command.ts +14 -0
- package/cli/page/page.runner.ts +14 -0
- package/cli/page/page.script.ts +12 -0
- package/cli/scalar/scalar.command.ts +21 -0
- package/cli/scalar/scalar.prompt.ts +131 -0
- package/cli/scalar/scalar.runner.ts +38 -0
- package/cli/scalar/scalar.script.ts +16 -0
- package/cli/templates/__scalar/__model__/__model__.constant.ts +15 -0
- package/cli/templates/__scalar/__model__/__model__.dictionary.ts +19 -0
- package/cli/templates/__scalar/__model__/__model__.document.ts +15 -0
- package/cli/templates/app/akan.config.ts +14 -0
- package/cli/templates/app/capacitor.config.ts.template +8 -0
- package/cli/templates/app/common/commonLogic.ts +12 -0
- package/cli/templates/app/common/index.ts +10 -0
- package/cli/templates/app/env/env.client.debug.ts.template +7 -0
- package/cli/templates/app/env/env.client.develop.ts.template +7 -0
- package/cli/templates/app/env/env.client.local.ts.template +7 -0
- package/cli/templates/app/env/env.client.main.ts.template +7 -0
- package/cli/templates/app/env/env.client.testing.ts.template +7 -0
- package/cli/templates/app/env/env.client.ts +21 -0
- package/cli/templates/app/env/env.client.type.ts +16 -0
- package/cli/templates/app/env/env.server.debug.ts.template +7 -0
- package/cli/templates/app/env/env.server.develop.ts.template +9 -0
- package/cli/templates/app/env/env.server.local.ts.template +14 -0
- package/cli/templates/app/env/env.server.main.ts.template +9 -0
- package/cli/templates/app/env/env.server.testing.ts.template +6 -0
- package/cli/templates/app/env/env.server.ts +20 -0
- package/cli/templates/app/lib/___appName__/__appName__.dictionary.ts +17 -0
- package/cli/templates/app/lib/___appName__/__appName__.service.ts +13 -0
- package/cli/templates/app/lib/___appName__/__appName__.signal.ts +17 -0
- package/cli/templates/app/lib/___appName__/__appName__.store.ts +15 -0
- package/cli/templates/app/lib/option.ts +17 -0
- package/cli/templates/app/main.ts +16 -0
- package/cli/templates/app/package.json.template +5 -0
- package/cli/templates/app/page/_index.tsx +172 -0
- package/cli/templates/app/page/_layout.tsx +32 -0
- package/cli/templates/app/page/styles.css.template +53 -0
- package/cli/templates/app/public/favicon.ico +0 -0
- package/cli/templates/app/public/logo.png +0 -0
- package/cli/templates/app/srvkit/backendLogic.ts +12 -0
- package/cli/templates/app/srvkit/index.ts +10 -0
- package/cli/templates/app/tsconfig.json.template +21 -0
- package/cli/templates/app/ui/UiComponent.ts +16 -0
- package/cli/templates/app/ui/index.ts +10 -0
- package/cli/templates/app/webkit/frontendLogic.ts +12 -0
- package/cli/templates/app/webkit/index.ts +10 -0
- package/cli/templates/client.ts +46 -0
- package/cli/templates/crudPages/[__model__Id]/edit/page.tsx +47 -0
- package/cli/templates/crudPages/[__model__Id]/page.tsx +52 -0
- package/cli/templates/crudPages/new/page.tsx +42 -0
- package/cli/templates/crudPages/page.tsx +43 -0
- package/cli/templates/crudSinglePage/page.tsx +37 -0
- package/cli/templates/env/_env.server.type.ts +16 -0
- package/cli/templates/facetIndex/index.ts +32 -0
- package/cli/templates/index.ts +10 -0
- package/cli/templates/lib/__lib/lib.constant.ts +38 -0
- package/cli/templates/lib/__lib/lib.dictionary.ts +33 -0
- package/cli/templates/lib/__lib/lib.document.ts +35 -0
- package/cli/templates/lib/__lib/lib.service.ts +33 -0
- package/cli/templates/lib/__lib/lib.signal.ts +34 -0
- package/cli/templates/lib/__lib/lib.store.ts +33 -0
- package/cli/templates/lib/cnst.ts +29 -0
- package/cli/templates/lib/db.ts +32 -0
- package/cli/templates/lib/dict.ts +49 -0
- package/cli/templates/lib/sig.ts +60 -0
- package/cli/templates/lib/srv.ts +34 -0
- package/cli/templates/lib/st.ts +31 -0
- package/cli/templates/lib/useClient.ts +19 -0
- package/cli/templates/lib/useServer.ts +7 -0
- package/cli/templates/libRoot/.gitignore.template +16 -0
- package/cli/templates/libRoot/akan.config.ts +12 -0
- package/cli/templates/libRoot/base/baseLogic.ts +10 -0
- package/cli/templates/libRoot/base/index.ts +8 -0
- package/cli/templates/libRoot/common/commonLogic.ts +10 -0
- package/cli/templates/libRoot/common/index.ts +8 -0
- package/cli/templates/libRoot/env/env.server.example.ts.template +6 -0
- package/cli/templates/libRoot/env/env.server.testing.ts.template +6 -0
- package/cli/templates/libRoot/lib/___libName__/__libName__.dictionary.ts +15 -0
- package/cli/templates/libRoot/lib/___libName__/__libName__.service.ts +11 -0
- package/cli/templates/libRoot/lib/___libName__/__libName__.store.ts +13 -0
- package/cli/templates/libRoot/lib/option.ts +17 -0
- package/cli/templates/libRoot/package.json.template +5 -0
- package/cli/templates/libRoot/srvkit/backendLogic.ts +10 -0
- package/cli/templates/libRoot/srvkit/index.ts +8 -0
- package/cli/templates/libRoot/tsconfig.json.template +11 -0
- package/cli/templates/libRoot/ui/index.ts +7 -0
- package/cli/templates/libRoot/webkit/frontendLogic.ts +10 -0
- package/cli/templates/libRoot/webkit/index.ts +8 -0
- package/cli/templates/localDev/docker-compose.yaml.template +37 -0
- package/cli/templates/module/__Model__.Template.tsx +36 -0
- package/cli/templates/module/__Model__.Unit.tsx +26 -0
- package/cli/templates/module/__Model__.Util.tsx +30 -0
- package/cli/templates/module/__Model__.View.tsx +29 -0
- package/cli/templates/module/__Model__.Zone.tsx +43 -0
- package/cli/templates/module/__model__.constant.ts +24 -0
- package/cli/templates/module/__model__.dictionary.ts +30 -0
- package/cli/templates/module/__model__.document.ts +23 -0
- package/cli/templates/module/__model__.service.ts +16 -0
- package/cli/templates/module/__model__.signal.ts +27 -0
- package/cli/templates/module/__model__.store.ts +19 -0
- package/cli/templates/module/index.tsx +44 -0
- package/cli/templates/moduleRoot/index.tsx +31 -0
- package/cli/templates/pkgRoot/tsconfig.json.template +10 -0
- package/cli/templates/server.ts +45 -0
- package/cli/templates/workspaceRoot/.env.template +14 -0
- package/cli/templates/workspaceRoot/.gitignore.template +130 -0
- package/cli/templates/workspaceRoot/.vscode/settings.json.template +23 -0
- package/cli/templates/workspaceRoot/biome.json.template +175 -0
- package/cli/templates/workspaceRoot/bunfig.toml +4 -0
- package/cli/templates/workspaceRoot/infra/app/Chart.yaml.template +6 -0
- package/cli/templates/workspaceRoot/infra/app/templates/frontend.yaml.template +182 -0
- package/cli/templates/workspaceRoot/infra/app/values/_common-values.yaml.template +183 -0
- package/cli/templates/workspaceRoot/package.json.template +7 -0
- package/cli/templates/workspaceRoot/tsconfig.json.template +26 -0
- package/cli/testHelpers.ts +171 -0
- package/cli/workspace/workspace.command.ts +59 -0
- package/cli/workspace/workspace.runner.ts +57 -0
- package/cli/workspace/workspace.script.ts +68 -0
- package/client/capacitor.ts +68 -0
- package/client/clientRuntime.ts +141 -0
- package/client/cookie.ts +121 -0
- package/client/createFont.ts +8 -0
- package/client/csrTypes.ts +259 -0
- package/client/decorators.ts +25 -0
- package/client/device.ts +147 -0
- package/client/fetch.ts +1 -0
- package/client/index.ts +15 -0
- package/client/locale.ts +4 -0
- package/client/makePageProto.tsx +178 -0
- package/client/router.ts +286 -0
- package/client/rscNavigation.ts +19 -0
- package/client/storage.ts +33 -0
- package/client/translator.ts +43 -0
- package/client/types.ts +228 -0
- package/client/useClient.ts +1 -0
- package/common/Logger.ts +177 -0
- package/common/applyMixins.ts +14 -0
- package/common/capitalize.ts +4 -0
- package/common/deepObjectify.ts +27 -0
- package/common/formatNumber.ts +14 -0
- package/common/formatPhone.ts +7 -0
- package/common/getAllPropertyDescriptors.ts +13 -0
- package/common/hmrPhase.ts +17 -0
- package/common/httpClient.ts +101 -0
- package/common/index.ts +50 -0
- package/common/isDayjs.ts +3 -0
- package/common/isEmail.ts +2 -0
- package/common/isPhoneNumber.ts +8 -0
- package/common/isQueryEqual.ts +23 -0
- package/common/isValidDate.ts +14 -0
- package/common/localeConfig.ts +41 -0
- package/common/lowerlize.ts +4 -0
- package/common/mergeVersion.ts +10 -0
- package/common/objectify.ts +7 -0
- package/common/pathGet.ts +13 -0
- package/common/pathSet.ts +16 -0
- package/common/randomPick.ts +1 -0
- package/common/randomPicks.ts +12 -0
- package/common/routeConvention.ts +203 -0
- package/common/sleep.ts +8 -0
- package/common/splitVersion.ts +11 -0
- package/common/subRoute.ts +34 -0
- package/common/types.ts +15 -0
- package/constant/constantRegistry.ts +334 -0
- package/constant/crystalize.ts +45 -0
- package/constant/deserialize.ts +70 -0
- package/constant/fieldInfo.ts +415 -0
- package/constant/getDefault.ts +18 -0
- package/constant/immerify.ts +16 -0
- package/constant/index.ts +10 -0
- package/constant/purify.ts +118 -0
- package/constant/serialize.ts +87 -0
- package/constant/types.ts +105 -0
- package/constant/via.ts +360 -0
- package/devkit/aiEditor.ts +299 -0
- package/devkit/akanApp/akanApp.host.ts +356 -0
- package/devkit/akanApp/index.ts +1 -0
- package/devkit/akanConfig/akanConfig.ts +332 -0
- package/devkit/akanConfig/index.ts +2 -0
- package/devkit/akanConfig/types.ts +187 -0
- package/devkit/applicationBuildReporter.ts +69 -0
- package/devkit/applicationBuildRunner.ts +302 -0
- package/devkit/applicationReleasePackager.ts +205 -0
- package/devkit/artifact/implicitRootLayout.ts +155 -0
- package/devkit/artifact/index.ts +1 -0
- package/devkit/artifact/routeSeedIndex.ts +128 -0
- package/devkit/auth.ts +41 -0
- package/devkit/builder.ts +164 -0
- package/devkit/capacitor.base.config.ts +74 -0
- package/devkit/capacitorApp.ts +385 -0
- package/devkit/commandDecorators/argMeta.ts +88 -0
- package/devkit/commandDecorators/command.ts +314 -0
- package/devkit/commandDecorators/commandBuilder.ts +188 -0
- package/devkit/commandDecorators/commandMeta.ts +6 -0
- package/devkit/commandDecorators/dependencyBuilder.ts +100 -0
- package/devkit/commandDecorators/helpFormatter.ts +217 -0
- package/devkit/commandDecorators/index.ts +8 -0
- package/devkit/commandDecorators/targetMeta.ts +31 -0
- package/devkit/commandDecorators/types.ts +10 -0
- package/devkit/constants.ts +25 -0
- package/devkit/createTunnel.ts +36 -0
- package/devkit/dependencyScanner.ts +339 -0
- package/devkit/executors.ts +1325 -0
- package/devkit/extractDeps.ts +85 -0
- package/devkit/fileEditor.ts +106 -0
- package/devkit/fileSys.ts +39 -0
- package/devkit/frontendBuild/allRoutesBuilder.ts +103 -0
- package/devkit/frontendBuild/clientBuildTypes.ts +114 -0
- package/devkit/frontendBuild/clientEntriesBundler.ts +300 -0
- package/devkit/frontendBuild/clientEntryDiscovery.ts +196 -0
- package/devkit/frontendBuild/csrArtifactBuilder.ts +237 -0
- package/devkit/frontendBuild/cssCompiler.ts +279 -0
- package/devkit/frontendBuild/cssImportResolver.ts +116 -0
- package/devkit/frontendBuild/fontOptimizer.ts +427 -0
- package/devkit/frontendBuild/hmrChangeClassifier.ts +28 -0
- package/devkit/frontendBuild/hmrWatcher.ts +101 -0
- package/devkit/frontendBuild/index.ts +18 -0
- package/devkit/frontendBuild/pagesBundleBuilder.ts +137 -0
- package/devkit/frontendBuild/pagesEntrySourceGenerator.ts +37 -0
- package/devkit/frontendBuild/precompressArtifacts.ts +59 -0
- package/devkit/frontendBuild/routeClientBuilder.ts +290 -0
- package/devkit/frontendBuild/routesManifestArtifactSerializer.ts +62 -0
- package/devkit/frontendBuild/ssrBaseArtifactBuilder.ts +139 -0
- package/devkit/frontendBuild/vendorSpecifiers.ts +16 -0
- package/devkit/frontendBuild/watchRootResolver.ts +28 -0
- package/devkit/getCredentials.ts +19 -0
- package/devkit/getDirname.ts +3 -0
- package/devkit/getModelFileData.ts +59 -0
- package/devkit/getRelatedCnsts.ts +300 -0
- package/devkit/guideline.ts +19 -0
- package/devkit/incrementalBuilder/incrementalBuilder.host.ts +78 -0
- package/devkit/incrementalBuilder/incrementalBuilder.proc.ts +330 -0
- package/devkit/incrementalBuilder/index.ts +1 -0
- package/devkit/index.ts +36 -0
- package/devkit/lint/no-import-client-functions.grit +32 -0
- package/devkit/lint/no-import-external-library.grit +21 -0
- package/devkit/lint/no-js-private-class-method.grit +42 -0
- package/devkit/lint/no-use-client-in-server.grit +7 -0
- package/devkit/lint/non-scalar-props-restricted.grit +13 -0
- package/devkit/linter.ts +248 -0
- package/devkit/mobile/index.ts +1 -0
- package/devkit/mobile/mobileTarget.ts +47 -0
- package/devkit/prompter.ts +71 -0
- package/devkit/scanInfo.ts +605 -0
- package/devkit/selectModel.ts +11 -0
- package/devkit/spinner.ts +54 -0
- package/devkit/sshTunnel.ts +151 -0
- package/devkit/streamAi.ts +45 -0
- package/devkit/transforms/barrelAnalyzer.ts +249 -0
- package/devkit/transforms/barrelImportsPlugin.ts +451 -0
- package/devkit/transforms/externalizeFrameworkPlugin.ts +159 -0
- package/devkit/transforms/index.ts +5 -0
- package/devkit/transforms/rscUseClientTransform.ts +52 -0
- package/devkit/transforms/useClientBundlePlugin.ts +47 -0
- package/devkit/typeChecker.ts +260 -0
- package/devkit/types.ts +42 -0
- package/devkit/ui/MultiScrollList.tsx +228 -0
- package/devkit/ui/ScrollList.tsx +106 -0
- package/devkit/ui/index.ts +2 -0
- package/devkit/uploadRelease.ts +95 -0
- package/devkit/useStdoutDimensions.ts +20 -0
- package/dictionary/base.dictionary.ts +91 -0
- package/dictionary/dictInfo.ts +1079 -0
- package/dictionary/dictionary.ts +10 -0
- package/dictionary/index.ts +12 -0
- package/dictionary/locale.ts +230 -0
- package/dictionary/trans.ts +196 -0
- package/document/by.ts +39 -0
- package/document/dataLoader.ts +91 -0
- package/document/database.ts +168 -0
- package/document/databaseRegistry.ts +113 -0
- package/document/documentQuery.ts +143 -0
- package/document/documentSchema.ts +91 -0
- package/document/filterMeta.ts +210 -0
- package/document/index.ts +11 -0
- package/document/into.ts +169 -0
- package/document/loaderInfo.ts +50 -0
- package/document/schema.ts +24 -0
- package/document/types.ts +41 -0
- package/fetch/client/fetchClient.ts +600 -0
- package/fetch/client/httpClient.ts +157 -0
- package/fetch/client/index.ts +3 -0
- package/fetch/client/wsClient.ts +246 -0
- package/fetch/fetchType/appliedReturn.type.ts +108 -0
- package/fetch/fetchType/buildFetch.type.ts +24 -0
- package/fetch/fetchType/clientSignal.type.ts +22 -0
- package/fetch/fetchType/endpointFetch.type.ts +56 -0
- package/fetch/fetchType/index.ts +5 -0
- package/fetch/fetchType/sliceFetch.type.ts +173 -0
- package/fetch/index.ts +4 -0
- package/fetch/requestStorage.ts +127 -0
- package/fetch/serializer/fetch.serializer.ts +131 -0
- package/fetch/serializer/index.ts +1 -0
- package/fetch/types.ts +28 -0
- package/package.json +202 -5
- package/server/SSR_MEMORY_DIAGNOSIS.md +107 -0
- package/server/akanApp.ts +855 -0
- package/server/akanLib.ts +43 -0
- package/server/akanOption.ts +42 -0
- package/server/akanServer.ts +369 -0
- package/server/artifact/builderRpc.ts +124 -0
- package/server/artifact/index.ts +6 -0
- package/server/artifact/ipcTypes.ts +46 -0
- package/server/artifact/manifestTypes.ts +19 -0
- package/server/artifact/routeClientCache.ts +224 -0
- package/server/artifact/routeSeedIndexStore.ts +89 -0
- package/server/artifact/routesManifestStore.ts +120 -0
- package/server/decorators.ts +95 -0
- package/server/di/diLifecycle.ts +520 -0
- package/server/di/index.ts +4 -0
- package/server/di/predefinedAdaptor.ts +77 -0
- package/server/di/resolveAdaptorHierarchy.ts +82 -0
- package/server/di/resolveHierarchy.ts +89 -0
- package/server/di/resolveServiceHierarchy.ts +47 -0
- package/server/di/utils.ts +40 -0
- package/server/hmr/changeBatch.ts +14 -0
- package/server/hmr/clientScript.ts +310 -0
- package/server/hmr/devHmrController.ts +395 -0
- package/server/hmr/index.ts +4 -0
- package/server/hmr/wsHub.ts +56 -0
- package/server/imageOptimizer.ts +427 -0
- package/server/imageOptimizerError.ts +8 -0
- package/server/index.ts +14 -0
- package/server/lifecycle/shutdownManager.ts +52 -0
- package/server/logging/rotatingLogWriter.ts +190 -0
- package/server/processMetricsCollector.ts +78 -0
- package/server/proxy/akanResponse.ts +16 -0
- package/server/proxy/bunRequestFields.ts +12 -0
- package/server/proxy/hostBasePathWebProxy.ts +112 -0
- package/server/proxy/index.ts +15 -0
- package/server/proxy/localeWebProxy.ts +71 -0
- package/server/proxy/types.ts +41 -0
- package/server/proxy/webProxyRunner.ts +90 -0
- package/server/resolver/database.resolver.ts +340 -0
- package/server/resolver/index.ts +3 -0
- package/server/resolver/resolver.contract.fixture.ts +222 -0
- package/server/resolver/service.resolver.ts +176 -0
- package/server/resolver/signal.resolver.ts +386 -0
- package/server/robots.ts +32 -0
- package/server/routeElementComposer.tsx +91 -0
- package/server/routeTreeBuilder.ts +279 -0
- package/server/routing/apiRouter.ts +226 -0
- package/server/rscClient.tsx +140 -0
- package/server/rscWorker.tsx +625 -0
- package/server/rscWorkerHost.ts +616 -0
- package/server/sitemap.ts +90 -0
- package/server/ssrFromRscRenderer.tsx +285 -0
- package/server/ssrTypes.ts +48 -0
- package/server/types/react-server-dom-webpack.d.ts +91 -0
- package/server/types.tsx +109 -0
- package/server/vendor/akanjs-base.ts +1 -0
- package/server/vendor/akanjs-common.ts +1 -0
- package/server/vendor/akanjs-constant.ts +1 -0
- package/server/vendor/akanjs-store.ts +1 -0
- package/server/vendor/react-dom-client.ts +5 -0
- package/server/vendor/react-dom.ts +21 -0
- package/server/vendor/react-jsx-dev-runtime.ts +5 -0
- package/server/vendor/react-jsx-runtime.ts +5 -0
- package/server/vendor/react-refresh-runtime.ts +6 -0
- package/server/vendor/react-server-dom-webpack-client-browser.ts +12 -0
- package/server/vendor/react.ts +51 -0
- package/server/vendor/scheduler.ts +23 -0
- package/server/webRouter.ts +712 -0
- package/service/adapt.ts +47 -0
- package/service/base.service.ts +18 -0
- package/service/index.ts +10 -0
- package/service/injectInfo.ts +393 -0
- package/service/ipcTypes.ts +127 -0
- package/service/predefinedAdaptor/cache.adaptor.ts +105 -0
- package/service/predefinedAdaptor/compress.adaptor.ts +357 -0
- package/service/predefinedAdaptor/database.adaptor.ts +1310 -0
- package/service/predefinedAdaptor/index.ts +13 -0
- package/service/predefinedAdaptor/logging.adaptor.ts +36 -0
- package/service/predefinedAdaptor/queue.adaptor.ts +42 -0
- package/service/predefinedAdaptor/role.adaptor.ts +18 -0
- package/service/predefinedAdaptor/schedule.adaptor.ts +188 -0
- package/service/predefinedAdaptor/solidCache.adaptor.ts +143 -0
- package/service/predefinedAdaptor/solidPubsub.adaptor.ts +98 -0
- package/service/predefinedAdaptor/solidQueue.adaptor.ts +203 -0
- package/service/predefinedAdaptor/solidSqlite.ts +85 -0
- package/service/predefinedAdaptor/sqlitePath.ts +20 -0
- package/service/predefinedAdaptor/storage.adaptor.ts +121 -0
- package/service/predefinedAdaptor/websocket.adaptor.ts +313 -0
- package/service/serve.ts +223 -0
- package/service/serviceModule.ts +221 -0
- package/service/serviceRegistry.ts +26 -0
- package/service/types.ts +113 -0
- package/signal/base.signal.ts +46 -0
- package/signal/endpoint.ts +122 -0
- package/signal/endpointInfo.ts +374 -0
- package/signal/exception.ts +50 -0
- package/signal/guard.ts +18 -0
- package/signal/guards.ts +16 -0
- package/signal/index.ts +18 -0
- package/signal/intercept.ts +39 -0
- package/signal/internal.ts +56 -0
- package/signal/internalArg.ts +38 -0
- package/signal/internalInfo.ts +208 -0
- package/signal/middleware.ts +108 -0
- package/signal/serializer/fetch.serializer.ts +128 -0
- package/signal/serializer/index.ts +1 -0
- package/signal/serverSignal.ts +114 -0
- package/signal/signalContext.ts +446 -0
- package/signal/signalRegistry.ts +82 -0
- package/signal/slice.ts +158 -0
- package/signal/sliceInfo.ts +254 -0
- package/signal/types.ts +131 -0
- package/store/action.ts +1067 -0
- package/store/baseSt.ts +81 -0
- package/store/hooks.ts +2 -0
- package/store/index.ts +8 -0
- package/store/rootStore.ts +26 -0
- package/store/state.ts +226 -0
- package/store/stateBuilder.ts +429 -0
- package/store/stateInfo.ts +66 -0
- package/store/store.ts +194 -0
- package/store/storeInstance.ts +382 -0
- package/store/storeRegistry.ts +84 -0
- package/store/types.ts +69 -0
- package/store/withSelector.ts +62 -0
- package/test/index.ts +16 -0
- package/test/playwright.config.base.ts +48 -0
- package/test/playwright.pageAgent.ts +41 -0
- package/test/sample.ts +19 -0
- package/test/sampleOf.ts +70 -0
- package/test/signalTest.preload.ts +10 -0
- package/test/signalTestRuntime.ts +126 -0
- package/test/testServer.ts +187 -0
- package/ui/BottomSheet.tsx +103 -0
- package/ui/Button.tsx +70 -0
- package/ui/ClientSide.tsx +11 -0
- package/ui/Clipboard.tsx +49 -0
- package/ui/Constant/Doc.tsx +696 -0
- package/ui/Constant/Mermaid.tsx +149 -0
- package/ui/Constant/index.ts +6 -0
- package/ui/Constant/schemaDoc.ts +324 -0
- package/ui/Copy.tsx +27 -0
- package/ui/CsrImage.tsx +38 -0
- package/ui/Data/CardList.tsx +141 -0
- package/ui/Data/Dashboard.tsx +72 -0
- package/ui/Data/Insight.tsx +35 -0
- package/ui/Data/Item.tsx +285 -0
- package/ui/Data/ListContainer.tsx +320 -0
- package/ui/Data/Pagination.tsx +54 -0
- package/ui/Data/QueryMaker.tsx +21 -0
- package/ui/Data/TableList.tsx +161 -0
- package/ui/Data/index.ts +11 -0
- package/ui/Data/index_.tsx +11 -0
- package/ui/DatePicker.tsx +184 -0
- package/ui/Dialog/Action.tsx +15 -0
- package/ui/Dialog/Close.tsx +22 -0
- package/ui/Dialog/Content.tsx +11 -0
- package/ui/Dialog/Modal.tsx +137 -0
- package/ui/Dialog/Provider.tsx +33 -0
- package/ui/Dialog/Title.tsx +15 -0
- package/ui/Dialog/Trigger.tsx +22 -0
- package/ui/Dialog/context.ts +20 -0
- package/ui/Dialog/index.tsx +15 -0
- package/ui/DragAction.tsx +129 -0
- package/ui/DraggableList.tsx +230 -0
- package/ui/Dropdown.tsx +51 -0
- package/ui/Empty.tsx +32 -0
- package/ui/Field.tsx +1556 -0
- package/ui/FontFace.tsx +26 -0
- package/ui/Image.tsx +185 -0
- package/ui/InfiniteScroll.tsx +67 -0
- package/ui/Input.tsx +636 -0
- package/ui/KeyboardAvoiding.tsx +62 -0
- package/ui/Layout/BottomAction.tsx +15 -0
- package/ui/Layout/BottomInset.tsx +42 -0
- package/ui/Layout/BottomTab.tsx +71 -0
- package/ui/Layout/Header.tsx +38 -0
- package/ui/Layout/LeftSider.tsx +34 -0
- package/ui/Layout/Navbar.tsx +46 -0
- package/ui/Layout/RightSider.tsx +41 -0
- package/ui/Layout/Sider.tsx +69 -0
- package/ui/Layout/Template.tsx +11 -0
- package/ui/Layout/TopLeftAction.tsx +28 -0
- package/ui/Layout/Unit.tsx +19 -0
- package/ui/Layout/View.tsx +12 -0
- package/ui/Layout/Zone.tsx +10 -0
- package/ui/Layout/index.ts +27 -0
- package/ui/Link/Back.tsx +15 -0
- package/ui/Link/Close.tsx +20 -0
- package/ui/Link/CsrLink.tsx +41 -0
- package/ui/Link/Lang.tsx +16 -0
- package/ui/Link/SsrLink.tsx +68 -0
- package/ui/Link/index.tsx +32 -0
- package/ui/Link/types.ts +47 -0
- package/ui/Load/Edit.tsx +19 -0
- package/ui/Load/Edit_Client.tsx +120 -0
- package/ui/Load/Page.tsx +40 -0
- package/ui/Load/PageCSR.tsx +39 -0
- package/ui/Load/Pagination.tsx +89 -0
- package/ui/Load/Units.tsx +330 -0
- package/ui/Load/View.tsx +115 -0
- package/ui/Load/index.ts +11 -0
- package/ui/Load/index_.tsx +6 -0
- package/ui/Loading/Area.tsx +10 -0
- package/ui/Loading/Button.tsx +17 -0
- package/ui/Loading/Input.tsx +17 -0
- package/ui/Loading/ProgressBar.tsx +14 -0
- package/ui/Loading/Skeleton.tsx +22 -0
- package/ui/Loading/Spin.tsx +22 -0
- package/ui/Loading/index.tsx +8 -0
- package/ui/Menu.tsx +273 -0
- package/ui/Modal.tsx +87 -0
- package/ui/Model/AdminPanel.tsx +51 -0
- package/ui/Model/Edit.tsx +46 -0
- package/ui/Model/EditModal.tsx +301 -0
- package/ui/Model/EditWrapper.tsx +48 -0
- package/ui/Model/LoadInit.tsx +11 -0
- package/ui/Model/New.tsx +46 -0
- package/ui/Model/NewWrapper.tsx +20 -0
- package/ui/Model/NewWrapper_Client.tsx +57 -0
- package/ui/Model/Remove.tsx +75 -0
- package/ui/Model/RemoveWrapper.tsx +38 -0
- package/ui/Model/SureToRemove.tsx +108 -0
- package/ui/Model/View.tsx +65 -0
- package/ui/Model/ViewEditModal.tsx +125 -0
- package/ui/Model/ViewModal.tsx +71 -0
- package/ui/Model/ViewWrapper.tsx +38 -0
- package/ui/Model/index.ts +33 -0
- package/ui/Model/index_.tsx +16 -0
- package/ui/More.tsx +56 -0
- package/ui/ObjectId.tsx +29 -0
- package/ui/Pagination.tsx +120 -0
- package/ui/Popconfirm.tsx +135 -0
- package/ui/Portal.tsx +10 -0
- package/ui/Radio.tsx +53 -0
- package/ui/RecentTime.tsx +123 -0
- package/ui/Refresh.tsx +24 -0
- package/ui/ScreenNavigator.tsx +129 -0
- package/ui/Select.tsx +322 -0
- package/ui/Signal/Arg.tsx +352 -0
- package/ui/Signal/Doc.tsx +231 -0
- package/ui/Signal/Listener.tsx +74 -0
- package/ui/Signal/Message.tsx +267 -0
- package/ui/Signal/Object.tsx +131 -0
- package/ui/Signal/PubSub.tsx +247 -0
- package/ui/Signal/Request.tsx +30 -0
- package/ui/Signal/Response.tsx +76 -0
- package/ui/Signal/RestApi.tsx +390 -0
- package/ui/Signal/WebSocket.tsx +47 -0
- package/ui/Signal/index.ts +10 -0
- package/ui/Signal/makeExample.ts +75 -0
- package/ui/System/CSR.tsx +420 -0
- package/ui/System/Client.tsx +296 -0
- package/ui/System/Common.tsx +83 -0
- package/ui/System/DevModeToggle.tsx +21 -0
- package/ui/System/Gtag.tsx +69 -0
- package/ui/System/Messages.tsx +175 -0
- package/ui/System/Reconnect.tsx +156 -0
- package/ui/System/Root.tsx +10 -0
- package/ui/System/SSR.tsx +163 -0
- package/ui/System/SelectLanguage.tsx +47 -0
- package/ui/System/ThemeToggle.tsx +98 -0
- package/ui/System/index.tsx +23 -0
- package/ui/Tab/Menu.tsx +56 -0
- package/ui/Tab/Menus.tsx +10 -0
- package/ui/Tab/Panel.tsx +25 -0
- package/ui/Tab/Provider.tsx +25 -0
- package/ui/Tab/context.ts +16 -0
- package/ui/Tab/index.tsx +11 -0
- package/ui/Table.tsx +131 -0
- package/ui/ToggleSelect.tsx +144 -0
- package/ui/Unauthorized.tsx +29 -0
- package/ui/animated.tsx +8 -0
- package/ui/fontCss.ts +86 -0
- package/ui/index.ts +44 -0
- package/ui/styles.css +617 -0
- package/webkit/bootCsr.tsx +275 -0
- package/webkit/createRobotPage.ts +15 -0
- package/webkit/createSitemapPage.ts +4 -0
- package/webkit/index.ts +19 -0
- package/webkit/lazy.tsx +37 -0
- package/webkit/types.ts +7 -0
- package/webkit/useCamera.tsx +99 -0
- package/webkit/useCodepush.tsx +99 -0
- package/webkit/useContact.tsx +48 -0
- package/webkit/useCsrValues.ts +661 -0
- package/webkit/useDebounce.ts +24 -0
- package/webkit/useFetch.ts +48 -0
- package/webkit/useGeoLocation.tsx +24 -0
- package/webkit/useHistory.ts +76 -0
- package/webkit/useInterval.ts +21 -0
- package/webkit/useLocation.ts +69 -0
- package/webkit/usePurchase.tsx +156 -0
- package/webkit/usePushNoti.tsx +48 -0
- package/webkit/useThrottle.ts +22 -0
- package/src/index.js +0 -2
- package/src/index.js.map +0 -1
- package/src/lib/akan2.js +0 -4
- package/src/lib/akan2.js.map +0 -1
- package/src/run.js +0 -4
- package/src/run.js.map +0 -1
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { type AkanI18nConfig, resolveAkanI18nConfig } from "akanjs/common";
|
|
4
|
+
import type { AkanImageConfig } from "akanjs/server";
|
|
5
|
+
import type { App, Lib } from "../commandDecorators";
|
|
6
|
+
import { WorkspaceExecutor } from "../executors";
|
|
7
|
+
import type { BaseDevEnv, PackageJson } from "../types";
|
|
8
|
+
import {
|
|
9
|
+
type AkanMobileConfig,
|
|
10
|
+
type AkanMobileTargetConfig,
|
|
11
|
+
type AkanRouteConfig,
|
|
12
|
+
type AppConfigResult,
|
|
13
|
+
type Arch,
|
|
14
|
+
archs,
|
|
15
|
+
type DatabaseMode,
|
|
16
|
+
type DeepPartial,
|
|
17
|
+
type DockerConfig,
|
|
18
|
+
type LibConfigResult,
|
|
19
|
+
} from "./types";
|
|
20
|
+
|
|
21
|
+
const DEFAULT_BARREL_IMPORTS = ["akanjs/webkit", "akanjs/common", "akanjs/ui"];
|
|
22
|
+
const DEFAULT_OPTIMIZE_IMPORTS = [
|
|
23
|
+
"lucide-react",
|
|
24
|
+
"date-fns",
|
|
25
|
+
"lodash-es",
|
|
26
|
+
"ramda",
|
|
27
|
+
"antd",
|
|
28
|
+
"react-bootstrap",
|
|
29
|
+
"ahooks",
|
|
30
|
+
"@ant-design/icons",
|
|
31
|
+
"@headlessui/react",
|
|
32
|
+
"@headlessui-float/react",
|
|
33
|
+
"@heroicons/react/20/solid",
|
|
34
|
+
"@heroicons/react/24/solid",
|
|
35
|
+
"@heroicons/react/24/outline",
|
|
36
|
+
"@visx/visx",
|
|
37
|
+
"@tremor/react",
|
|
38
|
+
"rxjs",
|
|
39
|
+
"@mui/material",
|
|
40
|
+
"@mui/icons-material",
|
|
41
|
+
"recharts",
|
|
42
|
+
"react-use",
|
|
43
|
+
"@material-ui/core",
|
|
44
|
+
"@material-ui/icons",
|
|
45
|
+
"@tabler/icons-react",
|
|
46
|
+
"mui-core",
|
|
47
|
+
"react-icons/*",
|
|
48
|
+
];
|
|
49
|
+
const WORKSPACE_BARREL_FACETS = ["ui", "webkit", "common", "client", "server"] as const;
|
|
50
|
+
const SSR_RUNTIME_PACKAGES = ["react", "react-dom", "react-server-dom-webpack"] as const;
|
|
51
|
+
const NATIVE_RUNTIME_PACKAGES = ["sharp"] as const;
|
|
52
|
+
const DEFAULT_AKAN_IMAGE_CONFIG: AkanImageConfig = {
|
|
53
|
+
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
|
54
|
+
imageSizes: [32, 48, 64, 96, 128, 256, 384],
|
|
55
|
+
formats: ["image/webp"],
|
|
56
|
+
qualities: [75],
|
|
57
|
+
minimumCacheTTL: 14400,
|
|
58
|
+
remotePatterns: [],
|
|
59
|
+
localPatterns: [{ pathname: "/**" }],
|
|
60
|
+
dangerouslyAllowSVG: false,
|
|
61
|
+
maximumRedirects: 3,
|
|
62
|
+
fetchTimeoutMs: 7000,
|
|
63
|
+
maxRemoteBytes: 25 * 1024 * 1024,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export class AkanAppConfig implements AppConfigResult {
|
|
67
|
+
app: App;
|
|
68
|
+
rootPackageJson: PackageJson;
|
|
69
|
+
docker: DockerConfig;
|
|
70
|
+
defaultDatabaseMode: DatabaseMode;
|
|
71
|
+
externalLibs: string[];
|
|
72
|
+
barrelImports: string[];
|
|
73
|
+
optimizeImports: string[];
|
|
74
|
+
images: AkanImageConfig;
|
|
75
|
+
i18n: AkanI18nConfig;
|
|
76
|
+
publicEnv: string[];
|
|
77
|
+
mobile: AkanMobileConfig;
|
|
78
|
+
baseDevEnv: BaseDevEnv;
|
|
79
|
+
libs: string[];
|
|
80
|
+
domains = new Set<string>();
|
|
81
|
+
subRoutes = new Map<string, Set<string>>();
|
|
82
|
+
basePaths = new Set<string>();
|
|
83
|
+
branches = new Set<string>(["debug", "develop", "main"]);
|
|
84
|
+
constructor(
|
|
85
|
+
app: App,
|
|
86
|
+
libs: string[],
|
|
87
|
+
rootPackageJson: PackageJson,
|
|
88
|
+
config: DeepPartial<AppConfigResult>,
|
|
89
|
+
baseDevEnv: BaseDevEnv,
|
|
90
|
+
) {
|
|
91
|
+
this.app = app;
|
|
92
|
+
this.rootPackageJson = rootPackageJson;
|
|
93
|
+
this.libs = libs;
|
|
94
|
+
this.baseDevEnv = baseDevEnv;
|
|
95
|
+
this.#applyRoutes(config?.routes);
|
|
96
|
+
this.defaultDatabaseMode = config?.defaultDatabaseMode ?? "single";
|
|
97
|
+
this.externalLibs = config?.externalLibs ?? [];
|
|
98
|
+
this.barrelImports = [
|
|
99
|
+
...DEFAULT_BARREL_IMPORTS,
|
|
100
|
+
...WORKSPACE_BARREL_FACETS.map((facet) => `@apps/${app.name}/${facet}`),
|
|
101
|
+
...libs.flatMap((lib) => WORKSPACE_BARREL_FACETS.map((facet) => `@libs/${lib}/${facet}`)),
|
|
102
|
+
...(config?.barrelImports ?? []),
|
|
103
|
+
];
|
|
104
|
+
this.optimizeImports = [...new Set([...DEFAULT_OPTIMIZE_IMPORTS, ...(config?.optimizeImports ?? [])])];
|
|
105
|
+
this.images = mergeImageConfig(config?.images as Partial<AkanImageConfig> | undefined);
|
|
106
|
+
this.i18n = resolveAkanI18nConfig(config?.i18n);
|
|
107
|
+
process.env.AKAN_PUBLIC_DEFAULT_LOCALE = this.i18n.defaultLocale;
|
|
108
|
+
process.env.AKAN_PUBLIC_LOCALES = this.i18n.locales.join(",");
|
|
109
|
+
this.publicEnv = (config?.publicEnv as string[] | undefined) ?? ([] as string[]);
|
|
110
|
+
this.mobile = this.#resolveMobileConfig(config.mobile);
|
|
111
|
+
this.docker = this.#makeDockerContent(config?.docker ?? {});
|
|
112
|
+
}
|
|
113
|
+
#resolveMobileConfig(mobile: DeepPartial<AkanMobileConfig> | undefined): AkanMobileConfig {
|
|
114
|
+
const { targets: rawTargets, ...rawMobile } = mobile ?? {};
|
|
115
|
+
const appName = rawMobile.appName ?? this.app.name;
|
|
116
|
+
const appId = rawMobile.appId ?? `com.${this.app.name}.app`;
|
|
117
|
+
const version = rawMobile.version ?? "0.0.1";
|
|
118
|
+
const buildNum = rawMobile.buildNum ?? 1;
|
|
119
|
+
const defaultTargetName = this.#defaultMobileTargetName(rawTargets);
|
|
120
|
+
const targetEntries = Object.entries(
|
|
121
|
+
rawTargets ?? {
|
|
122
|
+
[defaultTargetName]: {},
|
|
123
|
+
},
|
|
124
|
+
);
|
|
125
|
+
const targets = Object.fromEntries(
|
|
126
|
+
targetEntries.map(([name, rawTarget]) => {
|
|
127
|
+
const target = rawTarget as DeepPartial<AkanMobileTargetConfig>;
|
|
128
|
+
const fallbackBasePath = !rawTargets && this.basePaths.has(name) ? name : undefined;
|
|
129
|
+
const basePath = (target.basePath ?? fallbackBasePath)?.replace(/^\/+|\/+$/g, "") || undefined;
|
|
130
|
+
if (basePath && !this.basePaths.has(basePath)) {
|
|
131
|
+
throw new Error(
|
|
132
|
+
`Mobile target '${name}' uses unknown basePath '${basePath}' in apps/${this.app.name}/akan.config.ts`,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
const resolved = {
|
|
136
|
+
...rawMobile,
|
|
137
|
+
...target,
|
|
138
|
+
name,
|
|
139
|
+
basePath,
|
|
140
|
+
appName: target.appName ?? appName,
|
|
141
|
+
appId: target.appId ?? appId,
|
|
142
|
+
version: target.version ?? version,
|
|
143
|
+
buildNum: target.buildNum ?? buildNum,
|
|
144
|
+
plugins: {
|
|
145
|
+
...rawMobile.plugins,
|
|
146
|
+
...target.plugins,
|
|
147
|
+
},
|
|
148
|
+
android: {
|
|
149
|
+
...rawMobile.android,
|
|
150
|
+
...target.android,
|
|
151
|
+
},
|
|
152
|
+
ios: {
|
|
153
|
+
...rawMobile.ios,
|
|
154
|
+
...target.ios,
|
|
155
|
+
},
|
|
156
|
+
} satisfies AkanMobileTargetConfig;
|
|
157
|
+
return [name, resolved];
|
|
158
|
+
}),
|
|
159
|
+
);
|
|
160
|
+
return {
|
|
161
|
+
...rawMobile,
|
|
162
|
+
appName,
|
|
163
|
+
appId,
|
|
164
|
+
version,
|
|
165
|
+
buildNum,
|
|
166
|
+
targets,
|
|
167
|
+
plugins: rawMobile.plugins,
|
|
168
|
+
} as AkanMobileConfig;
|
|
169
|
+
}
|
|
170
|
+
#defaultMobileTargetName(rawTargets: DeepPartial<AkanMobileConfig>["targets"] | undefined) {
|
|
171
|
+
if (rawTargets && Object.keys(rawTargets).length > 0) return Object.keys(rawTargets)[0] as string;
|
|
172
|
+
return this.basePaths.has(this.app.name) ? this.app.name : "default";
|
|
173
|
+
}
|
|
174
|
+
#applyRoutes(routes: AkanRouteConfig[] = []) {
|
|
175
|
+
for (const route of routes) {
|
|
176
|
+
if (route.basePath) {
|
|
177
|
+
const basePath = route.basePath.replace(/^\/+|\/+$/g, "");
|
|
178
|
+
this.basePaths.add(basePath);
|
|
179
|
+
const domains = this.subRoutes.getOrInsert(basePath, new Set());
|
|
180
|
+
Object.keys(route.domains).forEach((branch) => void this.branches.add(branch));
|
|
181
|
+
Object.values(route.domains)
|
|
182
|
+
.flat()
|
|
183
|
+
.forEach((domain) => {
|
|
184
|
+
if (domain) domains.add(domain.toLowerCase().replace(/:\d+$/, ""));
|
|
185
|
+
});
|
|
186
|
+
} else {
|
|
187
|
+
Object.keys(route.domains).forEach((branch) => void this.branches.add(branch));
|
|
188
|
+
Object.values(route.domains)
|
|
189
|
+
.flat()
|
|
190
|
+
.forEach((domain) => {
|
|
191
|
+
if (domain) this.domains.add(domain.toLowerCase().replace(/:\d+$/, ""));
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const appName = this.app.name.toLowerCase();
|
|
196
|
+
const serveDomain = this.baseDevEnv.serveDomain.toLowerCase();
|
|
197
|
+
if (this.subRoutes.size === 0)
|
|
198
|
+
this.branches.forEach((branch) => void this.domains.add(`${appName}-${branch}.${serveDomain}`));
|
|
199
|
+
else
|
|
200
|
+
Array.from(this.subRoutes.entries()).forEach(([basePath, domains]) => {
|
|
201
|
+
this.branches.forEach((domain) => void domains.add(`${basePath}-${domain}.${serveDomain}`));
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
#getDockerRunScripts(runs: (string | { [key in Arch]?: string })[]) {
|
|
205
|
+
return runs.map((run) => {
|
|
206
|
+
if (typeof run === "string") return `RUN ${run}`;
|
|
207
|
+
else
|
|
208
|
+
return Object.entries(run)
|
|
209
|
+
.map(
|
|
210
|
+
([arch, script]) => `RUN if [ "$TARGETARCH" = "${arch}" ]; then \
|
|
211
|
+
${script}; \
|
|
212
|
+
fi`,
|
|
213
|
+
)
|
|
214
|
+
.join("\n");
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
#getDockerImageScript(image: string | { [key in Arch]?: string }, defaultImage: string) {
|
|
218
|
+
if (typeof image === "string") return `FROM ${image}`;
|
|
219
|
+
else return archs.map((arch) => `FROM ${image[arch] ?? defaultImage} AS ${arch}`).join("\n");
|
|
220
|
+
}
|
|
221
|
+
#makeDockerContent(docker: DeepPartial<DockerConfig>): DockerConfig {
|
|
222
|
+
if (docker.content) return { content: docker.content, image: {}, preRuns: [], postRuns: [], command: [] };
|
|
223
|
+
const preRunScripts = this.#getDockerRunScripts(docker.preRuns ?? []);
|
|
224
|
+
const postRunScripts = this.#getDockerRunScripts(docker.postRuns ?? []);
|
|
225
|
+
|
|
226
|
+
const imageScript = docker.image
|
|
227
|
+
? this.#getDockerImageScript(docker.image, "oven/bun:1-slim")
|
|
228
|
+
: "FROM oven/bun:1-slim";
|
|
229
|
+
const command = docker.command ?? ["bun", "main.js"];
|
|
230
|
+
const content = `${imageScript}
|
|
231
|
+
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
|
|
232
|
+
RUN apt-get update && apt-get upgrade -y
|
|
233
|
+
RUN apt-get install -y --no-install-recommends git redis build-essential python3 ca-certificates fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils udev ffmpeg
|
|
234
|
+
ARG TARGETARCH
|
|
235
|
+
${preRunScripts.join("\n")}
|
|
236
|
+
RUN mkdir -p /workspace
|
|
237
|
+
WORKDIR /workspace
|
|
238
|
+
COPY ./package.json ./package.json
|
|
239
|
+
RUN bun install --production
|
|
240
|
+
${postRunScripts.join("\n")}
|
|
241
|
+
COPY . .
|
|
242
|
+
ENV PORT=8282
|
|
243
|
+
ENV NODE_ENV=production
|
|
244
|
+
ENV AKAN_PUBLIC_REPO_NAME=${this.baseDevEnv.repoName}
|
|
245
|
+
ENV AKAN_PUBLIC_SERVE_DOMAIN=${this.baseDevEnv.serveDomain}
|
|
246
|
+
ENV AKAN_PUBLIC_APP_NAME=${this.app.name}
|
|
247
|
+
ENV AKAN_PUBLIC_ENV=${this.baseDevEnv.env}
|
|
248
|
+
${this.basePaths.size ? `ENV AKAN_PUBLIC_BASE_PATHS=${[...this.basePaths].join(",")}` : ""}
|
|
249
|
+
ENV AKAN_PUBLIC_DEFAULT_LOCALE=${this.i18n.defaultLocale}
|
|
250
|
+
ENV AKAN_PUBLIC_LOCALES=${this.i18n.locales.join(",")}
|
|
251
|
+
ENV AKAN_PUBLIC_OPERATION_MODE=cloud
|
|
252
|
+
|
|
253
|
+
CMD [${command.map((c) => `"${c}"`).join(",")}]`;
|
|
254
|
+
return { content, image: imageScript, preRuns: docker.preRuns ?? [], postRuns: docker.postRuns ?? [], command };
|
|
255
|
+
}
|
|
256
|
+
static async from(app: App) {
|
|
257
|
+
const [configImp, baseDevEnv, libs, rootPackageJson] = await Promise.all([
|
|
258
|
+
import(`${app.cwdPath}/akan.config.ts`).then((mod) => mod.default),
|
|
259
|
+
WorkspaceExecutor.getBaseDevEnv(path.join(app.workspace.workspaceRoot, ".env")),
|
|
260
|
+
app.workspace.getLibs(),
|
|
261
|
+
app.workspace.getPackageJson(),
|
|
262
|
+
]);
|
|
263
|
+
const config = typeof configImp === "function" ? configImp(app) : configImp;
|
|
264
|
+
return new AkanAppConfig(app, libs, rootPackageJson, config, baseDevEnv);
|
|
265
|
+
}
|
|
266
|
+
getProductionPackageJson(data: Partial<PackageJson> = {}): PackageJson {
|
|
267
|
+
return {
|
|
268
|
+
name: this.app.name,
|
|
269
|
+
description: this.app.name,
|
|
270
|
+
version: "1.0.0",
|
|
271
|
+
main: "./main.js",
|
|
272
|
+
dependencies: Object.fromEntries(
|
|
273
|
+
[...new Set([...this.externalLibs, ...SSR_RUNTIME_PACKAGES, ...NATIVE_RUNTIME_PACKAGES])].map((lib) => {
|
|
274
|
+
const version = this.rootPackageJson.dependencies?.[lib] ?? this.rootPackageJson.devDependencies?.[lib];
|
|
275
|
+
if (!version) throw new Error(`Dependency ${lib} not found in package.json`);
|
|
276
|
+
return [lib, version];
|
|
277
|
+
}),
|
|
278
|
+
),
|
|
279
|
+
...data,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function mergeImageConfig(config: Partial<AkanImageConfig> = {}): AkanImageConfig {
|
|
285
|
+
return {
|
|
286
|
+
...DEFAULT_AKAN_IMAGE_CONFIG,
|
|
287
|
+
...config,
|
|
288
|
+
deviceSizes: config.deviceSizes ?? DEFAULT_AKAN_IMAGE_CONFIG.deviceSizes,
|
|
289
|
+
imageSizes: config.imageSizes ?? DEFAULT_AKAN_IMAGE_CONFIG.imageSizes,
|
|
290
|
+
formats: config.formats ?? DEFAULT_AKAN_IMAGE_CONFIG.formats,
|
|
291
|
+
qualities: config.qualities ?? DEFAULT_AKAN_IMAGE_CONFIG.qualities,
|
|
292
|
+
remotePatterns: config.remotePatterns ?? DEFAULT_AKAN_IMAGE_CONFIG.remotePatterns,
|
|
293
|
+
localPatterns: config.localPatterns ?? DEFAULT_AKAN_IMAGE_CONFIG.localPatterns,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export class AkanLibConfig implements LibConfigResult {
|
|
298
|
+
lib: Lib;
|
|
299
|
+
externalLibs: string[];
|
|
300
|
+
constructor(lib: Lib, config: DeepPartial<LibConfigResult>) {
|
|
301
|
+
this.lib = lib;
|
|
302
|
+
this.externalLibs = config?.externalLibs ?? [];
|
|
303
|
+
}
|
|
304
|
+
static async from(lib: Lib) {
|
|
305
|
+
const [configImp] = await Promise.all([import(`${lib.cwdPath}/akan.config.ts`).then((mod) => mod.default)]);
|
|
306
|
+
const config = typeof configImp === "function" ? configImp(lib) : configImp;
|
|
307
|
+
return new AkanLibConfig(lib, config);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export const increaseBuildNum = async (app: App) => {
|
|
312
|
+
const appConfig = await AkanAppConfig.from(app);
|
|
313
|
+
const akanConfigPath = path.join(app.cwdPath, "akan.config.ts");
|
|
314
|
+
const akanConfig = fs.readFileSync(akanConfigPath, "utf8");
|
|
315
|
+
const akanConfigContent = akanConfig.replace(
|
|
316
|
+
`buildNum: ${appConfig.mobile.buildNum}`,
|
|
317
|
+
`buildNum: ${appConfig.mobile.buildNum + 1}`,
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
fs.writeFileSync(akanConfigPath, akanConfigContent);
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
export const decreaseBuildNum = async (app: App) => {
|
|
324
|
+
const appConfig = await AkanAppConfig.from(app);
|
|
325
|
+
const akanConfigPath = path.join(app.cwdPath, "akan.config.ts");
|
|
326
|
+
const akanConfig = fs.readFileSync(akanConfigPath, "utf8");
|
|
327
|
+
const akanConfigContent = akanConfig.replace(
|
|
328
|
+
`buildNum: ${appConfig.mobile.buildNum}`,
|
|
329
|
+
`buildNum: ${appConfig.mobile.buildNum - 1}`,
|
|
330
|
+
);
|
|
331
|
+
fs.writeFileSync(akanConfigPath, akanConfigContent);
|
|
332
|
+
};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import type { CapacitorConfig } from "@capacitor/cli";
|
|
2
|
+
import type { AkanI18nConfig } from "akanjs/common";
|
|
3
|
+
import type { AkanImageConfig } from "akanjs/server";
|
|
4
|
+
import type { App, Lib } from "../commandDecorators";
|
|
5
|
+
|
|
6
|
+
export const archs = ["amd64", "arm64"] as const;
|
|
7
|
+
/** CPU architecture names supported by architecture-specific Docker settings. */
|
|
8
|
+
export type Arch = (typeof archs)[number];
|
|
9
|
+
export interface DockerConfig {
|
|
10
|
+
/** Full Dockerfile content. When set, Akan uses it instead of composing the default Dockerfile. */
|
|
11
|
+
content: string;
|
|
12
|
+
/** Base Docker image, either shared for all architectures or mapped by target architecture. */
|
|
13
|
+
image: string | { [key in Arch]?: string };
|
|
14
|
+
/** Shell commands inserted before app files are copied into the generated Dockerfile. */
|
|
15
|
+
preRuns: (string | { [key in Arch]?: string })[];
|
|
16
|
+
/** Shell commands inserted after production dependencies are installed in the generated Dockerfile. */
|
|
17
|
+
postRuns: (string | { [key in Arch]?: string })[];
|
|
18
|
+
/** Container startup command written to the generated Dockerfile CMD instruction. */
|
|
19
|
+
command: string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface AkanRouteDomains {
|
|
23
|
+
/** Production branch domains. */
|
|
24
|
+
main?: string[];
|
|
25
|
+
/** Develop branch domains. */
|
|
26
|
+
develop?: string[];
|
|
27
|
+
/** Debug branch domains. */
|
|
28
|
+
debug?: string[];
|
|
29
|
+
/** Additional branch-specific domains keyed by branch name. */
|
|
30
|
+
[branch: string]: string[] | undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface AkanRouteConfig {
|
|
34
|
+
/** Optional URL base path served by this route, such as "shop" for /shop. */
|
|
35
|
+
basePath?: string;
|
|
36
|
+
/** Domains grouped by branch name for this route. */
|
|
37
|
+
domains: AkanRouteDomains;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Default database topology used by database-aware commands and runtime setup. */
|
|
41
|
+
export type DatabaseMode = "single" | "multiple" | "cluster";
|
|
42
|
+
/** Environment names used when producing mobile builds. */
|
|
43
|
+
export type MobileEnv = "local" | "debug" | "develop" | "main";
|
|
44
|
+
/** Native device permissions that can be requested by a mobile target. */
|
|
45
|
+
export type MobilePermission = "camera" | "contacts" | "location" | "push";
|
|
46
|
+
|
|
47
|
+
export interface AkanMobileTargetAssets {
|
|
48
|
+
/** Path to the icon asset used for this native target. */
|
|
49
|
+
icon?: string;
|
|
50
|
+
/** Path to the splash screen asset used for this native target. */
|
|
51
|
+
splash?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface AkanMobileTargetLinks {
|
|
55
|
+
/** Custom URL schemes handled by this native target. */
|
|
56
|
+
schemes?: string[];
|
|
57
|
+
/** iOS associated domains used for universal links. */
|
|
58
|
+
associatedDomains?: string[];
|
|
59
|
+
/** Android hosts used for app links. */
|
|
60
|
+
androidHosts?: string[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface AkanMobileTargetFiles {
|
|
64
|
+
/** Extra iOS files copied into the native project, keyed by destination path. */
|
|
65
|
+
ios?: Record<string, string>;
|
|
66
|
+
/** Extra Android files copied into the native project, keyed by destination path. */
|
|
67
|
+
android?: Record<string, string>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface AkanMobileTargetConfig extends CapacitorConfig {
|
|
71
|
+
/** Target name used by Akan mobile commands. */
|
|
72
|
+
name: string;
|
|
73
|
+
/** Route base path this native target should open. Must match a configured route basePath when set. */
|
|
74
|
+
basePath?: string;
|
|
75
|
+
/** Display name for this native target. */
|
|
76
|
+
appName: string;
|
|
77
|
+
/** Native application identifier, such as com.example.app. */
|
|
78
|
+
appId: string;
|
|
79
|
+
/** Native app version string. */
|
|
80
|
+
version: string;
|
|
81
|
+
/** Native build number. */
|
|
82
|
+
buildNum: number;
|
|
83
|
+
/** Icon and splash assets for this target. */
|
|
84
|
+
assets?: AkanMobileTargetAssets;
|
|
85
|
+
/** Device permissions requested by this target. */
|
|
86
|
+
permissions?: MobilePermission[];
|
|
87
|
+
/** Deep link and universal/app link settings for this target. */
|
|
88
|
+
links?: AkanMobileTargetLinks;
|
|
89
|
+
/** Extra files copied into native platform projects for this target. */
|
|
90
|
+
files?: AkanMobileTargetFiles;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface AkanMobileConfig extends CapacitorConfig {
|
|
94
|
+
/** Default display name used by mobile targets. */
|
|
95
|
+
appName: string;
|
|
96
|
+
/** Default native application identifier used by mobile targets. */
|
|
97
|
+
appId: string;
|
|
98
|
+
/** Default native app version used by mobile targets. */
|
|
99
|
+
version: string;
|
|
100
|
+
/** Default native build number used by mobile targets. */
|
|
101
|
+
buildNum: number;
|
|
102
|
+
/** Named native build targets, usually mapped to route base paths or app variants. */
|
|
103
|
+
targets: Record<string, AkanMobileTargetConfig>;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface AppConfigResult {
|
|
107
|
+
/** Customizes the production Dockerfile content, base image, run scripts, and startup command. */
|
|
108
|
+
docker: DockerConfig;
|
|
109
|
+
/** Selects the default database deployment mode used by database-aware commands and runtime setup. */
|
|
110
|
+
defaultDatabaseMode: DatabaseMode;
|
|
111
|
+
/** Maps app domains and optional base paths for multi-domain or multi-client routing. */
|
|
112
|
+
routes?: AkanRouteConfig[];
|
|
113
|
+
/** Lists runtime dependencies that should be preserved in the generated production package. */
|
|
114
|
+
externalLibs: string[];
|
|
115
|
+
/** Adds custom barrel import roots to Akan's default framework, app, and library facets. */
|
|
116
|
+
barrelImports: string[];
|
|
117
|
+
/** Adds packages or import roots that should participate in optimized import handling. */
|
|
118
|
+
optimizeImports: string[];
|
|
119
|
+
/** Configures optimized image sizes, formats, allowed sources, cache, timeout, and byte limits. */
|
|
120
|
+
images: AkanImageConfig;
|
|
121
|
+
/** Defines supported locales and the default locale exposed through Akan public locale env values. */
|
|
122
|
+
i18n: AkanI18nConfig;
|
|
123
|
+
/** Allows selected environment keys to be exposed to browser-side code. */
|
|
124
|
+
publicEnv: string[];
|
|
125
|
+
/** Defines native app identity, versions, targets, permissions, assets, links, and Capacitor options. */
|
|
126
|
+
mobile: AkanMobileConfig;
|
|
127
|
+
}
|
|
128
|
+
export interface LibConfigResult {
|
|
129
|
+
/** Lists runtime dependencies that should be preserved when a library requires external packages. */
|
|
130
|
+
externalLibs: string[];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export type DeepPartial<T> = {
|
|
134
|
+
[P in keyof T]?: T[P] extends unknown[] ? T[P] : T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export type AppConfig = DeepPartial<AppConfigResult> | ((app: App) => DeepPartial<AppConfigResult>);
|
|
138
|
+
export type LibConfig = DeepPartial<LibConfigResult> | ((lib: Lib) => DeepPartial<LibConfigResult>);
|
|
139
|
+
|
|
140
|
+
export type AkanConfigFile = object;
|
|
141
|
+
|
|
142
|
+
export interface FileConventionScanResult {
|
|
143
|
+
constant: { databases: string[]; scalars: string[] };
|
|
144
|
+
dictionary: { databases: string[]; services: string[]; scalars: string[] };
|
|
145
|
+
document: { databases: string[]; scalars: string[] };
|
|
146
|
+
service: { databases: string[]; services: string[] };
|
|
147
|
+
signal: { databases: string[]; services: string[] };
|
|
148
|
+
store: { databases: string[]; services: string[] };
|
|
149
|
+
template: { databases: string[]; services: string[]; scalars: string[] };
|
|
150
|
+
unit: { databases: string[]; services: string[]; scalars: string[] };
|
|
151
|
+
util: { databases: string[]; services: string[]; scalars: string[] };
|
|
152
|
+
view: { databases: string[]; services: string[]; scalars: string[] };
|
|
153
|
+
zone: { databases: string[]; services: string[]; scalars: string[] };
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export interface ScanResult {
|
|
157
|
+
name: string;
|
|
158
|
+
type: "app" | "lib";
|
|
159
|
+
repoName: string;
|
|
160
|
+
serveDomain: string;
|
|
161
|
+
files: FileConventionScanResult;
|
|
162
|
+
libDeps: string[];
|
|
163
|
+
pkgDeps: string[];
|
|
164
|
+
dependencies: string[];
|
|
165
|
+
devDependencies: string[];
|
|
166
|
+
}
|
|
167
|
+
export interface AppScanResult extends ScanResult {
|
|
168
|
+
akanConfig: AppConfigResult;
|
|
169
|
+
routes: string[];
|
|
170
|
+
}
|
|
171
|
+
export interface LibScanResult extends ScanResult {
|
|
172
|
+
akanConfig: LibConfigResult;
|
|
173
|
+
}
|
|
174
|
+
export interface PkgScanResult {
|
|
175
|
+
name: string;
|
|
176
|
+
pkgDeps: string[];
|
|
177
|
+
dependencies: string[];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export interface WorkspaceScanResult {
|
|
181
|
+
appNames: string[];
|
|
182
|
+
libNames: string[];
|
|
183
|
+
pkgNames: string[];
|
|
184
|
+
apps: { [key: string]: AppScanResult };
|
|
185
|
+
libs: { [key: string]: LibScanResult };
|
|
186
|
+
pkgs: { [key: string]: PkgScanResult };
|
|
187
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Logger } from "akanjs/common";
|
|
2
|
+
|
|
3
|
+
export interface ApplicationBuildPhaseResult {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
durationMs: number;
|
|
7
|
+
summary?: string;
|
|
8
|
+
skipped?: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface ApplicationBuildResult {
|
|
12
|
+
phases: ApplicationBuildPhaseResult[];
|
|
13
|
+
durationMs: number;
|
|
14
|
+
outputDir: string;
|
|
15
|
+
artifactDir: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ApplicationBuildProgressReporter {
|
|
19
|
+
phaseStart?(phase: Pick<ApplicationBuildPhaseResult, "id" | "label">): void;
|
|
20
|
+
phaseDone?(phase: ApplicationBuildPhaseResult): void;
|
|
21
|
+
phaseFail?(phase: Pick<ApplicationBuildPhaseResult, "id" | "label">, error: unknown): void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class ApplicationBuildReporter {
|
|
25
|
+
static create(): ApplicationBuildProgressReporter {
|
|
26
|
+
return {
|
|
27
|
+
phaseDone: (phase) => Logger.rawLog(ApplicationBuildReporter.formatPhaseLine(phase)),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static printSummary(result: ApplicationBuildResult) {
|
|
32
|
+
Logger.rawLog("");
|
|
33
|
+
Logger.rawLog(`Route artifacts: ${result.artifactDir}`);
|
|
34
|
+
Logger.rawLog(`Server output: ${result.outputDir}`);
|
|
35
|
+
Logger.rawLog(`Done in ${ApplicationBuildReporter.formatDuration(result.durationMs)}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static formatError(error: unknown): string {
|
|
39
|
+
if (error instanceof AggregateError) {
|
|
40
|
+
const nestedMessages = error.errors
|
|
41
|
+
.map(
|
|
42
|
+
(nestedError, index) =>
|
|
43
|
+
ApplicationBuildReporter.formatError(nestedError).trim() || `Unknown error ${index + 1}`,
|
|
44
|
+
)
|
|
45
|
+
.map((message) => message.replace(/^/gm, " "))
|
|
46
|
+
.join("\n");
|
|
47
|
+
|
|
48
|
+
return nestedMessages ? `${error.message}\n${nestedMessages}` : error.message;
|
|
49
|
+
}
|
|
50
|
+
if (error instanceof Error) {
|
|
51
|
+
const causeMessage = error.cause ? `\nCaused by: ${ApplicationBuildReporter.formatError(error.cause)}` : "";
|
|
52
|
+
return `${error.message}${causeMessage}`;
|
|
53
|
+
}
|
|
54
|
+
if (typeof error === "object" && error !== null && "message" in error) return String(error.message);
|
|
55
|
+
return String(error);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static formatDuration(ms: number): string {
|
|
59
|
+
if (ms < 1000) return `${ms}ms`;
|
|
60
|
+
if (ms < 60_000) return `${Math.round(ms / 100) / 10}s`;
|
|
61
|
+
const seconds = Math.floor(ms / 1000);
|
|
62
|
+
return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static formatPhaseLine(phase: ApplicationBuildPhaseResult): string {
|
|
66
|
+
const summary = phase.summary ? `: ${phase.summary}` : "";
|
|
67
|
+
return `✓ ${phase.label}${summary} (${ApplicationBuildReporter.formatDuration(phase.durationMs)})`;
|
|
68
|
+
}
|
|
69
|
+
}
|