libmodulor 0.4.0 → 0.6.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/.github/dependabot.yml +19 -0
- package/CHANGELOG.md +35 -1
- package/README.md +10 -4
- package/dist/esm/app/workers/AppSrcFilePathBuilder.d.ts +16 -0
- package/dist/esm/app/workers/AppSrcFilePathBuilder.js +6 -4
- package/dist/esm/apps/Helper/index.js +1 -0
- package/dist/esm/apps/Helper/src/i18n.js +4 -0
- package/dist/esm/apps/Helper/src/lib/project.d.ts +2 -0
- package/dist/esm/apps/Helper/src/lib/project.js +120 -0
- package/dist/esm/apps/Helper/src/manifest.d.ts +5 -0
- package/dist/esm/apps/Helper/src/manifest.js +5 -0
- package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.d.ts +15 -0
- package/dist/esm/apps/Helper/src/ucds/CreateProjectUCD.js +118 -0
- package/dist/esm/apps/Helper/src/ucds/GenerateAppsTestsUCD.js +3 -2
- package/dist/esm/bundlers/vite/StripUCDLifecycleServerPlugin.js +3 -0
- package/dist/esm/convention.d.ts +1 -0
- package/dist/esm/convention.js +17 -4
- package/dist/esm/dt/Validation.d.ts +8 -0
- package/dist/esm/dt/Validation.js +8 -0
- package/dist/esm/dt/base/TBase.d.ts +2 -1
- package/dist/esm/dt/base/TBoolean.js +2 -0
- package/dist/esm/dt/base/TInt.js +3 -0
- package/dist/esm/dt/base/TNumber.js +2 -0
- package/dist/esm/dt/base/TObject.d.ts +15 -0
- package/dist/esm/dt/base/TObject.js +14 -0
- package/dist/esm/dt/base/TString.js +1 -1
- package/dist/esm/dt/final/TAmount.js +1 -0
- package/dist/esm/dt/final/TCountryISO3166Alpha2.js +1 -0
- package/dist/esm/dt/final/TCurrencyISO4217.js +1 -0
- package/dist/esm/dt/final/TDateTimeFormat.js +1 -0
- package/dist/esm/dt/final/TEmail.js +2 -0
- package/dist/esm/dt/final/TEmoji.js +4 -0
- package/dist/esm/dt/final/TFile.js +3 -0
- package/dist/esm/dt/final/THostAddress.js +2 -0
- package/dist/esm/dt/final/TIPv6.js +1 -0
- package/dist/esm/dt/final/TJWT.js +8 -0
- package/dist/esm/dt/final/TPercentage.js +5 -0
- package/dist/esm/dt/final/TSQLQuery.js +1 -0
- package/dist/esm/dt/final/TSSHPrivateKey.js +3 -1
- package/dist/esm/dt/final/TSemVerVersion.js +1 -0
- package/dist/esm/dt/final/TShellCommand.js +1 -0
- package/dist/esm/dt/final/TURL.js +2 -0
- package/dist/esm/dt/final/TUUID.js +1 -0
- package/dist/esm/dt/final/TYesNo.js +1 -1
- package/dist/esm/dt/index.d.ts +1 -1
- package/dist/esm/i18n/WordingManager.d.ts +16 -0
- package/dist/esm/i18n/types.d.ts +5 -0
- package/dist/esm/icon/Icon.d.ts +7 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.node.d.ts +1 -0
- package/dist/esm/index.node.js +1 -0
- package/dist/esm/index.react.d.ts +1 -1
- package/dist/esm/product/manifest.d.ts +15 -0
- package/dist/esm/products/Helper/container.js +4 -0
- package/dist/esm/products/Helper/index.js +5 -0
- package/dist/esm/products/Helper/manifest.d.ts +6 -1
- package/dist/esm/std/BufferManager.d.ts +18 -0
- package/dist/esm/std/ClockManager.d.ts +5 -0
- package/dist/esm/std/EnvironmentManager.d.ts +10 -0
- package/dist/esm/std/HTTPAPICaller.d.ts +6 -0
- package/dist/esm/std/I18nManager.d.ts +26 -0
- package/dist/esm/std/JWTManager.d.ts +26 -0
- package/dist/esm/std/JobManager.d.ts +6 -0
- package/dist/esm/std/LLMManager.d.ts +25 -0
- package/dist/esm/std/LLMManager.js +1 -0
- package/dist/esm/std/PromptManager.d.ts +8 -0
- package/dist/esm/std/SettingsManager.d.ts +19 -0
- package/dist/esm/std/SettingsManager.js +9 -0
- package/dist/esm/std/ShellCommandExecutor.d.ts +19 -0
- package/dist/esm/std/ShellCommandExecutor.js +1 -0
- package/dist/esm/std/impl/ConsoleLogger.js +7 -1
- package/dist/esm/std/impl/FakeEmailManager.js +1 -0
- package/dist/esm/std/impl/FakeJobManager.js +1 -0
- package/dist/esm/std/impl/FetchHTTPAPICallExecutor.d.ts +9 -0
- package/dist/esm/std/impl/FetchHTTPAPICallExecutor.js +11 -0
- package/dist/esm/std/impl/MistralAILLMManager.d.ts +17 -0
- package/dist/esm/std/impl/MistralAILLMManager.js +56 -0
- package/dist/esm/std/impl/NodeCryptoManager.js +6 -1
- package/dist/esm/std/impl/NodeDeterministicCryptoManager.d.ts +14 -0
- package/dist/esm/std/impl/NodeDeterministicCryptoManager.js +17 -3
- package/dist/esm/std/impl/NodeFSManager.js +10 -0
- package/dist/esm/std/impl/NodeHTTPAPICallExecutorAgentBuilder.js +2 -0
- package/dist/esm/std/impl/NodePromptManager.js +3 -0
- package/dist/esm/std/impl/NodeSpawnShellCommandExecutor.d.ts +4 -0
- package/dist/esm/std/impl/NodeSpawnShellCommandExecutor.js +41 -0
- package/dist/esm/std/impl/OllamaLLMManager.d.ts +20 -0
- package/dist/esm/std/impl/OllamaLLMManager.js +56 -0
- package/dist/esm/std/impl/OpenAILLMManager.d.ts +17 -0
- package/dist/esm/std/impl/OpenAILLMManager.js +51 -0
- package/dist/esm/std/impl/SimpleHTTPAPICaller.js +14 -0
- package/dist/esm/std/impl/SimpleMapI18nManager.js +4 -2
- package/dist/esm/std/impl/StdDateClockManager.js +3 -0
- package/dist/esm/std/impl/UCDataStoreExternalResourceManager.js +3 -0
- package/dist/esm/std/impl/WebCryptoManager.js +9 -0
- package/dist/esm/std/index.d.ts +2 -0
- package/dist/esm/std/index.js +2 -0
- package/dist/esm/target/lib/cli/renderer.js +3 -0
- package/dist/esm/target/lib/client/consts.d.ts +3 -0
- package/dist/esm/target/lib/client/consts.js +3 -0
- package/dist/esm/target/lib/mcp-server/MCPServerBooter.js +1 -0
- package/dist/esm/target/lib/react/UCContainer.js +1 -0
- package/dist/esm/target/lib/react/UCPanel.js +4 -0
- package/dist/esm/target/lib/react/form.d.ts +26 -2
- package/dist/esm/target/lib/react/form.js +18 -1
- package/dist/esm/target/lib/react/useUC.d.ts +8 -0
- package/dist/esm/target/lib/react/useUC.js +22 -0
- package/dist/esm/target/lib/react/useUCOR.d.ts +15 -0
- package/dist/esm/target/lib/react/useUCOR.js +45 -0
- package/dist/esm/target/lib/rn/input.d.ts +7 -0
- package/dist/esm/target/lib/rn/input.js +2 -0
- package/dist/esm/target/lib/server/AuthenticationChecker.js +2 -1
- package/dist/esm/target/lib/server/BasicAuthenticationChecker.js +1 -0
- package/dist/esm/target/lib/server/CSPDirectivesBuilder.js +13 -0
- package/dist/esm/target/lib/server/CustomerFacingErrorBuilder.js +3 -0
- package/dist/esm/target/lib/server/PrivateApiKeyAuthenticationChecker.js +1 -0
- package/dist/esm/target/lib/server/PublicApiKeyChecker.js +1 -1
- package/dist/esm/target/lib/server/RequestChecker.js +5 -4
- package/dist/esm/target/lib/server/RequestHandler.d.ts +5 -0
- package/dist/esm/target/lib/server/RequestLogger.js +5 -0
- package/dist/esm/target/lib/server/ServerManager.d.ts +19 -0
- package/dist/esm/target/lib/server/consts.d.ts +3 -0
- package/dist/esm/target/lib/server/consts.js +3 -0
- package/dist/esm/target/lib/web/input.d.ts +21 -0
- package/dist/esm/target/lib/web/input.js +4 -0
- package/dist/esm/target/node-core-cli/NodeCoreCLIManager.js +2 -2
- package/dist/esm/target/node-express-server/NodeExpressServerManager.js +5 -0
- package/dist/esm/target/node-express-server/lib/AuthCookieCreator.js +1 -1
- package/dist/esm/target/node-express-server/middlewares/AuthenticationCheckerMiddlewareBuilder.js +1 -0
- package/dist/esm/target/node-express-server/middlewares/PublicApiKeyCheckerMiddlewareBuilder.js +1 -0
- package/dist/esm/target/node-express-server/middlewares/RequestCheckerMiddlewareBuilder.js +1 -0
- package/dist/esm/target/node-express-server/middlewares/RequestHandlerMiddlewareBuilder.js +8 -0
- package/dist/esm/target/node-express-server/middlewares/RequestLoggerMiddlewareBuilder.js +1 -0
- package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.d.ts +10 -0
- package/dist/esm/target/node-mcp-server/NodeLocalStdioMCPServerManager.js +14 -0
- package/dist/esm/target/react-native-pure/UCForm.js +2 -2
- package/dist/esm/target/react-native-pure/UCFormField.d.ts +2 -9
- package/dist/esm/target/react-native-pure/UCFormField.js +9 -20
- package/dist/esm/target/react-native-pure/UCFormFieldControl.d.ts +3 -10
- package/dist/esm/target/react-native-pure/UCFormFieldControl.js +9 -8
- package/dist/esm/target/react-native-pure/UCFormFieldDesc.d.ts +2 -5
- package/dist/esm/target/react-native-pure/UCFormFieldDesc.js +2 -2
- package/dist/esm/target/react-native-pure/UCFormFieldErr.d.ts +2 -6
- package/dist/esm/target/react-native-pure/UCFormFieldLabel.d.ts +2 -5
- package/dist/esm/target/react-native-pure/UCFormFieldLabel.js +2 -2
- package/dist/esm/target/react-native-pure/UCFormSubmitControl.d.ts +2 -7
- package/dist/esm/target/react-native-pure/UCFormSubmitControl.js +1 -1
- package/dist/esm/target/react-web-pure/UCForm.js +1 -1
- package/dist/esm/target/react-web-pure/UCFormField.d.ts +2 -9
- package/dist/esm/target/react-web-pure/UCFormField.js +9 -20
- package/dist/esm/target/react-web-pure/UCFormFieldControl.d.ts +3 -10
- package/dist/esm/target/react-web-pure/UCFormFieldControl.js +20 -5
- package/dist/esm/target/react-web-pure/UCFormFieldDesc.d.ts +2 -5
- package/dist/esm/target/react-web-pure/UCFormFieldDesc.js +2 -2
- package/dist/esm/target/react-web-pure/UCFormFieldErr.d.ts +2 -6
- package/dist/esm/target/react-web-pure/UCFormFieldLabel.d.ts +2 -5
- package/dist/esm/target/react-web-pure/UCFormFieldLabel.js +3 -3
- package/dist/esm/target/react-web-pure/UCFormSubmitControl.d.ts +2 -4
- package/dist/esm/target/react-web-pure/UCFormSubmitControl.js +1 -1
- package/dist/esm/testing/AppTester.d.ts +4 -0
- package/dist/esm/testing/AppTester.js +16 -0
- package/dist/esm/testing/AppTesterConfigurator.d.ts +68 -0
- package/dist/esm/testing/UCDataStoreTester.d.ts +9 -0
- package/dist/esm/testing/UCDataStoreTester.js +13 -0
- package/dist/esm/testing/impl/SimpleAppDocsEmitter.js +22 -2
- package/dist/esm/testing/impl/SimpleAppTesterConfigurator.js +1 -0
- package/dist/esm/testing/impl/SimpleHTMLAppTestReportEmitter.js +9 -3
- package/dist/esm/testing/impl/TypeScriptLibUCDefASTParser.js +12 -4
- package/dist/esm/testing/impl/VitestAppTestSuiteEmitter.js +6 -0
- package/dist/esm/testing/opts.d.ts +38 -0
- package/dist/esm/testing/opts.js +1 -1
- package/dist/esm/testing/uc-input.js +2 -0
- package/dist/esm/testing/workers/AppTesterCtxInitializer.js +7 -0
- package/dist/esm/testing/workers/UCExecutor.js +1 -0
- package/dist/esm/testing/workers/checkers/AppIndexChecker.js +1 -0
- package/dist/esm/testing/workers/checkers/UCDefSourcesChecker.js +4 -0
- package/dist/esm/uc/UC.js +19 -1
- package/dist/esm/uc/UCInputField.d.ts +28 -0
- package/dist/esm/uc/UCInputField.js +42 -0
- package/dist/esm/uc/data.d.ts +3 -0
- package/dist/esm/uc/def.d.ts +7 -0
- package/dist/esm/uc/exec.d.ts +39 -0
- package/dist/esm/uc/exec.js +29 -0
- package/dist/esm/uc/ext.d.ts +30 -1
- package/dist/esm/uc/helpers/UCOutputBuilder.js +5 -0
- package/dist/esm/uc/helpers/UCOutputReader.js +3 -1
- package/dist/esm/uc/impl/HTTPUCTransporter.js +4 -0
- package/dist/esm/uc/impl/InMemoryUCDataStore.js +7 -0
- package/dist/esm/uc/impl/KnexUCDataStore.d.ts +4 -0
- package/dist/esm/uc/impl/KnexUCDataStore.js +14 -0
- package/dist/esm/uc/impl/SimpleUCManager.js +6 -0
- package/dist/esm/uc/input-field.d.ts +60 -0
- package/dist/esm/uc/input-field.js +33 -0
- package/dist/esm/uc/input.d.ts +24 -0
- package/dist/esm/uc/lifecycle/client/IdleClientMain.js +1 -0
- package/dist/esm/uc/lifecycle/server/IdleServerMain.js +2 -0
- package/dist/esm/uc/manager.d.ts +11 -0
- package/dist/esm/uc/metadata.d.ts +10 -0
- package/dist/esm/uc/opi-layout.d.ts +3 -0
- package/dist/esm/uc/opi.d.ts +8 -0
- package/dist/esm/uc/output-field.d.ts +9 -0
- package/dist/esm/uc/output-part.d.ts +22 -0
- package/dist/esm/uc/output.d.ts +3 -0
- package/dist/esm/uc/policies/RoleRegularUCPolicy.js +1 -0
- package/dist/esm/uc/policies/funcs.js +1 -0
- package/dist/esm/uc/policy.d.ts +22 -0
- package/dist/esm/uc/sec.d.ts +9 -0
- package/dist/esm/uc/server.d.ts +10 -0
- package/dist/esm/uc/settings.d.ts +25 -0
- package/dist/esm/uc/side-effect.d.ts +16 -0
- package/dist/esm/uc/side-effect.js +16 -0
- package/dist/esm/uc/utils/rInput.d.ts +12 -0
- package/dist/esm/uc/utils/rInput.js +2 -0
- package/dist/esm/uc/utils/rVal.d.ts +25 -0
- package/dist/esm/uc/utils/rVal.js +27 -0
- package/dist/esm/uc/utils/recIs.d.ts +9 -0
- package/dist/esm/uc/utils/recIs.js +12 -1
- package/dist/esm/uc/utils/stripUCDLifecycleServer.d.ts +13 -0
- package/dist/esm/uc/utils/stripUCDLifecycleServer.js +17 -0
- package/dist/esm/uc/utils/ucifcoIsForArray.d.ts +6 -0
- package/dist/esm/uc/utils/ucifcoIsForArray.js +6 -0
- package/dist/esm/uc/workers/SimpleAggregateFinder.d.ts +12 -0
- package/dist/esm/uc/workers/SimpleAggregateFinder.js +12 -0
- package/dist/esm/uc/workers/UCBuilder.d.ts +7 -0
- package/dist/esm/uc/workers/UCBuilder.js +7 -0
- package/dist/esm/uc/workers/UCExecChecker.js +2 -0
- package/dist/esm/uc/workers/UCInputFilesProcessor.js +10 -4
- package/dist/esm/uc/workers/UCOutputFilesProcessor.js +6 -2
- package/dist/esm/utils/async/sleep.d.ts +10 -0
- package/dist/esm/utils/async/sleep.js +10 -0
- package/dist/esm/utils/http/appendData.js +5 -1
- package/dist/esm/utils/ioc/ContainerPrinter.js +2 -0
- package/dist/esm/utils/ioc/bindCommon.js +4 -0
- package/dist/esm/utils/ioc/bindNodeCLI.js +2 -0
- package/dist/esm/utils/ioc/bindNodeCore.js +1 -0
- package/dist/esm/utils/ioc/bindProduct.js +2 -0
- package/dist/esm/utils/ioc/bindRN.js +1 -0
- package/dist/esm/utils/ioc/bindServer.js +1 -0
- package/dist/esm/utils/ioc/bindWeb.js +2 -0
- package/dist/esm/utils/ioc/container.js +6 -0
- package/dist/esm/utils/numbers/units.js +3 -0
- package/dist/esm/utils/types/funcs.d.ts +35 -0
- package/dist/esm/utils/types/funcs.js +35 -0
- package/dist/esm/utils/types/utility-types.d.ts +17 -0
- package/dist/esm/utils/types/utility-types.js +1 -0
- package/package.json +13 -14
|
@@ -1,2 +1,15 @@
|
|
|
1
1
|
import type { UCDefSourceRaw } from '../def.js';
|
|
2
|
+
/**
|
|
3
|
+
* Strip the server part of the UCD
|
|
4
|
+
*
|
|
5
|
+
* To be used by bundlers when building for the web for example, or any other clients (e.g. React Native).
|
|
6
|
+
*
|
|
7
|
+
* WARNING : This implementation is very naive and will have unexpected behaviors when the UCD has a specific shape.
|
|
8
|
+
* For instance, if there is another `server: {` occurence than the lifecycle.server definition, it will be wrongly replaced.
|
|
9
|
+
*
|
|
10
|
+
* TODO : Make this implementation more robust (let's try not to use an AST parser though, to keep things fast and simple).
|
|
11
|
+
*
|
|
12
|
+
* @param source
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
2
15
|
export declare function stripUCDLifecycleServer(source: UCDefSourceRaw): UCDefSourceRaw;
|
|
@@ -5,6 +5,19 @@ const TOKEN_IMPORT_END = ';';
|
|
|
5
5
|
const TOKEN_LIFECYCLE_SERVER = 'server: {';
|
|
6
6
|
const TOKEN_LIFECYCLE_SERVER_END = '},';
|
|
7
7
|
const TOKEN_LIFECYCLE_SERVER_REPLACE = 'server: true,';
|
|
8
|
+
/**
|
|
9
|
+
* Strip the server part of the UCD
|
|
10
|
+
*
|
|
11
|
+
* To be used by bundlers when building for the web for example, or any other clients (e.g. React Native).
|
|
12
|
+
*
|
|
13
|
+
* WARNING : This implementation is very naive and will have unexpected behaviors when the UCD has a specific shape.
|
|
14
|
+
* For instance, if there is another `server: {` occurence than the lifecycle.server definition, it will be wrongly replaced.
|
|
15
|
+
*
|
|
16
|
+
* TODO : Make this implementation more robust (let's try not to use an AST parser though, to keep things fast and simple).
|
|
17
|
+
*
|
|
18
|
+
* @param source
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
8
21
|
export function stripUCDLifecycleServer(source) {
|
|
9
22
|
const occurrences = [
|
|
10
23
|
...source.matchAll(new RegExp(UC_MAIN_SERVER_SUFFIX, 'g')),
|
|
@@ -14,6 +27,7 @@ export function stripUCDLifecycleServer(source) {
|
|
|
14
27
|
let occIdx = 0;
|
|
15
28
|
for (const occ of occurrences) {
|
|
16
29
|
if (count === 3 && occIdx === 1) {
|
|
30
|
+
// Skip the 2nd occurrence as it is part of the import of the 1st (Rrrrh very hacky...)
|
|
17
31
|
occIdx += 1;
|
|
18
32
|
continue;
|
|
19
33
|
}
|
|
@@ -37,6 +51,9 @@ export function stripUCDLifecycleServer(source) {
|
|
|
37
51
|
toReplace.push(toRep);
|
|
38
52
|
occIdx += 1;
|
|
39
53
|
}
|
|
54
|
+
// Flip the items to replace in order to remove the usage before the imports
|
|
55
|
+
// This is related to the edge case of IdleServerMain that we remove from the imports list,
|
|
56
|
+
// while for specific ServerMain, we remove the entire import instruction.
|
|
40
57
|
toReplace.reverse();
|
|
41
58
|
let cleaned = source;
|
|
42
59
|
for (const { str } of toReplace) {
|
|
@@ -1,2 +1,8 @@
|
|
|
1
1
|
import { UCInputFieldChangeOperator } from '../input-field.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check whether a {@link UCInputFieldChangeOperator} is for an array or not.
|
|
4
|
+
*
|
|
5
|
+
* @param op
|
|
6
|
+
* @returns
|
|
7
|
+
*/
|
|
2
8
|
export declare function ucifcoIsForArray(op: UCInputFieldChangeOperator): op is UCInputFieldChangeOperator.ADD | UCInputFieldChangeOperator.REMOVE;
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { UCInputFieldChangeOperator } from '../input-field.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check whether a {@link UCInputFieldChangeOperator} is for an array or not.
|
|
4
|
+
*
|
|
5
|
+
* @param op
|
|
6
|
+
* @returns
|
|
7
|
+
*/
|
|
2
8
|
export function ucifcoIsForArray(op) {
|
|
3
9
|
return [
|
|
4
10
|
UCInputFieldChangeOperator.ADD,
|
|
@@ -12,6 +12,18 @@ interface Input {
|
|
|
12
12
|
interface Output<I extends UCInput | undefined = undefined, D extends UCData | null = null> {
|
|
13
13
|
record: UCDataStoreRecord<I, D>;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Find an aggregate by id by replaying additive use cases and removal ones
|
|
17
|
+
*
|
|
18
|
+
* This works only in simple scenarios where you have the following use cases :
|
|
19
|
+
* - `CreateX`
|
|
20
|
+
* - `CreateX`, `DeleteX`
|
|
21
|
+
* - `CreateX`, `[DeleteX, ArchiveX]`
|
|
22
|
+
*
|
|
23
|
+
* If there is an `UpdateX` for example, do not use this as the record won't be accurate. Replay the records yourself with {@link UCDataStore.read()}.
|
|
24
|
+
*
|
|
25
|
+
* It throws a {@link NotFoundError} if there are more than one record (in which case somethin is wrong with the data store) or none.
|
|
26
|
+
*/
|
|
15
27
|
export declare class SimpleAggregateFinder implements Worker<Input, Promise<Output>> {
|
|
16
28
|
private ucDataStore;
|
|
17
29
|
constructor(ucDataStore: UCDataStore);
|
|
@@ -12,6 +12,18 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
12
12
|
};
|
|
13
13
|
import { inject, injectable } from 'inversify';
|
|
14
14
|
import { NotFoundError } from '../../error/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* Find an aggregate by id by replaying additive use cases and removal ones
|
|
17
|
+
*
|
|
18
|
+
* This works only in simple scenarios where you have the following use cases :
|
|
19
|
+
* - `CreateX`
|
|
20
|
+
* - `CreateX`, `DeleteX`
|
|
21
|
+
* - `CreateX`, `[DeleteX, ArchiveX]`
|
|
22
|
+
*
|
|
23
|
+
* If there is an `UpdateX` for example, do not use this as the record won't be accurate. Replay the records yourself with {@link UCDataStore.read()}.
|
|
24
|
+
*
|
|
25
|
+
* It throws a {@link NotFoundError} if there are more than one record (in which case somethin is wrong with the data store) or none.
|
|
26
|
+
*/
|
|
15
27
|
let SimpleAggregateFinder = class SimpleAggregateFinder {
|
|
16
28
|
ucDataStore;
|
|
17
29
|
constructor(ucDataStore) {
|
|
@@ -4,6 +4,13 @@ import type { UCInput } from '../input.js';
|
|
|
4
4
|
import type { UCOPIBase } from '../opi.js';
|
|
5
5
|
type Input<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined> = ArgsRecord<I, OPI0, OPI1>;
|
|
6
6
|
type Output<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined> = UC<I, OPI0, OPI1>;
|
|
7
|
+
/**
|
|
8
|
+
* Build a Use Case
|
|
9
|
+
*
|
|
10
|
+
* When initially implemented this, {@link I18nManager} was injected to provide the `languageCode` to the {@link UC}.
|
|
11
|
+
*
|
|
12
|
+
* But this dependency has been removed when introducing {@link WordingManager}. Let's keep it for now in case we need to inject something.
|
|
13
|
+
*/
|
|
7
14
|
export declare class UCBuilder implements Worker<Input, Output> {
|
|
8
15
|
exec<I extends UCInput | undefined = undefined, OPI0 extends UCOPIBase | undefined = undefined, OPI1 extends UCOPIBase | undefined = undefined>({ appManifest, auth, def }: Input<I, OPI0, OPI1>): Output<I, OPI0, OPI1>;
|
|
9
16
|
}
|
|
@@ -6,6 +6,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { injectable } from 'inversify';
|
|
8
8
|
import { UC } from '../UC.js';
|
|
9
|
+
/**
|
|
10
|
+
* Build a Use Case
|
|
11
|
+
*
|
|
12
|
+
* When initially implemented this, {@link I18nManager} was injected to provide the `languageCode` to the {@link UC}.
|
|
13
|
+
*
|
|
14
|
+
* But this dependency has been removed when introducing {@link WordingManager}. Let's keep it for now in case we need to inject something.
|
|
15
|
+
*/
|
|
9
16
|
let UCBuilder = class UCBuilder {
|
|
10
17
|
exec({ appManifest, auth, def }) {
|
|
11
18
|
return new UC(appManifest, def, auth);
|
|
@@ -54,6 +54,8 @@ let UCExecChecker = class UCExecChecker {
|
|
|
54
54
|
break;
|
|
55
55
|
}
|
|
56
56
|
case 'server':
|
|
57
|
+
// Nothing specific for the moment as everything is checked in function of authentication
|
|
58
|
+
// @see AuthenticationChecker called in the request lifecycle
|
|
57
59
|
output.allowed = typeof server === 'object';
|
|
58
60
|
break;
|
|
59
61
|
default:
|
|
@@ -42,6 +42,9 @@ let UCInputFilesProcessor = class UCInputFilesProcessor {
|
|
|
42
42
|
if (isRepeatable) {
|
|
43
43
|
const files = rValArr(field.getValue());
|
|
44
44
|
const fileNameRefs = await Promise.all(files.map(async (f) => this.processFile(f)));
|
|
45
|
+
// Although the field is a file, here we fill it with the refs (for persistence)
|
|
46
|
+
// TODO : Improve the mgmt of FileNameRef vs actual File at the use case level
|
|
47
|
+
// I think we need to introduce another value, something like `setValueSerialized` or similar.
|
|
45
48
|
field.setValue(UCInputFieldChangeOperator.SET, fileNameRefs);
|
|
46
49
|
}
|
|
47
50
|
else {
|
|
@@ -54,12 +57,15 @@ let UCInputFilesProcessor = class UCInputFilesProcessor {
|
|
|
54
57
|
}
|
|
55
58
|
}
|
|
56
59
|
async processFile(file) {
|
|
57
|
-
const extension = this.fsManager.fileExtension(file.name);
|
|
60
|
+
const extension = this.fsManager.fileExtension(file.name); // => jpg
|
|
58
61
|
const prefix = this.clockManager.nowToKey();
|
|
59
|
-
const fileName = `${prefix}-${this.cryptoManager.randomUUID()}.${extension}`;
|
|
60
|
-
const fileNameRef = `${this.s().uc_file_ref_prefix}${fileName}`;
|
|
62
|
+
const fileName = `${prefix}-${this.cryptoManager.randomUUID()}.${extension}`; // => 20230110143732-155eb8d3-9af5-430e-b856-248007859df1.jpg
|
|
63
|
+
const fileNameRef = `${this.s().uc_file_ref_prefix}${fileName}`; // => $ref:20230110143732-155eb8d3-9af5-430e-b856-248007859df1.jpg
|
|
64
|
+
// When calling this client side, we still have a https://developer.mozilla.org/en-US/docs/Web/API/File
|
|
65
|
+
// Consider moving this logic to UCManager.execClient ?
|
|
66
|
+
// TODO : Improve client/server input files management
|
|
61
67
|
const path = file instanceof File ? file.name : file.path;
|
|
62
|
-
await this.fsManager.cp(path, this.fsManager.path(this.s().uc_files_directory_path, fileName));
|
|
68
|
+
await this.fsManager.cp(path, this.fsManager.path(this.s().uc_files_directory_path, fileName)); // => /path/to/files/20230110143732-155eb8d3-9af5-430e-b856-248007859df1.jpg
|
|
63
69
|
await this.fsManager.rm(path);
|
|
64
70
|
return fileNameRef;
|
|
65
71
|
}
|
|
@@ -36,8 +36,12 @@ let UCOutputFilesProcessor = class UCOutputFilesProcessor {
|
|
|
36
36
|
output.filePaths = await Promise.all(fileNameRefs.map(async (fileNameRef) => {
|
|
37
37
|
let filePath;
|
|
38
38
|
if (typeof fileNameRef === 'string') {
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
// If they have been processed by UCInputFilesProcessor, the refs are not actual File.
|
|
40
|
+
// They are string like '$ref:20230110143732-155eb8d3-9af5-430e-b856-248007859df1.jpg'.
|
|
41
|
+
// Hence this workaround.
|
|
42
|
+
// TODO : Find a better way to process output files
|
|
43
|
+
const fileName = fileNameRef.replace(this.s().uc_file_ref_prefix, ''); // => 20230110143732-155eb8d3-9af5-430e-b856-248007859df1.jpg
|
|
44
|
+
filePath = this.fsManager.path(this.s().uc_files_directory_path, fileName); // => /path/to/files/20230110143732-155eb8d3-9af5-430e-b856-248007859df1.jpg
|
|
41
45
|
}
|
|
42
46
|
else {
|
|
43
47
|
filePath = fileNameRef.path;
|
|
@@ -1,2 +1,12 @@
|
|
|
1
1
|
import type { UIntDuration } from '../../dt/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sleep during the specified duration
|
|
4
|
+
*
|
|
5
|
+
* NOTE : We are in an async world so do this only when necessary or when you want to "fake" time.
|
|
6
|
+
* Generally speaking, if something is fast, do not make it slower just for the sake of showing a fancy animation.
|
|
7
|
+
* Well... If it's a good one, maybe.
|
|
8
|
+
*
|
|
9
|
+
* @param durationInMs
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
2
12
|
export declare function sleep(durationInMs: UIntDuration): Promise<void>;
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sleep during the specified duration
|
|
3
|
+
*
|
|
4
|
+
* NOTE : We are in an async world so do this only when necessary or when you want to "fake" time.
|
|
5
|
+
* Generally speaking, if something is fast, do not make it slower just for the sake of showing a fancy animation.
|
|
6
|
+
* Well... If it's a good one, maybe.
|
|
7
|
+
*
|
|
8
|
+
* @param durationInMs
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
1
11
|
export function sleep(durationInMs) {
|
|
2
12
|
return new Promise((resolve) => {
|
|
3
13
|
setTimeout(() => {
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export async function appendData(data,
|
|
1
|
+
export async function appendData(data,
|
|
2
|
+
// biome-ignore lint/suspicious/noExplicitAny: can be anything
|
|
3
|
+
func) {
|
|
4
|
+
// Checking undefined and null because Object.keys(undefined|null) throws
|
|
5
|
+
// TypeError: Cannot convert undefined or null to object
|
|
2
6
|
if (data === undefined || data === null) {
|
|
3
7
|
return;
|
|
4
8
|
}
|
|
@@ -18,6 +18,8 @@ let ContainerPrinter = class ContainerPrinter {
|
|
|
18
18
|
this.logger = logger;
|
|
19
19
|
}
|
|
20
20
|
async exec({ container }) {
|
|
21
|
+
// See https://github.com/inversify/InversifyJS/issues/1584
|
|
22
|
+
// @ts-ignore
|
|
21
23
|
const dictionary = container._bindingDictionary._map;
|
|
22
24
|
const entries = [];
|
|
23
25
|
const keys = [...dictionary.keys()].map(this.symToString);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// NOTE : Expose this only at a higher level, otherwise, if exposed in utils/index.js, it will create circular dependencies
|
|
1
2
|
import { APP_NAME_PLACEHOLDER, PRODUCT_NAME_PLACEHOLDER, } from '../../convention.js';
|
|
2
3
|
import { ConsoleLogger } from '../../std/impl/ConsoleLogger.js';
|
|
3
4
|
import { FetchHTTPAPICallExecutor } from '../../std/impl/FetchHTTPAPICallExecutor.js';
|
|
@@ -25,12 +26,14 @@ export function bindCommon(container, settingsFunc) {
|
|
|
25
26
|
...commonSettings,
|
|
26
27
|
...settingsFunc?.(commonSettings),
|
|
27
28
|
};
|
|
29
|
+
// product
|
|
28
30
|
if (!container.isBound('ProductManifest')) {
|
|
29
31
|
container.bind('ProductManifest').toConstantValue({
|
|
30
32
|
appReg: [{ name: APP_NAME_PLACEHOLDER }],
|
|
31
33
|
name: PRODUCT_NAME_PLACEHOLDER,
|
|
32
34
|
});
|
|
33
35
|
}
|
|
36
|
+
// std
|
|
34
37
|
container.bind('ClockManager').to(StdDateClockManager);
|
|
35
38
|
container
|
|
36
39
|
.bind('FormDataBuilder')
|
|
@@ -56,6 +59,7 @@ export function bindCommon(container, settingsFunc) {
|
|
|
56
59
|
.bind('ServerClientManager')
|
|
57
60
|
.to(SettingsServerClientManager);
|
|
58
61
|
container.bind('XMLManager').to(NoopXMLManager);
|
|
62
|
+
// uc
|
|
59
63
|
bindProvider(container, 'UCInit');
|
|
60
64
|
bindProvider(container, 'UCMain');
|
|
61
65
|
bindProvider(container, 'UCPolicy');
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { NodePromptManager } from '../../std/impl/NodePromptManager.js';
|
|
2
2
|
import { PromptUCClientConfirmManager } from '../../uc/impl/PromptUCClientConfirmManager.js';
|
|
3
3
|
export function bindNodeCLI(container) {
|
|
4
|
+
// std
|
|
4
5
|
container.bind('PromptManager').to(NodePromptManager);
|
|
6
|
+
// uc
|
|
5
7
|
container
|
|
6
8
|
.rebind('UCClientConfirmManager')
|
|
7
9
|
.to(PromptUCClientConfirmManager);
|
|
@@ -4,6 +4,7 @@ import { NodeEnvironmentManager } from '../../std/impl/NodeEnvironmentManager.js
|
|
|
4
4
|
import { NodeFSManager } from '../../std/impl/NodeFSManager.js';
|
|
5
5
|
import { NodeFormDataBuilder } from '../../std/impl/NodeFormDataBuilder.js';
|
|
6
6
|
export function bindNodeCore(container) {
|
|
7
|
+
// std
|
|
7
8
|
container.bind('BufferManager').to(NodeBufferManager);
|
|
8
9
|
container.bind('CryptoManager').to(NodeCryptoManager);
|
|
9
10
|
container
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export function bindProduct(container, productManifest, productI18n) {
|
|
2
|
+
// Using rebind because these are already bound by default in {@link bindCommon}.
|
|
3
|
+
// The goal is to make it easier to get started for a user.
|
|
2
4
|
container.rebind('I18n').toConstantValue(productI18n);
|
|
3
5
|
container
|
|
4
6
|
.rebind('ProductManifest')
|
|
@@ -2,6 +2,7 @@ import { JoseJWTManager } from '../../index.std-jwt-manager-jose.js';
|
|
|
2
2
|
import { FakeEmailManager } from '../../std/impl/FakeEmailManager.js';
|
|
3
3
|
import { FakeJobManager } from '../../std/impl/FakeJobManager.js';
|
|
4
4
|
export function bindServer(container) {
|
|
5
|
+
// std
|
|
5
6
|
container.bind('EmailManager').to(FakeEmailManager);
|
|
6
7
|
container.bind('JWTManager').to(JoseJWTManager);
|
|
7
8
|
container.bind('JobManager').to(FakeJobManager);
|
|
@@ -3,9 +3,11 @@ import { WebCryptoManager } from '../../std/impl/WebCryptoManager.js';
|
|
|
3
3
|
import { WebFSManager } from '../../std/impl/WebFSManager.js';
|
|
4
4
|
import { WebUCClientConfirmManager } from '../../uc/impl/WebUCClientConfirmManager.js';
|
|
5
5
|
export function bindWeb(container) {
|
|
6
|
+
// std
|
|
6
7
|
container.bind('BufferManager').to(BufferLibBufferManager);
|
|
7
8
|
container.bind('CryptoManager').to(WebCryptoManager);
|
|
8
9
|
container.bind('FSManager').to(WebFSManager);
|
|
10
|
+
// uc
|
|
9
11
|
container
|
|
10
12
|
.rebind('UCClientConfirmManager')
|
|
11
13
|
.to(WebUCClientConfirmManager);
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
export const CONTAINER_OPTS = {
|
|
2
|
+
/**
|
|
3
|
+
* Allows us to avoid binding concrete classes
|
|
4
|
+
*
|
|
5
|
+
* @see https://github.com/inversify/InversifyJS/issues/1302
|
|
6
|
+
* @see https://github.com/inversify/InversifyJS/blob/master/wiki/container_api.md#autobindinjectable
|
|
7
|
+
*/
|
|
2
8
|
autoBindInjectable: true,
|
|
3
9
|
};
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options
|
|
2
|
+
// https://unicode.org/reports/tr35/tr35-general.html#Unit_Elements
|
|
3
|
+
// https://tc39.es/ecma402/#table-sanctioned-single-unit-identifiers
|
|
1
4
|
const CORE_UNITS = [
|
|
2
5
|
'acre',
|
|
3
6
|
'bit',
|
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
import type { NumIndex, UIntQuantity } from '../../dt/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Assert that the value is defined
|
|
4
|
+
* @param value
|
|
5
|
+
* @param key
|
|
6
|
+
* @see isBlank
|
|
7
|
+
*/
|
|
2
8
|
export declare function assertIsDefined<T>(value: T, key: string): asserts value is NonNullable<T>;
|
|
9
|
+
/**
|
|
10
|
+
* Checker whether the value is blank or not
|
|
11
|
+
*
|
|
12
|
+
* Blank means `undefined`, `null`, `''` (if string), `[]` (if array).
|
|
13
|
+
*
|
|
14
|
+
* This is insipred by Ruby's `blank?` method.
|
|
15
|
+
*
|
|
16
|
+
* @param value
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
3
19
|
export declare function isBlank<T>(value: T | T[] | undefined | null): value is undefined | null;
|
|
20
|
+
/**
|
|
21
|
+
* Get an array filled with `[0 .. n-1]`
|
|
22
|
+
* @param n
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
4
25
|
export declare function range(n: UIntQuantity): NumIndex[];
|
|
26
|
+
/**
|
|
27
|
+
* Get a random item from the array
|
|
28
|
+
*
|
|
29
|
+
* Although the name is inspired by Ruby's, the signature and implementation is not exactly the same (for now).
|
|
30
|
+
*
|
|
31
|
+
* @param items
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
5
34
|
export declare function sample<T>(items: T[]): T | null;
|
|
35
|
+
/**
|
|
36
|
+
* Get an array of size `n` filled with `val`
|
|
37
|
+
* @param val
|
|
38
|
+
* @param n
|
|
39
|
+
* @returns
|
|
40
|
+
*/
|
|
6
41
|
export declare function tupleOf<T>(val: T, n: UIntQuantity): T[];
|
|
@@ -1,15 +1,36 @@
|
|
|
1
1
|
import { IllegalArgumentError } from '../../error/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Assert that the value is defined
|
|
4
|
+
* @param value
|
|
5
|
+
* @param key
|
|
6
|
+
* @see isBlank
|
|
7
|
+
*/
|
|
2
8
|
export function assertIsDefined(value, key) {
|
|
3
9
|
if (isBlank(value)) {
|
|
4
10
|
throw new IllegalArgumentError(`${key} is required`);
|
|
5
11
|
}
|
|
6
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Checker whether the value is blank or not
|
|
15
|
+
*
|
|
16
|
+
* Blank means `undefined`, `null`, `''` (if string), `[]` (if array).
|
|
17
|
+
*
|
|
18
|
+
* This is insipred by Ruby's `blank?` method.
|
|
19
|
+
*
|
|
20
|
+
* @param value
|
|
21
|
+
* @returns
|
|
22
|
+
*/
|
|
7
23
|
export function isBlank(value) {
|
|
8
24
|
return (value === undefined ||
|
|
9
25
|
value === null ||
|
|
10
26
|
(typeof value === 'string' && value.trim().length === 0) ||
|
|
11
27
|
(Array.isArray(value) && value.length === 0));
|
|
12
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Get an array filled with `[0 .. n-1]`
|
|
31
|
+
* @param n
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
13
34
|
export function range(n) {
|
|
14
35
|
const items = [];
|
|
15
36
|
for (let i = 0; i < n; i++) {
|
|
@@ -17,12 +38,26 @@ export function range(n) {
|
|
|
17
38
|
}
|
|
18
39
|
return items;
|
|
19
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Get a random item from the array
|
|
43
|
+
*
|
|
44
|
+
* Although the name is inspired by Ruby's, the signature and implementation is not exactly the same (for now).
|
|
45
|
+
*
|
|
46
|
+
* @param items
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
20
49
|
export function sample(items) {
|
|
21
50
|
if (items.length === 0) {
|
|
22
51
|
return null;
|
|
23
52
|
}
|
|
24
53
|
return items[Math.floor(Math.random() * items.length)] ?? null;
|
|
25
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Get an array of size `n` filled with `val`
|
|
57
|
+
* @param val
|
|
58
|
+
* @param n
|
|
59
|
+
* @returns
|
|
60
|
+
*/
|
|
26
61
|
export function tupleOf(val, n) {
|
|
27
62
|
const items = [];
|
|
28
63
|
for (let i = 0; i < n; i++) {
|
|
@@ -1,5 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract a subset of a union type in a strict manner
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
*
|
|
6
|
+
* ```
|
|
7
|
+
* type Color = 'red' | 'orange' | 'green';
|
|
8
|
+
* type PassColor = Extract<Color, 'green' | 'toto'>; // Does not trigger any error
|
|
9
|
+
* type PassColor = ExtractStrict<Color, 'green' | 'toto'>; // Type '"green" | "toto"' does not satisfy the constraint 'Color'. Type '"toto"' is not assignable to type 'Color'.
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
1
12
|
export type ExtractStrict<T, U extends T> = Extract<T, U>;
|
|
13
|
+
/**
|
|
14
|
+
* Get a type corresponding to T with all the properties `NonNullable`, recursively
|
|
15
|
+
*/
|
|
2
16
|
export type RecursiveNonNullable<T> = {
|
|
3
17
|
[K in keyof T]-?: RecursiveNonNullable<NonNullable<T[K]>>;
|
|
4
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* Extract the string keys of T
|
|
21
|
+
*/
|
|
5
22
|
export type StringKeys<T extends object> = Extract<keyof T, string>;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "libmodulor",
|
|
3
3
|
"description": "An opinionated TypeScript library to create business oriented applications",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.6.0",
|
|
5
5
|
"license": "LGPL-3.0",
|
|
6
6
|
"author": "Chafik H'nini <chafik.hnini@gmail.com>",
|
|
7
7
|
"homepage": "https://github.com/c100k/libmodulor#readme",
|
|
@@ -13,9 +13,6 @@
|
|
|
13
13
|
".": {
|
|
14
14
|
"import": "./dist/esm/index.js"
|
|
15
15
|
},
|
|
16
|
-
"./helper": {
|
|
17
|
-
"import": "./dist/products/Helper/index.js"
|
|
18
|
-
},
|
|
19
16
|
"./locales/en": {
|
|
20
17
|
"import": "./dist/esm/i18n/locales/en.js"
|
|
21
18
|
},
|
|
@@ -56,9 +53,10 @@
|
|
|
56
53
|
"import": "./dist/esm/index.web.js"
|
|
57
54
|
}
|
|
58
55
|
},
|
|
56
|
+
"bin": "./dist/esm/products/Helper/index.js",
|
|
59
57
|
"peerDependencies": {
|
|
60
|
-
"@hono/node-server": "^1.13.
|
|
61
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
58
|
+
"@hono/node-server": "^1.13.8",
|
|
59
|
+
"@modelcontextprotocol/sdk": "^1.6.0",
|
|
62
60
|
"@stricli/core": "^1.1.1",
|
|
63
61
|
"buffer": "^6.0.3",
|
|
64
62
|
"cookie-parser": "^1.4.7",
|
|
@@ -66,18 +64,19 @@
|
|
|
66
64
|
"express-fileupload": "^1.5.1",
|
|
67
65
|
"fast-check": "^3.23.2",
|
|
68
66
|
"helmet": "^8.0.0",
|
|
69
|
-
"hono": "^4.
|
|
70
|
-
"inversify": "^6.2.
|
|
71
|
-
"jose": "^
|
|
67
|
+
"hono": "^4.7.2",
|
|
68
|
+
"inversify": "^6.2.2",
|
|
69
|
+
"jose": "^6.0.8",
|
|
72
70
|
"knex": "^3.1.0",
|
|
73
|
-
"pg": "^8.13.
|
|
74
|
-
"react": "^
|
|
75
|
-
"react-dom": "^
|
|
76
|
-
"react-native": "^0.
|
|
71
|
+
"pg": "^8.13.3",
|
|
72
|
+
"react": "^19.0.0",
|
|
73
|
+
"react-dom": "^19.0.0",
|
|
74
|
+
"react-native": "^0.78.0",
|
|
77
75
|
"reflect-metadata": "^0.2.2",
|
|
78
76
|
"sqlite3": "^5.1.7",
|
|
79
77
|
"typescript": "^5.7.3",
|
|
80
|
-
"vite": "^6.0
|
|
78
|
+
"vite": "^6.2.0",
|
|
79
|
+
"vitest": "^3.0.7"
|
|
81
80
|
},
|
|
82
81
|
"peerDependenciesMeta": {
|
|
83
82
|
"@hono/node-server": {
|