akanjs 2.0.7 → 2.1.0-rc.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/README.ko.md +4 -4
- package/README.md +4 -4
- package/client/router.ts +10 -3
- package/document/documentSchema.ts +9 -1
- package/index.ts +187 -0
- package/package.json +6 -50
- package/server/akanApp.ts +2 -24
- package/server/akanAppHeaders.ts +30 -0
- package/server/di/predefinedAdaptor.ts +1 -1
- package/types/dictionary/base.dictionary.d.ts +1 -1
- package/types/dictionary/dictionary.d.ts +8 -8
- package/types/document/documentSchema.d.ts +33 -0
- package/types/document/index.d.ts +1 -1
- package/types/document/schema.d.ts +1 -1
- package/types/document/types.d.ts +1 -1
- package/types/{devkit/akanConfig/types.d.ts → index.d.ts} +45 -54
- package/types/server/akanAppHeaders.d.ts +1 -0
- package/types/server/di/predefinedAdaptor.d.ts +1 -1
- package/types/store/baseSt.d.ts +2 -2
- package/ui/Link/SsrLink.tsx +2 -2
- package/webkit/useCodepush.tsx +1 -1
- package/cli/application/application.command.ts +0 -224
- package/cli/application/application.interface.tsx +0 -225
- package/cli/application/application.runner.ts +0 -355
- package/cli/application/application.script.ts +0 -244
- package/cli/build.ts +0 -27
- package/cli/cloud/cloud.command.ts +0 -48
- package/cli/cloud/cloud.runner.ts +0 -157
- package/cli/cloud/cloud.script.ts +0 -40
- package/cli/guideline/guideline.command.ts +0 -31
- package/cli/guideline/guideline.prompt.ts +0 -212
- package/cli/guideline/guideline.runner.ts +0 -53
- package/cli/guideline/guideline.script.ts +0 -33
- package/cli/guidelines/___library/sharedUiStructureDescription.en.md +0 -767
- package/cli/guidelines/___library/utilUiStructureDescription.en.md +0 -395
- package/cli/guidelines/___lint/lintRuleDescription.en.md +0 -64
- package/cli/guidelines/___module/moduleStructureDescription.en.md +0 -80
- package/cli/guidelines/componentRule/componentRule.generate.json +0 -131
- package/cli/guidelines/componentRule/componentRule.instruction.md +0 -637
- package/cli/guidelines/cssRule/cssRule.generate.json +0 -93
- package/cli/guidelines/cssRule/cssRule.instruction.md +0 -435
- package/cli/guidelines/databaseModule/databaseModule.generate.json +0 -51
- package/cli/guidelines/databaseModule/databaseModule.instruction.md +0 -612
- package/cli/guidelines/docPageRule/docPageRule.generate.json +0 -72
- package/cli/guidelines/docPageRule/docPageRule.instruction.md +0 -389
- package/cli/guidelines/enumConstant/enumConstant.generate.json +0 -24
- package/cli/guidelines/enumConstant/enumConstant.instruction.md +0 -232
- package/cli/guidelines/framework/framework.generate.json +0 -119
- package/cli/guidelines/framework/framework.instruction.md +0 -1110
- package/cli/guidelines/howToUseStore/howToUseStore.generate.json +0 -0
- package/cli/guidelines/modelConstant/modelConstant.generate.json +0 -128
- package/cli/guidelines/modelConstant/modelConstant.instruction.md +0 -506
- package/cli/guidelines/modelDictionary/modelDictionary.generate.json +0 -108
- package/cli/guidelines/modelDictionary/modelDictionary.instruction.md +0 -547
- package/cli/guidelines/modelDocument/modelDocument.generate.json +0 -129
- package/cli/guidelines/modelDocument/modelDocument.instruction.md +0 -509
- package/cli/guidelines/modelService/modelService.generate.json +0 -135
- package/cli/guidelines/modelService/modelService.instruction.md +0 -708
- package/cli/guidelines/modelSignal/modelSignal.generate.json +0 -201
- package/cli/guidelines/modelSignal/modelSignal.instruction.md +0 -552
- package/cli/guidelines/modelStore/modelStore.generate.json +0 -130
- package/cli/guidelines/modelStore/modelStore.instruction.md +0 -585
- package/cli/guidelines/modelTemplate/modelTemplate.generate.json +0 -104
- package/cli/guidelines/modelTemplate/modelTemplate.instruction.md +0 -604
- package/cli/guidelines/modelUnit/modelUnit.generate.json +0 -92
- package/cli/guidelines/modelUnit/modelUnit.instruction.md +0 -541
- package/cli/guidelines/modelUtil/modelUtil.generate.json +0 -93
- package/cli/guidelines/modelUtil/modelUtil.instruction.md +0 -752
- package/cli/guidelines/modelView/modelView.generate.json +0 -80
- package/cli/guidelines/modelView/modelView.instruction.md +0 -1005
- package/cli/guidelines/modelZone/modelZone.generate.json +0 -126
- package/cli/guidelines/modelZone/modelZone.instruction.md +0 -528
- package/cli/guidelines/scalarConstant/scalarConstant.generate.json +0 -106
- package/cli/guidelines/scalarConstant/scalarConstant.instruction.md +0 -442
- package/cli/guidelines/scalarDictionary/scalarDictionary.generate.json +0 -83
- package/cli/guidelines/scalarDictionary/scalarDictionary.instruction.md +0 -273
- package/cli/guidelines/scalarModule/scalarModule.generate.json +0 -35
- package/cli/guidelines/scalarModule/scalarModule.instruction.md +0 -81
- package/cli/guidelines/sharedUiUsage/sharedUiUsage.generate.json +0 -108
- package/cli/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +0 -310
- package/cli/guidelines/utilUiUsage/utilUiUsage.generate.json +0 -140
- package/cli/guidelines/utilUiUsage/utilUiUsage.instruction.md +0 -339
- package/cli/index.js +0 -184444
- package/cli/index.ts +0 -24
- package/cli/library/library.command.ts +0 -28
- package/cli/library/library.runner.ts +0 -66
- package/cli/library/library.script.ts +0 -39
- package/cli/module/module.command.ts +0 -35
- package/cli/module/module.prompt.ts +0 -18
- package/cli/module/module.request.ts +0 -319
- package/cli/module/module.runner.ts +0 -76
- package/cli/module/module.script.ts +0 -161
- package/cli/npmRegistry.ts +0 -13
- package/cli/openBrowser.ts +0 -15
- package/cli/package/package.command.ts +0 -32
- package/cli/package/package.runner.ts +0 -94
- package/cli/package/package.script.ts +0 -35
- package/cli/page/page.command.ts +0 -14
- package/cli/page/page.runner.ts +0 -14
- package/cli/page/page.script.ts +0 -12
- package/cli/pluralizeName.ts +0 -5
- package/cli/scalar/scalar.command.ts +0 -21
- package/cli/scalar/scalar.prompt.ts +0 -131
- package/cli/scalar/scalar.runner.ts +0 -38
- package/cli/scalar/scalar.script.ts +0 -16
- package/cli/semver.ts +0 -18
- package/cli/templates/__scalar/__model__/__model__.constant.ts +0 -15
- package/cli/templates/__scalar/__model__/__model__.dictionary.ts +0 -19
- package/cli/templates/__scalar/__model__/__model__.document.ts +0 -15
- package/cli/templates/app/akan.config.ts +0 -14
- package/cli/templates/app/env/env.client.debug.ts.template +0 -7
- package/cli/templates/app/env/env.client.develop.ts.template +0 -7
- package/cli/templates/app/env/env.client.local.ts.template +0 -7
- package/cli/templates/app/env/env.client.main.ts.template +0 -7
- package/cli/templates/app/env/env.client.testing.ts.template +0 -7
- package/cli/templates/app/env/env.client.ts +0 -21
- package/cli/templates/app/env/env.client.type.ts +0 -16
- package/cli/templates/app/env/env.server.debug.ts.template +0 -7
- package/cli/templates/app/env/env.server.develop.ts.template +0 -7
- package/cli/templates/app/env/env.server.local.ts.template +0 -7
- package/cli/templates/app/env/env.server.main.ts.template +0 -7
- package/cli/templates/app/env/env.server.testing.ts.template +0 -6
- package/cli/templates/app/env/env.server.ts +0 -20
- package/cli/templates/app/lib/___appName__/__appName__.dictionary.ts +0 -17
- package/cli/templates/app/lib/___appName__/__appName__.service.ts +0 -13
- package/cli/templates/app/lib/___appName__/__appName__.signal.ts +0 -17
- package/cli/templates/app/lib/___appName__/__appName__.store.ts +0 -15
- package/cli/templates/app/lib/option.ts +0 -17
- package/cli/templates/app/main.ts +0 -16
- package/cli/templates/app/package.json.template +0 -5
- package/cli/templates/app/page/_index.tsx +0 -296
- package/cli/templates/app/page/_layout.tsx +0 -31
- package/cli/templates/app/page/styles.css.template +0 -53
- package/cli/templates/app/public/favicon.ico +0 -0
- package/cli/templates/app/public/logo.png +0 -0
- package/cli/templates/app/tsconfig.json.template +0 -21
- package/cli/templates/client.ts +0 -46
- package/cli/templates/crudPages/[__model__Id]/edit/page.tsx +0 -47
- package/cli/templates/crudPages/[__model__Id]/page.tsx +0 -52
- package/cli/templates/crudPages/new/page.tsx +0 -42
- package/cli/templates/crudPages/page.tsx +0 -43
- package/cli/templates/crudSinglePage/page.tsx +0 -37
- package/cli/templates/env/_env.server.type.ts +0 -16
- package/cli/templates/facetIndex/index.ts +0 -32
- package/cli/templates/index.ts +0 -10
- package/cli/templates/lib/__lib/lib.constant.ts +0 -38
- package/cli/templates/lib/__lib/lib.dictionary.ts +0 -33
- package/cli/templates/lib/__lib/lib.document.ts +0 -35
- package/cli/templates/lib/__lib/lib.service.ts +0 -33
- package/cli/templates/lib/__lib/lib.signal.ts +0 -34
- package/cli/templates/lib/__lib/lib.store.ts +0 -33
- package/cli/templates/lib/cnst.ts +0 -29
- package/cli/templates/lib/db.ts +0 -32
- package/cli/templates/lib/dict.ts +0 -49
- package/cli/templates/lib/sig.ts +0 -60
- package/cli/templates/lib/srv.ts +0 -34
- package/cli/templates/lib/st.ts +0 -31
- package/cli/templates/lib/useClient.ts +0 -19
- package/cli/templates/lib/useServer.ts +0 -7
- package/cli/templates/libRoot/.gitignore.template +0 -16
- package/cli/templates/libRoot/akan.config.ts +0 -12
- package/cli/templates/libRoot/base/baseLogic.ts +0 -10
- package/cli/templates/libRoot/base/index.ts +0 -8
- package/cli/templates/libRoot/common/commonLogic.ts +0 -10
- package/cli/templates/libRoot/common/index.ts +0 -8
- package/cli/templates/libRoot/env/env.server.example.ts.template +0 -6
- package/cli/templates/libRoot/env/env.server.testing.ts.template +0 -6
- package/cli/templates/libRoot/lib/___libName__/__libName__.dictionary.ts +0 -15
- package/cli/templates/libRoot/lib/___libName__/__libName__.service.ts +0 -11
- package/cli/templates/libRoot/lib/___libName__/__libName__.store.ts +0 -13
- package/cli/templates/libRoot/lib/option.ts +0 -17
- package/cli/templates/libRoot/package.json.template +0 -5
- package/cli/templates/libRoot/srvkit/backendLogic.ts +0 -10
- package/cli/templates/libRoot/srvkit/index.ts +0 -8
- package/cli/templates/libRoot/tsconfig.json.template +0 -11
- package/cli/templates/libRoot/ui/index.ts +0 -7
- package/cli/templates/libRoot/webkit/frontendLogic.ts +0 -10
- package/cli/templates/libRoot/webkit/index.ts +0 -8
- package/cli/templates/localDev/docker-compose.yaml.template +0 -37
- package/cli/templates/module/__Model__.Template.tsx +0 -36
- package/cli/templates/module/__Model__.Unit.tsx +0 -26
- package/cli/templates/module/__Model__.Util.tsx +0 -30
- package/cli/templates/module/__Model__.View.tsx +0 -29
- package/cli/templates/module/__Model__.Zone.tsx +0 -43
- package/cli/templates/module/__model__.constant.ts +0 -24
- package/cli/templates/module/__model__.dictionary.ts +0 -30
- package/cli/templates/module/__model__.document.ts +0 -23
- package/cli/templates/module/__model__.service.ts +0 -16
- package/cli/templates/module/__model__.signal.ts +0 -27
- package/cli/templates/module/__model__.store.ts +0 -19
- package/cli/templates/moduleRoot/index.tsx +0 -31
- package/cli/templates/pkgRoot/tsconfig.json.template +0 -10
- package/cli/templates/server.ts +0 -45
- package/cli/templates/workspaceRoot/.env.template +0 -14
- package/cli/templates/workspaceRoot/.gitignore.template +0 -120
- package/cli/templates/workspaceRoot/.vscode/settings.json.template +0 -23
- package/cli/templates/workspaceRoot/biome.json.template +0 -191
- package/cli/templates/workspaceRoot/bunfig.toml +0 -4
- package/cli/templates/workspaceRoot/package.json.template +0 -7
- package/cli/templates/workspaceRoot/tsconfig.json.template +0 -29
- package/cli/testHelpers.ts +0 -171
- package/cli/workspace/workspace.command.ts +0 -55
- package/cli/workspace/workspace.runner.ts +0 -79
- package/cli/workspace/workspace.script.ts +0 -74
- package/devkit/aiEditor.ts +0 -299
- package/devkit/akanApp/akanApp.host.ts +0 -393
- package/devkit/akanApp/index.ts +0 -1
- package/devkit/akanConfig/akanConfig.ts +0 -360
- package/devkit/akanConfig/index.ts +0 -2
- package/devkit/akanConfig/types.ts +0 -187
- package/devkit/applicationBuildReporter.ts +0 -69
- package/devkit/applicationBuildRunner.ts +0 -302
- package/devkit/applicationReleasePackager.ts +0 -205
- package/devkit/artifact/implicitRootLayout.ts +0 -155
- package/devkit/artifact/index.ts +0 -1
- package/devkit/artifact/routeSeedIndex.ts +0 -128
- package/devkit/auth.ts +0 -41
- package/devkit/builder.ts +0 -164
- package/devkit/capacitor.base.config.ts +0 -88
- package/devkit/capacitorApp.ts +0 -443
- package/devkit/commandDecorators/argMeta.ts +0 -102
- package/devkit/commandDecorators/command.ts +0 -340
- package/devkit/commandDecorators/commandBuilder.ts +0 -224
- package/devkit/commandDecorators/commandMeta.ts +0 -6
- package/devkit/commandDecorators/dependencyBuilder.ts +0 -100
- package/devkit/commandDecorators/helpFormatter.ts +0 -220
- package/devkit/commandDecorators/index.ts +0 -8
- package/devkit/commandDecorators/targetMeta.ts +0 -31
- package/devkit/commandDecorators/types.ts +0 -10
- package/devkit/constants.ts +0 -25
- package/devkit/createTunnel.ts +0 -36
- package/devkit/dependencyScanner.ts +0 -339
- package/devkit/executors.ts +0 -1362
- package/devkit/extractDeps.ts +0 -85
- package/devkit/fileEditor.ts +0 -106
- package/devkit/fileSys.ts +0 -39
- package/devkit/frontendBuild/allRoutesBuilder.ts +0 -103
- package/devkit/frontendBuild/clientBuildTypes.ts +0 -114
- package/devkit/frontendBuild/clientEntriesBundler.ts +0 -300
- package/devkit/frontendBuild/clientEntryDiscovery.ts +0 -196
- package/devkit/frontendBuild/csrArtifactBuilder.ts +0 -237
- package/devkit/frontendBuild/cssCompiler.ts +0 -285
- package/devkit/frontendBuild/cssImportResolver.ts +0 -116
- package/devkit/frontendBuild/fontOptimizer.ts +0 -427
- package/devkit/frontendBuild/hmrChangeClassifier.ts +0 -28
- package/devkit/frontendBuild/hmrWatcher.ts +0 -101
- package/devkit/frontendBuild/index.ts +0 -18
- package/devkit/frontendBuild/pagesBundleBuilder.ts +0 -137
- package/devkit/frontendBuild/pagesEntrySourceGenerator.ts +0 -37
- package/devkit/frontendBuild/precompressArtifacts.ts +0 -59
- package/devkit/frontendBuild/routeClientBuilder.ts +0 -290
- package/devkit/frontendBuild/routesManifestArtifactSerializer.ts +0 -62
- package/devkit/frontendBuild/ssrBaseArtifactBuilder.ts +0 -139
- package/devkit/frontendBuild/vendorSpecifiers.ts +0 -16
- package/devkit/frontendBuild/watchRootResolver.ts +0 -28
- package/devkit/getCredentials.ts +0 -19
- package/devkit/getDirname.ts +0 -3
- package/devkit/getModelFileData.ts +0 -59
- package/devkit/getRelatedCnsts.ts +0 -300
- package/devkit/guideline.ts +0 -19
- package/devkit/incrementalBuilder/incrementalBuilder.host.ts +0 -152
- package/devkit/incrementalBuilder/incrementalBuilder.proc.ts +0 -331
- package/devkit/incrementalBuilder/index.ts +0 -1
- package/devkit/index.ts +0 -36
- package/devkit/lint/no-deep-internal-import.grit +0 -25
- package/devkit/lint/no-import-client-functions.grit +0 -32
- package/devkit/lint/no-import-external-library.grit +0 -21
- package/devkit/lint/no-js-private-class-method.grit +0 -42
- package/devkit/lint/no-use-client-in-server.grit +0 -7
- package/devkit/lint/non-scalar-props-restricted.grit +0 -13
- package/devkit/linter.ts +0 -248
- package/devkit/mobile/index.ts +0 -1
- package/devkit/mobile/mobileTarget.ts +0 -88
- package/devkit/prompter.ts +0 -71
- package/devkit/scanInfo.ts +0 -606
- package/devkit/selectModel.ts +0 -11
- package/devkit/spinner.ts +0 -54
- package/devkit/src/capacitorApp.ts +0 -277
- package/devkit/sshTunnel.ts +0 -151
- package/devkit/streamAi.ts +0 -45
- package/devkit/transforms/barrelAnalyzer.ts +0 -249
- package/devkit/transforms/barrelImportsPlugin.ts +0 -457
- package/devkit/transforms/externalizeFrameworkPlugin.ts +0 -159
- package/devkit/transforms/index.ts +0 -5
- package/devkit/transforms/rscUseClientTransform.ts +0 -52
- package/devkit/transforms/useClientBundlePlugin.ts +0 -47
- package/devkit/typeChecker.ts +0 -260
- package/devkit/types.ts +0 -44
- package/devkit/ui/MultiScrollList.tsx +0 -228
- package/devkit/ui/ScrollList.tsx +0 -106
- package/devkit/ui/index.ts +0 -2
- package/devkit/uploadRelease.ts +0 -95
- package/devkit/useStdoutDimensions.ts +0 -20
- package/types/cli/application/application.command.d.ts +0 -7
- package/types/cli/application/application.interface.d.ts +0 -40
- package/types/cli/application/application.runner.d.ts +0 -66
- package/types/cli/application/application.script.d.ts +0 -72
- package/types/cli/build.d.ts +0 -1
- package/types/cli/cloud/cloud.command.d.ts +0 -7
- package/types/cli/cloud/cloud.runner.d.ts +0 -13
- package/types/cli/cloud/cloud.script.d.ts +0 -23
- package/types/cli/guideline/guideline.command.d.ts +0 -7
- package/types/cli/guideline/guideline.prompt.d.ts +0 -29
- package/types/cli/guideline/guideline.runner.d.ts +0 -21
- package/types/cli/guideline/guideline.script.d.ts +0 -16
- package/types/cli/index.d.ts +0 -2
- package/types/cli/library/library.command.d.ts +0 -7
- package/types/cli/library/library.runner.d.ts +0 -11
- package/types/cli/library/library.script.d.ts +0 -13
- package/types/cli/module/module.command.d.ts +0 -7
- package/types/cli/module/module.prompt.d.ts +0 -13
- package/types/cli/module/module.request.d.ts +0 -63
- package/types/cli/module/module.runner.d.ts +0 -55
- package/types/cli/module/module.script.d.ts +0 -22
- package/types/cli/npmRegistry.d.ts +0 -1
- package/types/cli/openBrowser.d.ts +0 -1
- package/types/cli/package/package.command.d.ts +0 -7
- package/types/cli/package/package.runner.d.ts +0 -13
- package/types/cli/package/package.script.d.ts +0 -18
- package/types/cli/page/page.command.d.ts +0 -7
- package/types/cli/page/page.runner.d.ts +0 -10
- package/types/cli/page/page.script.d.ts +0 -13
- package/types/cli/pluralizeName.d.ts +0 -1
- package/types/cli/scalar/scalar.command.d.ts +0 -7
- package/types/cli/scalar/scalar.prompt.d.ts +0 -23
- package/types/cli/scalar/scalar.runner.d.ts +0 -16
- package/types/cli/scalar/scalar.script.d.ts +0 -11
- package/types/cli/semver.d.ts +0 -1
- package/types/cli/templates/__scalar/__model__/__model__.constant.d.ts +0 -7
- package/types/cli/templates/__scalar/__model__/__model__.dictionary.d.ts +0 -7
- package/types/cli/templates/__scalar/__model__/__model__.document.d.ts +0 -7
- package/types/cli/templates/app/akan.config.d.ts +0 -6
- package/types/cli/templates/app/env/env.client.d.ts +0 -6
- package/types/cli/templates/app/env/env.client.type.d.ts +0 -6
- package/types/cli/templates/app/env/env.server.d.ts +0 -6
- package/types/cli/templates/app/lib/___appName__/__appName__.dictionary.d.ts +0 -7
- package/types/cli/templates/app/lib/___appName__/__appName__.service.d.ts +0 -7
- package/types/cli/templates/app/lib/___appName__/__appName__.signal.d.ts +0 -7
- package/types/cli/templates/app/lib/___appName__/__appName__.store.d.ts +0 -7
- package/types/cli/templates/app/lib/option.d.ts +0 -6
- package/types/cli/templates/app/main.d.ts +0 -6
- package/types/cli/templates/app/page/_index.d.ts +0 -9
- package/types/cli/templates/app/page/_layout.d.ts +0 -11
- package/types/cli/templates/client.d.ts +0 -4
- package/types/cli/templates/crudPages/[__model__Id]/edit/page.d.ts +0 -11
- package/types/cli/templates/crudPages/[__model__Id]/page.d.ts +0 -11
- package/types/cli/templates/crudPages/new/page.d.ts +0 -11
- package/types/cli/templates/crudPages/page.d.ts +0 -11
- package/types/cli/templates/crudSinglePage/page.d.ts +0 -11
- package/types/cli/templates/env/_env.server.type.d.ts +0 -7
- package/types/cli/templates/facetIndex/index.d.ts +0 -13
- package/types/cli/templates/facetIndex.d.ts +0 -1
- package/types/cli/templates/index.d.ts +0 -6
- package/types/cli/templates/lib/__lib/lib.constant.d.ts +0 -4
- package/types/cli/templates/lib/__lib/lib.dictionary.d.ts +0 -4
- package/types/cli/templates/lib/__lib/lib.document.d.ts +0 -4
- package/types/cli/templates/lib/__lib/lib.service.d.ts +0 -4
- package/types/cli/templates/lib/__lib/lib.signal.d.ts +0 -4
- package/types/cli/templates/lib/__lib/lib.store.d.ts +0 -4
- package/types/cli/templates/lib/cnst.d.ts +0 -4
- package/types/cli/templates/lib/db.d.ts +0 -4
- package/types/cli/templates/lib/dict.d.ts +0 -4
- package/types/cli/templates/lib/sig.d.ts +0 -4
- package/types/cli/templates/lib/srv.d.ts +0 -4
- package/types/cli/templates/lib/st.d.ts +0 -4
- package/types/cli/templates/lib/useClient.d.ts +0 -4
- package/types/cli/templates/lib/useServer.d.ts +0 -4
- package/types/cli/templates/libRoot/akan.config.d.ts +0 -5
- package/types/cli/templates/libRoot/base/baseLogic.d.ts +0 -5
- package/types/cli/templates/libRoot/base/index.d.ts +0 -5
- package/types/cli/templates/libRoot/base.d.ts +0 -1
- package/types/cli/templates/libRoot/common/commonLogic.d.ts +0 -5
- package/types/cli/templates/libRoot/common/index.d.ts +0 -5
- package/types/cli/templates/libRoot/common.d.ts +0 -1
- package/types/cli/templates/libRoot/lib/___libName__/__libName__.dictionary.d.ts +0 -6
- package/types/cli/templates/libRoot/lib/___libName__/__libName__.service.d.ts +0 -6
- package/types/cli/templates/libRoot/lib/___libName__/__libName__.store.d.ts +0 -6
- package/types/cli/templates/libRoot/lib/option.d.ts +0 -6
- package/types/cli/templates/libRoot/srvkit/backendLogic.d.ts +0 -5
- package/types/cli/templates/libRoot/srvkit/index.d.ts +0 -5
- package/types/cli/templates/libRoot/srvkit.d.ts +0 -1
- package/types/cli/templates/libRoot/ui/index.d.ts +0 -5
- package/types/cli/templates/libRoot/ui.d.ts +0 -1
- package/types/cli/templates/libRoot/webkit/frontendLogic.d.ts +0 -5
- package/types/cli/templates/libRoot/webkit/index.d.ts +0 -5
- package/types/cli/templates/libRoot/webkit.d.ts +0 -1
- package/types/cli/templates/module/__Model__.Template.d.ts +0 -11
- package/types/cli/templates/module/__Model__.Unit.d.ts +0 -11
- package/types/cli/templates/module/__Model__.Util.d.ts +0 -11
- package/types/cli/templates/module/__Model__.View.d.ts +0 -11
- package/types/cli/templates/module/__Model__.Zone.d.ts +0 -11
- package/types/cli/templates/module/__model__.constant.d.ts +0 -8
- package/types/cli/templates/module/__model__.dictionary.d.ts +0 -8
- package/types/cli/templates/module/__model__.document.d.ts +0 -8
- package/types/cli/templates/module/__model__.service.d.ts +0 -8
- package/types/cli/templates/module/__model__.signal.d.ts +0 -9
- package/types/cli/templates/module/__model__.store.d.ts +0 -8
- package/types/cli/templates/moduleRoot/index.d.ts +0 -11
- package/types/cli/templates/moduleRoot.d.ts +0 -1
- package/types/cli/templates/server.d.ts +0 -4
- package/types/cli/templates.d.ts +0 -1
- package/types/cli/testHelpers.d.ts +0 -64
- package/types/cli/workspace/workspace.command.d.ts +0 -7
- package/types/cli/workspace/workspace.runner.d.ts +0 -14
- package/types/cli/workspace/workspace.script.d.ts +0 -29
- package/types/cli.d.ts +0 -1
- package/types/devkit/aiEditor.d.ts +0 -50
- package/types/devkit/akanApp/akanApp.host.d.ts +0 -16
- package/types/devkit/akanApp/index.d.ts +0 -1
- package/types/devkit/akanApp.d.ts +0 -1
- package/types/devkit/akanConfig/akanConfig.d.ts +0 -36
- package/types/devkit/akanConfig/index.d.ts +0 -2
- package/types/devkit/akanConfig.d.ts +0 -1
- package/types/devkit/applicationBuildReporter.d.ts +0 -25
- package/types/devkit/applicationBuildRunner.d.ts +0 -29
- package/types/devkit/applicationReleasePackager.d.ts +0 -17
- package/types/devkit/artifact/implicitRootLayout.d.ts +0 -17
- package/types/devkit/artifact/index.d.ts +0 -1
- package/types/devkit/artifact/routeSeedIndex.d.ts +0 -38
- package/types/devkit/artifact.d.ts +0 -1
- package/types/devkit/auth.d.ts +0 -9
- package/types/devkit/builder.d.ts +0 -18
- package/types/devkit/capacitor.base.config.d.ts +0 -3
- package/types/devkit/capacitorApp.d.ts +0 -58
- package/types/devkit/commandDecorators/argMeta.d.ts +0 -68
- package/types/devkit/commandDecorators/command.d.ts +0 -2
- package/types/devkit/commandDecorators/commandBuilder.d.ts +0 -60
- package/types/devkit/commandDecorators/commandMeta.d.ts +0 -2
- package/types/devkit/commandDecorators/dependencyBuilder.d.ts +0 -22
- package/types/devkit/commandDecorators/helpFormatter.d.ts +0 -3
- package/types/devkit/commandDecorators/index.d.ts +0 -8
- package/types/devkit/commandDecorators/targetMeta.d.ts +0 -21
- package/types/devkit/commandDecorators/types.d.ts +0 -8
- package/types/devkit/commandDecorators.d.ts +0 -1
- package/types/devkit/constants.d.ts +0 -25
- package/types/devkit/createTunnel.d.ts +0 -8
- package/types/devkit/dependencyScanner.d.ts +0 -33
- package/types/devkit/executors.d.ts +0 -320
- package/types/devkit/extractDeps.d.ts +0 -7
- package/types/devkit/fileEditor.d.ts +0 -16
- package/types/devkit/fileSys.d.ts +0 -12
- package/types/devkit/frontendBuild/allRoutesBuilder.d.ts +0 -18
- package/types/devkit/frontendBuild/clientBuildTypes.d.ts +0 -107
- package/types/devkit/frontendBuild/clientEntriesBundler.d.ts +0 -12
- package/types/devkit/frontendBuild/clientEntryDiscovery.d.ts +0 -19
- package/types/devkit/frontendBuild/csrArtifactBuilder.d.ts +0 -16
- package/types/devkit/frontendBuild/cssCompiler.d.ts +0 -25
- package/types/devkit/frontendBuild/cssImportResolver.d.ts +0 -9
- package/types/devkit/frontendBuild/fontOptimizer.d.ts +0 -14
- package/types/devkit/frontendBuild/hmrChangeClassifier.d.ts +0 -5
- package/types/devkit/frontendBuild/hmrWatcher.d.ts +0 -21
- package/types/devkit/frontendBuild/index.d.ts +0 -18
- package/types/devkit/frontendBuild/pagesBundleBuilder.d.ts +0 -28
- package/types/devkit/frontendBuild/pagesEntrySourceGenerator.d.ts +0 -9
- package/types/devkit/frontendBuild/precompressArtifacts.d.ts +0 -7
- package/types/devkit/frontendBuild/routeClientBuilder.d.ts +0 -50
- package/types/devkit/frontendBuild/routesManifestArtifactSerializer.d.ts +0 -12
- package/types/devkit/frontendBuild/ssrBaseArtifactBuilder.d.ts +0 -16
- package/types/devkit/frontendBuild/vendorSpecifiers.d.ts +0 -2
- package/types/devkit/frontendBuild/watchRootResolver.d.ts +0 -6
- package/types/devkit/frontendBuild.d.ts +0 -1
- package/types/devkit/getCredentials.d.ts +0 -12
- package/types/devkit/getDirname.d.ts +0 -1
- package/types/devkit/getModelFileData.d.ts +0 -16
- package/types/devkit/getRelatedCnsts.d.ts +0 -53
- package/types/devkit/guideline.d.ts +0 -19
- package/types/devkit/incrementalBuilder/incrementalBuilder.host.d.ts +0 -30
- package/types/devkit/incrementalBuilder/incrementalBuilder.proc.d.ts +0 -1
- package/types/devkit/incrementalBuilder/index.d.ts +0 -1
- package/types/devkit/incrementalBuilder.d.ts +0 -1
- package/types/devkit/index.d.ts +0 -36
- package/types/devkit/linter.d.ts +0 -108
- package/types/devkit/mobile/index.d.ts +0 -1
- package/types/devkit/mobile/mobileTarget.d.ts +0 -14
- package/types/devkit/mobile.d.ts +0 -1
- package/types/devkit/prompter.d.ts +0 -15
- package/types/devkit/scanInfo.d.ts +0 -82
- package/types/devkit/selectModel.d.ts +0 -1
- package/types/devkit/spinner.d.ts +0 -20
- package/types/devkit/src/capacitorApp.d.ts +0 -39
- package/types/devkit/sshTunnel.d.ts +0 -14
- package/types/devkit/streamAi.d.ts +0 -6
- package/types/devkit/transforms/barrelAnalyzer.d.ts +0 -27
- package/types/devkit/transforms/barrelImportsPlugin.d.ts +0 -26
- package/types/devkit/transforms/externalizeFrameworkPlugin.d.ts +0 -49
- package/types/devkit/transforms/index.d.ts +0 -5
- package/types/devkit/transforms/rscUseClientTransform.d.ts +0 -10
- package/types/devkit/transforms/useClientBundlePlugin.d.ts +0 -19
- package/types/devkit/transforms.d.ts +0 -1
- package/types/devkit/typeChecker.d.ts +0 -62
- package/types/devkit/types.d.ts +0 -43
- package/types/devkit/ui/MultiScrollList.d.ts +0 -13
- package/types/devkit/ui/ScrollList.d.ts +0 -7
- package/types/devkit/ui/index.d.ts +0 -2
- package/types/devkit/ui.d.ts +0 -1
- package/types/devkit/uploadRelease.d.ts +0 -10
- package/types/devkit/useStdoutDimensions.d.ts +0 -1
- package/types/devkit.d.ts +0 -1
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { Logger } from "akanjs/common";
|
|
3
|
-
|
|
4
|
-
export interface BarrelExportTarget {
|
|
5
|
-
/** Subpath specifier to emit in rewritten import, e.g. `akanjs/ui/Empty`. */
|
|
6
|
-
subpath: string;
|
|
7
|
-
/** Name as it is exported by the leaf module. */
|
|
8
|
-
originalName: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export type BarrelExportMap = Map<string, BarrelExportTarget>;
|
|
12
|
-
|
|
13
|
-
export interface PackageEntry {
|
|
14
|
-
/** Package specifier (e.g. `akanjs/ui`). */
|
|
15
|
-
pkgName: string;
|
|
16
|
-
/** Absolute path of the barrel entry file. */
|
|
17
|
-
entryFile: string;
|
|
18
|
-
/** Absolute directory used as the base for subpath computation. Typically dirname(entryFile). */
|
|
19
|
-
pkgDir: string;
|
|
20
|
-
/** Preserve concrete file paths for package exports that do not support extensionless deep imports. */
|
|
21
|
-
preserveFilePath?: boolean;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface BarrelAnalyzerOptions {
|
|
25
|
-
resolvePackage: (pkgName: string) => Promise<PackageEntry | null>;
|
|
26
|
-
/** Resolve a relative specifier from `fromFile` to an absolute file path on disk. */
|
|
27
|
-
resolveRelative?: (fromFile: string, relSpec: string) => Promise<string | null>;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const REEXPORT_RE =
|
|
31
|
-
/(?:^|\n)\s*export\s+(?:type\s+)?(?:(\*)(?:\s+as\s+(\w+))?|\{\s*([^}]*?)\s*\})\s+from\s+(["'])([^"']+)\4;?/g;
|
|
32
|
-
|
|
33
|
-
const LOCAL_NAMED_RE = /(?:^|\n)\s*export\s+\{\s*([^}]*?)\s*\}(?!\s*from)/g;
|
|
34
|
-
|
|
35
|
-
const CANDIDATE_EXTS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
|
|
36
|
-
|
|
37
|
-
export class BarrelAnalyzer {
|
|
38
|
-
readonly #logger = new Logger("BarrelAnalyzer");
|
|
39
|
-
readonly #opts: BarrelAnalyzerOptions;
|
|
40
|
-
readonly #cache = new Map<string, Promise<BarrelExportMap | null>>();
|
|
41
|
-
readonly #tsTranspiler = new Bun.Transpiler({ loader: "ts" });
|
|
42
|
-
readonly #tsxTranspiler = new Bun.Transpiler({ loader: "tsx" });
|
|
43
|
-
|
|
44
|
-
constructor(opts: BarrelAnalyzerOptions) {
|
|
45
|
-
this.#opts = opts;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
analyze(pkgName: string): Promise<BarrelExportMap | null> {
|
|
49
|
-
const cached = this.#cache.get(pkgName);
|
|
50
|
-
if (cached) return cached;
|
|
51
|
-
const promise = this.#analyzeSafe(pkgName);
|
|
52
|
-
this.#cache.set(pkgName, promise);
|
|
53
|
-
return promise;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async #analyzeSafe(pkgName: string): Promise<BarrelExportMap | null> {
|
|
57
|
-
try {
|
|
58
|
-
return await this.#analyzeUncached(pkgName);
|
|
59
|
-
} catch (err) {
|
|
60
|
-
this.#logger.error(`analyze failed for ${pkgName}: ${(err as Error).message}`);
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
async #analyzeUncached(pkgName: string): Promise<BarrelExportMap | null> {
|
|
66
|
-
const pkg = await this.#opts.resolvePackage(pkgName);
|
|
67
|
-
if (!pkg) return null;
|
|
68
|
-
const map: BarrelExportMap = new Map();
|
|
69
|
-
const visited = new Set<string>();
|
|
70
|
-
await this.#walk(pkg.entryFile, pkg, map, visited);
|
|
71
|
-
return map;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async #walk(absFile: string, pkg: PackageEntry, map: BarrelExportMap, visited: Set<string>): Promise<void> {
|
|
75
|
-
if (visited.has(absFile)) return;
|
|
76
|
-
visited.add(absFile);
|
|
77
|
-
const source = await readIfExists(absFile);
|
|
78
|
-
if (source === null) return;
|
|
79
|
-
const currentSubpath = this.#subpathFor(pkg, absFile);
|
|
80
|
-
if (!currentSubpath) return;
|
|
81
|
-
|
|
82
|
-
const authoritative = this.#scanExports(source, absFile);
|
|
83
|
-
|
|
84
|
-
authoritative.delete("default");
|
|
85
|
-
|
|
86
|
-
const attributed = new Set<string>();
|
|
87
|
-
|
|
88
|
-
REEXPORT_RE.lastIndex = 0;
|
|
89
|
-
let m: RegExpExecArray | null = REEXPORT_RE.exec(source);
|
|
90
|
-
while (m !== null) {
|
|
91
|
-
const star = m[1];
|
|
92
|
-
const nsAs = m[2];
|
|
93
|
-
const namedList = m[3];
|
|
94
|
-
const spec = m[5] ?? "";
|
|
95
|
-
m = REEXPORT_RE.exec(source);
|
|
96
|
-
if (!isRelative(spec)) continue;
|
|
97
|
-
|
|
98
|
-
if (star) {
|
|
99
|
-
if (nsAs) {
|
|
100
|
-
|
|
101
|
-
authoritative.delete(nsAs);
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
const targetAbs = await this.#resolveRel(absFile, spec);
|
|
105
|
-
if (!targetAbs) continue;
|
|
106
|
-
|
|
107
|
-
await this.#walk(targetAbs, pkg, map, visited);
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (namedList !== undefined) {
|
|
112
|
-
const targetAbs = await this.#resolveRel(absFile, spec);
|
|
113
|
-
if (!targetAbs) continue;
|
|
114
|
-
const targetSubpath = this.#subpathFor(pkg, targetAbs);
|
|
115
|
-
if (!targetSubpath) continue;
|
|
116
|
-
for (const item of parseNamedList(namedList)) {
|
|
117
|
-
if (item.isType) continue;
|
|
118
|
-
if (item.imported === "default") continue;
|
|
119
|
-
|
|
120
|
-
if (!authoritative.has(item.local)) continue;
|
|
121
|
-
attributed.add(item.local);
|
|
122
|
-
if (!map.has(item.local)) {
|
|
123
|
-
map.set(item.local, { subpath: targetSubpath, originalName: item.imported });
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
LOCAL_NAMED_RE.lastIndex = 0;
|
|
130
|
-
let n: RegExpExecArray | null = LOCAL_NAMED_RE.exec(source);
|
|
131
|
-
while (n !== null) {
|
|
132
|
-
const body = n[1] ?? "";
|
|
133
|
-
n = LOCAL_NAMED_RE.exec(source);
|
|
134
|
-
for (const item of parseNamedList(body)) {
|
|
135
|
-
if (item.isType) continue;
|
|
136
|
-
if (item.imported === "default") continue;
|
|
137
|
-
|
|
138
|
-
if (!authoritative.has(item.local)) continue;
|
|
139
|
-
attributed.add(item.local);
|
|
140
|
-
if (!map.has(item.local)) {
|
|
141
|
-
map.set(item.local, { subpath: currentSubpath, originalName: item.imported });
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
for (const name of authoritative) {
|
|
147
|
-
if (attributed.has(name)) continue;
|
|
148
|
-
if (map.has(name)) continue;
|
|
149
|
-
map.set(name, { subpath: currentSubpath, originalName: name });
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
#scanExports(source: string, absFile: string): Set<string> {
|
|
154
|
-
try {
|
|
155
|
-
const transpiler = [".tsx", ".jsx"].includes(path.extname(absFile)) ? this.#tsxTranspiler : this.#tsTranspiler;
|
|
156
|
-
const { exports } = transpiler.scan(source);
|
|
157
|
-
return new Set(exports);
|
|
158
|
-
} catch (err) {
|
|
159
|
-
this.#logger.error(`scan failed: ${(err as Error).message}`);
|
|
160
|
-
return new Set();
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
#subpathFor(pkg: PackageEntry, absFile: string): string | null {
|
|
165
|
-
const rel = path.relative(pkg.pkgDir, absFile);
|
|
166
|
-
if (!rel || rel.startsWith("..") || path.isAbsolute(rel)) return null;
|
|
167
|
-
if (pkg.preserveFilePath) return `${pkg.pkgName}/${rel.split(path.sep).join("/")}`;
|
|
168
|
-
const noExt = stripKnownExt(rel);
|
|
169
|
-
|
|
170
|
-
const tail = collapseIndex(noExt);
|
|
171
|
-
if (tail === "") return pkg.pkgName;
|
|
172
|
-
return `${pkg.pkgName}/${tail.split(path.sep).join("/")}`;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
async #resolveRel(fromFile: string, relSpec: string): Promise<string | null> {
|
|
176
|
-
if (this.#opts.resolveRelative) return this.#opts.resolveRelative(fromFile, relSpec);
|
|
177
|
-
return defaultResolveRelative(fromFile, relSpec);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
interface NamedItem {
|
|
182
|
-
imported: string;
|
|
183
|
-
local: string;
|
|
184
|
-
isType: boolean;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
const parseNamedList = (listBody: string): NamedItem[] => {
|
|
188
|
-
const out: NamedItem[] = [];
|
|
189
|
-
for (const raw of listBody.split(",")) {
|
|
190
|
-
const s = raw.trim();
|
|
191
|
-
if (!s) continue;
|
|
192
|
-
let rest = s;
|
|
193
|
-
let isType = false;
|
|
194
|
-
if (rest.startsWith("type ")) {
|
|
195
|
-
isType = true;
|
|
196
|
-
rest = rest.slice(5).trim();
|
|
197
|
-
}
|
|
198
|
-
const asMatch = /^(\w+)\s+as\s+(\w+)$/.exec(rest);
|
|
199
|
-
if (asMatch) {
|
|
200
|
-
out.push({ imported: asMatch[1] ?? "", local: asMatch[2] ?? "", isType });
|
|
201
|
-
continue;
|
|
202
|
-
}
|
|
203
|
-
if (/^\w+$/.test(rest)) {
|
|
204
|
-
out.push({ imported: rest, local: rest, isType });
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return out;
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
const isRelative = (spec: string): boolean => {
|
|
211
|
-
return spec.startsWith("./") || spec.startsWith("../") || spec === "." || spec === "..";
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
const readIfExists = async (absFile: string): Promise<string | null> => {
|
|
215
|
-
const file = Bun.file(absFile);
|
|
216
|
-
if (!(await file.exists())) return null;
|
|
217
|
-
return file.text();
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
const defaultResolveRelative = async (fromFile: string, relSpec: string): Promise<string | null> => {
|
|
221
|
-
const baseDir = path.dirname(fromFile);
|
|
222
|
-
const joined = path.resolve(baseDir, relSpec);
|
|
223
|
-
if (path.extname(joined)) {
|
|
224
|
-
if (await Bun.file(joined).exists()) return joined;
|
|
225
|
-
return null;
|
|
226
|
-
}
|
|
227
|
-
for (const ext of CANDIDATE_EXTS) {
|
|
228
|
-
const cand = joined + ext;
|
|
229
|
-
if (await Bun.file(cand).exists()) return cand;
|
|
230
|
-
}
|
|
231
|
-
for (const ext of CANDIDATE_EXTS) {
|
|
232
|
-
const cand = path.join(joined, `index${ext}`);
|
|
233
|
-
if (await Bun.file(cand).exists()) return cand;
|
|
234
|
-
}
|
|
235
|
-
return null;
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
const stripKnownExt = (relPath: string): string => {
|
|
239
|
-
for (const ext of CANDIDATE_EXTS) {
|
|
240
|
-
if (relPath.endsWith(ext)) return relPath.slice(0, -ext.length);
|
|
241
|
-
}
|
|
242
|
-
return relPath;
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
const collapseIndex = (relPathNoExt: string): string => {
|
|
246
|
-
const parts = relPathNoExt.split(path.sep);
|
|
247
|
-
if (parts[parts.length - 1] === "index") parts.pop();
|
|
248
|
-
return parts.join(path.sep);
|
|
249
|
-
};
|
|
@@ -1,457 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import type { BunPlugin } from "bun";
|
|
3
|
-
import ts from "typescript";
|
|
4
|
-
import type { App } from "../commandDecorators";
|
|
5
|
-
import { BarrelAnalyzer, type BarrelExportMap, type PackageEntry } from "./barrelAnalyzer";
|
|
6
|
-
|
|
7
|
-
export interface BarrelImportsPluginOptions {
|
|
8
|
-
/** Absolute paths whose content should be returned unchanged (e.g. node_modules). */
|
|
9
|
-
skipPath?: (absPath: string) => boolean;
|
|
10
|
-
/**
|
|
11
|
-
* Optional transform applied after the barrel rewrite in the same onLoad
|
|
12
|
-
* pass. Useful to chain further transforms (e.g. `"use client"` stubbing)
|
|
13
|
-
* that would otherwise be blocked — Bun's `onLoad` cannot fall through to a
|
|
14
|
-
* second plugin once a response is returned.
|
|
15
|
-
* Return the transformed source, or `null` to indicate no change.
|
|
16
|
-
*/
|
|
17
|
-
pipeAfter?: (source: string, args: { path: string }) => string | Promise<string | null> | null;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export const createBarrelImportsPlugin = async (
|
|
21
|
-
app: App,
|
|
22
|
-
{ skipPath = defaultSkipPath, pipeAfter }: BarrelImportsPluginOptions = {},
|
|
23
|
-
): Promise<BunPlugin> => {
|
|
24
|
-
const akanConfig = await app.getConfig();
|
|
25
|
-
const barrels = [...new Set(akanConfig.barrelImports)].filter(Boolean);
|
|
26
|
-
const analyzer = new BarrelAnalyzer({
|
|
27
|
-
resolvePackage: await createTsconfigPackageResolver(app),
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
name: "barrel-imports",
|
|
32
|
-
setup(build) {
|
|
33
|
-
|
|
34
|
-
build.onLoad(
|
|
35
|
-
{
|
|
36
|
-
filter:
|
|
37
|
-
/^(?:(?!.*[\\/]node_modules[\\/]).*|.*[\\/]node_modules[\\/]akanjs[\\/].*)\.(tsx|ts|jsx|js)(\?v=\d+)?$/,
|
|
38
|
-
},
|
|
39
|
-
async (args) => {
|
|
40
|
-
const realPath = args.path.replace(/\?v=\d+$/, "");
|
|
41
|
-
const loader = loaderFor(realPath);
|
|
42
|
-
if (skipPath(realPath)) {
|
|
43
|
-
const raw = await Bun.file(realPath).text();
|
|
44
|
-
return { contents: raw, loader };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
let source = await Bun.file(realPath).text();
|
|
48
|
-
|
|
49
|
-
const hasMacroAttr = MACRO_ATTR_RE.test(source);
|
|
50
|
-
|
|
51
|
-
if (!hasMacroAttr && barrels.length > 0) {
|
|
52
|
-
|
|
53
|
-
let maybe = false;
|
|
54
|
-
for (const b of barrels) {
|
|
55
|
-
if (source.includes(b)) {
|
|
56
|
-
maybe = true;
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
if (maybe) {
|
|
61
|
-
const rewritten = await rewriteBarrelImports(source, barrels, analyzer);
|
|
62
|
-
if (rewritten !== null) source = rewritten;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (pipeAfter) {
|
|
67
|
-
const piped = await pipeAfter(source, { path: realPath });
|
|
68
|
-
if (piped !== null) source = piped;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return { contents: source, loader };
|
|
72
|
-
},
|
|
73
|
-
);
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Build a `resolvePackage` that maps a package specifier (like `akanjs/ui`)
|
|
80
|
-
* to its barrel entry file using the workspace tsconfig `paths`. If no direct
|
|
81
|
-
* mapping exists, falls back to node_modules resolution.
|
|
82
|
-
*/
|
|
83
|
-
export const createTsconfigPackageResolver = async (
|
|
84
|
-
app: App,
|
|
85
|
-
): Promise<(pkgName: string) => Promise<PackageEntry | null>> => {
|
|
86
|
-
const tsconfig = await app.getTsConfig();
|
|
87
|
-
const tsconfigPaths = tsconfig.compilerOptions.paths ?? {};
|
|
88
|
-
|
|
89
|
-
const wildcardEntries = Object.entries(tsconfigPaths)
|
|
90
|
-
.filter(([k]) => k.endsWith("/*"))
|
|
91
|
-
.map(([k, v]) => ({
|
|
92
|
-
prefix: k.slice(0, -1), // keep trailing `/`
|
|
93
|
-
replacements: v,
|
|
94
|
-
}))
|
|
95
|
-
.sort((a, b) => b.prefix.length - a.prefix.length);
|
|
96
|
-
|
|
97
|
-
return async (pkgName) => {
|
|
98
|
-
const exact = tsconfigPaths[pkgName];
|
|
99
|
-
if (exact && exact.length > 0) {
|
|
100
|
-
const raw = exact[0];
|
|
101
|
-
if (!raw) return null;
|
|
102
|
-
const entryFile = path.resolve(app.workspace.workspaceRoot, raw);
|
|
103
|
-
if (!(await Bun.file(entryFile).exists())) return null;
|
|
104
|
-
|
|
105
|
-
const parsed = path.parse(entryFile);
|
|
106
|
-
const lastSlash = pkgName.lastIndexOf("/");
|
|
107
|
-
if (parsed.name !== "index" && lastSlash !== -1) {
|
|
108
|
-
const facet = pkgName.slice(lastSlash + 1);
|
|
109
|
-
const parentSpec = pkgName.slice(0, lastSlash);
|
|
110
|
-
if (facet === parsed.name && parentSpec.length > 0) {
|
|
111
|
-
return { pkgName: parentSpec, entryFile, pkgDir: parsed.dir };
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return { pkgName, entryFile, pkgDir: path.dirname(entryFile) };
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
for (const { prefix, replacements } of wildcardEntries) {
|
|
118
|
-
if (!pkgName.startsWith(prefix)) continue;
|
|
119
|
-
const suffix = pkgName.slice(prefix.length);
|
|
120
|
-
for (const repl of replacements) {
|
|
121
|
-
if (!repl) continue;
|
|
122
|
-
const replPath = repl.endsWith("/*") ? repl.slice(0, -1) : repl;
|
|
123
|
-
const candidate = path.resolve(app.workspace.workspaceRoot, replPath + suffix);
|
|
124
|
-
|
|
125
|
-
for (const ext of CANDIDATE_EXTS) {
|
|
126
|
-
const file = `${candidate}${ext}`;
|
|
127
|
-
if (await Bun.file(file).exists()) {
|
|
128
|
-
const lastSlash = pkgName.lastIndexOf("/");
|
|
129
|
-
if (lastSlash !== -1) {
|
|
130
|
-
const parentSpec = pkgName.slice(0, lastSlash);
|
|
131
|
-
if (parentSpec.length > 0) {
|
|
132
|
-
return { pkgName: parentSpec, entryFile: file, pkgDir: path.dirname(file) };
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return { pkgName, entryFile: file, pkgDir: path.dirname(file) };
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
for (const ext of CANDIDATE_EXTS) {
|
|
139
|
-
const file = path.join(candidate, `index${ext}`);
|
|
140
|
-
if (await Bun.file(file).exists()) {
|
|
141
|
-
return { pkgName, entryFile: file, pkgDir: candidate };
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return null;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const exported = await resolveNodePackageExport(app.workspace.workspaceRoot, pkgName);
|
|
150
|
-
if (exported) return exported;
|
|
151
|
-
|
|
152
|
-
const pkgJsonPath = path.join(app.workspace.workspaceRoot, "node_modules", pkgName, "package.json");
|
|
153
|
-
if (!(await Bun.file(pkgJsonPath).exists())) return null;
|
|
154
|
-
try {
|
|
155
|
-
const pkgJson = JSON.parse(await Bun.file(pkgJsonPath).text()) as {
|
|
156
|
-
main?: string;
|
|
157
|
-
module?: string;
|
|
158
|
-
};
|
|
159
|
-
const rel = pkgJson.module ?? pkgJson.main ?? "index.js";
|
|
160
|
-
const entryFile = path.resolve(path.dirname(pkgJsonPath), rel);
|
|
161
|
-
if (!(await Bun.file(entryFile).exists())) return null;
|
|
162
|
-
return { pkgName, entryFile, pkgDir: path.dirname(pkgJsonPath) };
|
|
163
|
-
} catch {
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
const CANDIDATE_EXTS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
|
|
170
|
-
|
|
171
|
-
const NODE_MODULES_RE = /[\\/]node_modules[\\/]/;
|
|
172
|
-
const AKANJS_NODE_MODULE_RE = /[\\/]node_modules[\\/]akanjs[\\/]/;
|
|
173
|
-
const defaultSkipPath = (absPath: string) => NODE_MODULES_RE.test(absPath) && !AKANJS_NODE_MODULE_RE.test(absPath);
|
|
174
|
-
|
|
175
|
-
type ExportValue = string | string[] | { [condition: string]: ExportValue | undefined };
|
|
176
|
-
|
|
177
|
-
const resolveNodePackageExport = async (workspaceRoot: string, specifier: string): Promise<PackageEntry | null> => {
|
|
178
|
-
const packageName = getPackageName(specifier);
|
|
179
|
-
if (!packageName) return null;
|
|
180
|
-
const pkgJsonPath = path.join(workspaceRoot, "node_modules", packageName, "package.json");
|
|
181
|
-
if (!(await Bun.file(pkgJsonPath).exists())) return null;
|
|
182
|
-
|
|
183
|
-
try {
|
|
184
|
-
const pkgDir = path.dirname(pkgJsonPath);
|
|
185
|
-
const pkgJson = JSON.parse(await Bun.file(pkgJsonPath).text()) as {
|
|
186
|
-
exports?: Record<string, ExportValue>;
|
|
187
|
-
module?: string;
|
|
188
|
-
main?: string;
|
|
189
|
-
};
|
|
190
|
-
const subpath = specifier === packageName ? "." : `.${specifier.slice(packageName.length)}`;
|
|
191
|
-
const exported = resolvePackageExport(pkgJson.exports, subpath);
|
|
192
|
-
const rel = exported ?? (subpath === "." ? (pkgJson.module ?? pkgJson.main ?? "index.js") : null);
|
|
193
|
-
if (!rel || !rel.startsWith(".")) return null;
|
|
194
|
-
const entryFile = await resolveFileCandidate(path.resolve(pkgDir, rel));
|
|
195
|
-
if (!entryFile) return null;
|
|
196
|
-
const pkgEntryName = specifier;
|
|
197
|
-
return { pkgName: pkgEntryName, entryFile, pkgDir: path.dirname(entryFile), preserveFilePath: true };
|
|
198
|
-
} catch {
|
|
199
|
-
return null;
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
const resolveExportValue = (value: ExportValue | undefined): string | null => {
|
|
204
|
-
if (!value) return null;
|
|
205
|
-
if (typeof value === "string") return value;
|
|
206
|
-
if (Array.isArray(value)) {
|
|
207
|
-
for (const item of value) {
|
|
208
|
-
const resolved = resolveExportValue(item);
|
|
209
|
-
if (resolved) return resolved;
|
|
210
|
-
}
|
|
211
|
-
return null;
|
|
212
|
-
}
|
|
213
|
-
for (const condition of ["source", "import", "default", "types"]) {
|
|
214
|
-
const resolved = resolveExportValue(value[condition]);
|
|
215
|
-
if (resolved) return resolved;
|
|
216
|
-
}
|
|
217
|
-
return null;
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
const resolvePackageExport = (exportsMap: Record<string, ExportValue> | undefined, subpath: string): string | null => {
|
|
221
|
-
if (!exportsMap) return null;
|
|
222
|
-
const exact = resolveExportValue(exportsMap[subpath]);
|
|
223
|
-
if (exact) return exact;
|
|
224
|
-
|
|
225
|
-
for (const [key, value] of Object.entries(exportsMap)) {
|
|
226
|
-
const starIdx = key.indexOf("*");
|
|
227
|
-
if (starIdx === -1) continue;
|
|
228
|
-
const prefix = key.slice(0, starIdx);
|
|
229
|
-
const suffix = key.slice(starIdx + 1);
|
|
230
|
-
if (!subpath.startsWith(prefix) || !subpath.endsWith(suffix)) continue;
|
|
231
|
-
const wildcard = subpath.slice(prefix.length, subpath.length - suffix.length);
|
|
232
|
-
const resolved = resolveExportValue(value);
|
|
233
|
-
if (resolved) return resolved.replace("*", wildcard);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return null;
|
|
237
|
-
};
|
|
238
|
-
|
|
239
|
-
const getPackageName = (specifier: string): string | null => {
|
|
240
|
-
const parts = specifier.split("/");
|
|
241
|
-
if (!parts[0]) return null;
|
|
242
|
-
if (specifier.startsWith("@")) return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : null;
|
|
243
|
-
return parts[0];
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
const resolveFileCandidate = async (candidate: string): Promise<string | null> => {
|
|
247
|
-
if (await Bun.file(candidate).exists()) return candidate;
|
|
248
|
-
if (path.extname(candidate)) return null;
|
|
249
|
-
for (const ext of CANDIDATE_EXTS) {
|
|
250
|
-
const file = `${candidate}${ext}`;
|
|
251
|
-
if (await Bun.file(file).exists()) return file;
|
|
252
|
-
}
|
|
253
|
-
for (const ext of CANDIDATE_EXTS) {
|
|
254
|
-
const file = path.join(candidate, `index${ext}`);
|
|
255
|
-
if (await Bun.file(file).exists()) return file;
|
|
256
|
-
}
|
|
257
|
-
return null;
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
const MACRO_ATTR_RE = /with\s*\{\s*type\s*:\s*["']macro["']\s*\}/;
|
|
261
|
-
|
|
262
|
-
/** Exposed for testing. */
|
|
263
|
-
export const rewriteBarrelImports = async (
|
|
264
|
-
source: string,
|
|
265
|
-
barrels: string[],
|
|
266
|
-
analyzer: BarrelAnalyzer,
|
|
267
|
-
): Promise<string | null> => {
|
|
268
|
-
const statements = findImportStatements(source);
|
|
269
|
-
if (statements.length === 0) return null;
|
|
270
|
-
|
|
271
|
-
let changed = false;
|
|
272
|
-
let out = source;
|
|
273
|
-
for (let i = statements.length - 1; i >= 0; i--) {
|
|
274
|
-
const stmt = statements[i];
|
|
275
|
-
if (!stmt) continue;
|
|
276
|
-
if (!barrels.includes(stmt.specifier)) continue;
|
|
277
|
-
const map = await analyzer.analyze(stmt.specifier);
|
|
278
|
-
if (!map || map.size === 0) continue;
|
|
279
|
-
const replacement = rewriteSingleStatement(stmt, map);
|
|
280
|
-
if (replacement === null) continue;
|
|
281
|
-
out = out.slice(0, stmt.start) + replacement + out.slice(stmt.end);
|
|
282
|
-
changed = true;
|
|
283
|
-
}
|
|
284
|
-
return changed ? out : null;
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
interface ImportStatement {
|
|
288
|
-
start: number;
|
|
289
|
-
end: number;
|
|
290
|
-
clause: string;
|
|
291
|
-
specifier: string;
|
|
292
|
-
trailingSemicolon: boolean;
|
|
293
|
-
raw: string;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
const findImportStatements = (source: string): ImportStatement[] => {
|
|
297
|
-
const statements: ImportStatement[] = [];
|
|
298
|
-
const sourceFile = ts.createSourceFile("barrel-imports.tsx", source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
299
|
-
for (const statement of sourceFile.statements) {
|
|
300
|
-
if (!ts.isImportDeclaration(statement)) continue;
|
|
301
|
-
if (!ts.isStringLiteral(statement.moduleSpecifier)) continue;
|
|
302
|
-
const importClause = statement.importClause;
|
|
303
|
-
if (!importClause) continue;
|
|
304
|
-
const statementStart = statement.getStart(sourceFile);
|
|
305
|
-
const statementEnd = statement.end;
|
|
306
|
-
statements.push({
|
|
307
|
-
start: statementStart,
|
|
308
|
-
end: statementEnd,
|
|
309
|
-
clause: source.slice(importClause.getStart(sourceFile), importClause.end).trim(),
|
|
310
|
-
specifier: statement.moduleSpecifier.text,
|
|
311
|
-
trailingSemicolon: source.slice(statement.moduleSpecifier.end, statement.end).includes(";"),
|
|
312
|
-
raw: source.slice(statementStart, statementEnd),
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
return statements;
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
interface NamedImportItem {
|
|
319
|
-
imported: string;
|
|
320
|
-
local: string;
|
|
321
|
-
isType: boolean;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
interface ParsedClause {
|
|
325
|
-
defaultImport?: string;
|
|
326
|
-
namespaceImport?: string;
|
|
327
|
-
named?: NamedImportItem[];
|
|
328
|
-
/** Whole clause is `import type { ... } from "..."`. */
|
|
329
|
-
typeOnly: boolean;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
const parseImportClause = (clause: string): ParsedClause | null => {
|
|
333
|
-
let rest = clause.trim();
|
|
334
|
-
let typeOnly = false;
|
|
335
|
-
if (rest.startsWith("type ")) {
|
|
336
|
-
typeOnly = true;
|
|
337
|
-
rest = rest.slice(5).trim();
|
|
338
|
-
}
|
|
339
|
-
const parsed: ParsedClause = { typeOnly };
|
|
340
|
-
|
|
341
|
-
const commaMatch = /^(\w+)\s*,\s*(.+)$/.exec(rest);
|
|
342
|
-
if (commaMatch) {
|
|
343
|
-
parsed.defaultImport = commaMatch[1];
|
|
344
|
-
rest = commaMatch[2] ?? "";
|
|
345
|
-
} else if (/^\w+$/.test(rest)) {
|
|
346
|
-
parsed.defaultImport = rest;
|
|
347
|
-
return parsed;
|
|
348
|
-
}
|
|
349
|
-
if (rest.startsWith("*")) {
|
|
350
|
-
const ns = /^\*\s+as\s+(\w+)$/.exec(rest);
|
|
351
|
-
if (!ns) return null;
|
|
352
|
-
parsed.namespaceImport = ns[1];
|
|
353
|
-
return parsed;
|
|
354
|
-
}
|
|
355
|
-
if (rest.startsWith("{")) {
|
|
356
|
-
const close = rest.indexOf("}");
|
|
357
|
-
if (close === -1) return null;
|
|
358
|
-
const inner = rest.slice(1, close);
|
|
359
|
-
parsed.named = parseNamedImportList(inner);
|
|
360
|
-
return parsed;
|
|
361
|
-
}
|
|
362
|
-
return parsed;
|
|
363
|
-
};
|
|
364
|
-
|
|
365
|
-
const parseNamedImportList = (body: string): NamedImportItem[] => {
|
|
366
|
-
const out: NamedImportItem[] = [];
|
|
367
|
-
for (const raw of body.split(",")) {
|
|
368
|
-
const s = raw.trim();
|
|
369
|
-
if (!s) continue;
|
|
370
|
-
let isType = false;
|
|
371
|
-
let rest = s;
|
|
372
|
-
if (rest.startsWith("type ")) {
|
|
373
|
-
isType = true;
|
|
374
|
-
rest = rest.slice(5).trim();
|
|
375
|
-
}
|
|
376
|
-
const asMatch = /^(\w+)\s+as\s+(\w+)$/.exec(rest);
|
|
377
|
-
if (asMatch) {
|
|
378
|
-
out.push({ imported: asMatch[1] ?? "", local: asMatch[2] ?? "", isType });
|
|
379
|
-
continue;
|
|
380
|
-
}
|
|
381
|
-
if (/^\w+$/.test(rest)) {
|
|
382
|
-
out.push({ imported: rest, local: rest, isType });
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
return out;
|
|
386
|
-
};
|
|
387
|
-
|
|
388
|
-
const rewriteSingleStatement = (stmt: ImportStatement, map: BarrelExportMap): string | null => {
|
|
389
|
-
const clause = parseImportClause(stmt.clause);
|
|
390
|
-
if (!clause) return null;
|
|
391
|
-
|
|
392
|
-
if (clause.namespaceImport) return null;
|
|
393
|
-
|
|
394
|
-
if (clause.typeOnly && !clause.defaultImport) return null;
|
|
395
|
-
if (!clause.named || clause.named.length === 0) {
|
|
396
|
-
|
|
397
|
-
return null;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
const remaining: NamedImportItem[] = [];
|
|
401
|
-
const rewrites = new Map<string, NamedImportItem[]>();
|
|
402
|
-
for (const item of clause.named) {
|
|
403
|
-
if (item.isType) {
|
|
404
|
-
remaining.push(item);
|
|
405
|
-
continue;
|
|
406
|
-
}
|
|
407
|
-
const target = map.get(item.imported);
|
|
408
|
-
if (!target) {
|
|
409
|
-
remaining.push(item);
|
|
410
|
-
continue;
|
|
411
|
-
}
|
|
412
|
-
const list = rewrites.get(target.subpath) ?? [];
|
|
413
|
-
|
|
414
|
-
list.push({ imported: target.originalName, local: item.local, isType: false });
|
|
415
|
-
rewrites.set(target.subpath, list);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
if (rewrites.size === 0) return null;
|
|
419
|
-
|
|
420
|
-
const lines: string[] = [];
|
|
421
|
-
|
|
422
|
-
const tail = ";";
|
|
423
|
-
|
|
424
|
-
if (shouldPreserveBarrelSideEffects(stmt.specifier)) {
|
|
425
|
-
lines.push(`import "${stmt.specifier}"${tail}`);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
if (clause.defaultImport || remaining.length > 0) {
|
|
429
|
-
const parts: string[] = [];
|
|
430
|
-
if (clause.defaultImport) parts.push(clause.defaultImport);
|
|
431
|
-
if (remaining.length > 0) {
|
|
432
|
-
parts.push(`{ ${remaining.map(serializeNamedItem).join(", ")} }`);
|
|
433
|
-
}
|
|
434
|
-
lines.push(`import ${parts.join(", ")} from "${stmt.specifier}"${tail}`);
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
for (const [subpath, items] of rewrites) {
|
|
438
|
-
lines.push(`import { ${items.map(serializeNamedItem).join(", ")} } from "${subpath}"${tail}`);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
return lines.join("\n");
|
|
442
|
-
};
|
|
443
|
-
|
|
444
|
-
const shouldPreserveBarrelSideEffects = (specifier: string): boolean => /^@(apps|libs)\/[^/]+\/client$/.test(specifier);
|
|
445
|
-
|
|
446
|
-
const serializeNamedItem = (item: NamedImportItem): string => {
|
|
447
|
-
const prefix = item.isType ? "type " : "";
|
|
448
|
-
if (item.imported === item.local) return `${prefix}${item.imported}`;
|
|
449
|
-
return `${prefix}${item.imported} as ${item.local}`;
|
|
450
|
-
};
|
|
451
|
-
|
|
452
|
-
const loaderFor = (absPath: string): "ts" | "tsx" | "js" | "jsx" => {
|
|
453
|
-
if (absPath.endsWith(".tsx")) return "tsx";
|
|
454
|
-
if (absPath.endsWith(".jsx")) return "jsx";
|
|
455
|
-
if (absPath.endsWith(".ts")) return "ts";
|
|
456
|
-
return "js";
|
|
457
|
-
};
|