@nano-app/frontend 0.3.2 → 0.3.4

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.
Files changed (50) hide show
  1. package/bin/generate-stores.mjs +128 -0
  2. package/dist/auto-register.mjs +327 -0
  3. package/dist/index.d.ts +3 -2
  4. package/dist/index.js +12 -2
  5. package/dist/store/{ApiClient.d.ts → ApiStore.d.ts} +4 -3
  6. package/dist/store/{ApiClient.js → ApiStore.js} +11 -11
  7. package/dist/store/AppStore.d.ts +25 -0
  8. package/dist/store/AppStore.js +59 -0
  9. package/dist/store/RenderManager.d.ts +47 -0
  10. package/dist/store/RenderManager.js +78 -0
  11. package/dist/store/StoreManager.d.ts +8 -9
  12. package/dist/store/StoreManager.js +14 -28
  13. package/dist/ui/Controller.d.ts +18 -15
  14. package/dist/ui/Controller.js +43 -14
  15. package/dist/ui/createComponent.d.ts +16 -4
  16. package/dist/ui/createComponent.js +26 -18
  17. package/dist/utils/QueryBuilder.js +4 -2
  18. package/package.json +6 -2
  19. package/dist/api/ApiClient.d.ts +0 -16
  20. package/dist/api/ApiClient.js +0 -69
  21. package/dist/api/QueryBuilder.d.ts +0 -8
  22. package/dist/api/QueryBuilder.js +0 -51
  23. package/dist/components/Controller.d.ts +0 -16
  24. package/dist/components/Controller.js +0 -29
  25. package/dist/config/index.d.ts +0 -21
  26. package/dist/config/index.js +0 -10
  27. package/dist/hooks/useComponent.d.ts +0 -8
  28. package/dist/hooks/useComponent.js +0 -10
  29. package/dist/plugin/index.d.ts +0 -11
  30. package/dist/plugin/index.js +0 -134
  31. package/dist/store/StoreClient.d.ts +0 -11
  32. package/dist/store/StoreClient.js +0 -40
  33. package/dist/store/bootstrapApp.d.ts +0 -19
  34. package/dist/store/bootstrapApp.js +0 -25
  35. package/dist/store/setStores.d.ts +0 -8
  36. package/dist/store/setStores.js +0 -23
  37. package/dist/types/api.d.ts +0 -7
  38. package/dist/types/api.js +0 -2
  39. package/dist/ui/Component.d.ts +0 -4
  40. package/dist/ui/Component.js +0 -49
  41. package/dist/ui/StoreProvider.d.ts +0 -18
  42. package/dist/ui/StoreProvider.js +0 -62
  43. package/dist/ui/defineController.d.ts +0 -23
  44. package/dist/ui/defineController.js +0 -14
  45. package/dist/ui/defineView.d.ts +0 -3
  46. package/dist/ui/defineView.js +0 -44
  47. package/dist/ui/definers.d.ts +0 -1
  48. package/dist/ui/definers.js +0 -59
  49. package/dist/ui/useComponent.d.ts +0 -2
  50. package/dist/ui/useComponent.js +0 -9
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderManager = void 0;
4
+ /**
5
+ {
6
+ store1: {
7
+ path1: {
8
+ component1: true,
9
+ component2: true,
10
+ },
11
+ path2: {
12
+ component1: true,
13
+ },
14
+ path3: {
15
+ component1: true,
16
+ },
17
+ }
18
+ }
19
+ */
20
+ class RenderManager {
21
+ dependenciesMap = new Map();
22
+ hooksMap = new Map();
23
+ /**
24
+ * Registra un hook de re-render para un componente
25
+ * @param componentId - El id del componente
26
+ * @param hook - El hook de re-render
27
+ */
28
+ register(componentId, hook) {
29
+ this.hooksMap.set(componentId, hook);
30
+ }
31
+ /**
32
+ * Agrega una dependencia de path a un componente
33
+ * @param componentId - El id del componente
34
+ * @param path - El path del estado
35
+ * @param storeName - El nombre del store
36
+ */
37
+ dependsOn(componentId, path, storeName) {
38
+ // Si no existe el store, crea un nuevo mapa
39
+ if (!this.dependenciesMap.has(storeName)) {
40
+ this.dependenciesMap.set(storeName, new Map());
41
+ }
42
+ // Si no existe el path, crea un nuevo conjunto
43
+ if (!this.dependenciesMap.get(storeName)?.has(path)) {
44
+ this.dependenciesMap.get(storeName)?.set(path, new Set());
45
+ }
46
+ // Agrega el componente al conjunto de dependencias
47
+ this.dependenciesMap.get(storeName)?.get(path)?.add(componentId);
48
+ }
49
+ /**
50
+ * Actualiza los componentes que dependen de este path
51
+ * @param path - El path del estado
52
+ * @param storeName - El nombre del store
53
+ */
54
+ refresh(path, storeName) {
55
+ // Obtiene los componentes que dependen de este path
56
+ const components = this.dependenciesMap.get(storeName)?.get(path);
57
+ // Si hay componentes que dependen de este path, actualiza cada uno
58
+ if (components) {
59
+ components.forEach((componentId) => {
60
+ this.hooksMap.get(componentId)?.();
61
+ });
62
+ }
63
+ }
64
+ /**
65
+ * Elimina un componente del manager
66
+ * @param componentId - El id del componente
67
+ */
68
+ unregister(componentId) {
69
+ this.hooksMap.delete(componentId);
70
+ this.dependenciesMap.forEach((store) => {
71
+ store.forEach((path) => {
72
+ path.delete(componentId);
73
+ });
74
+ });
75
+ }
76
+ }
77
+ exports.RenderManager = RenderManager;
78
+ exports.default = new RenderManager();
@@ -1,16 +1,15 @@
1
- import { ApiClient } from "./ApiClient";
2
- import { StoreClient } from "./StoreClient";
3
- export type NanoAppConfig = Record<string, StoreEntry>;
4
- export type StoreEntry = {
5
- type: "api" | "local";
6
- baseUrl?: string;
1
+ import { ApiStore } from "./ApiStore";
2
+ import { AppStore } from "./AppStore";
3
+ type StoreEntry = {
4
+ name: string;
5
+ type: "app" | "api";
7
6
  path?: string;
8
- data?: any;
7
+ data?: Record<string, unknown>;
9
8
  };
10
9
  export declare class StoreManager {
11
10
  private stores;
12
- constructor();
13
- getStore(name: string): ApiClient | StoreClient;
11
+ init(entries: StoreEntry[]): void;
12
+ getStore(name: string): AppStore | ApiStore;
14
13
  }
15
14
  declare const _default: StoreManager;
16
15
  export default _default;
@@ -1,43 +1,29 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.StoreManager = void 0;
7
- const path_1 = __importDefault(require("path"));
8
- const fs_1 = __importDefault(require("fs"));
9
- const ApiClient_1 = require("./ApiClient");
10
- const StoreClient_1 = require("./StoreClient");
4
+ const ApiStore_1 = require("./ApiStore");
5
+ const AppStore_1 = require("./AppStore");
11
6
  class StoreManager {
12
- stores = {};
13
- constructor() {
14
- // Carga la configuración
15
- let config = { app: { type: "local", data: {} } };
16
- try {
17
- const mod = require(path_1.default.join(process.cwd(), "nano-app.config.cjs"));
18
- config = mod?.default ?? mod;
7
+ stores = new Map();
8
+ init(entries) {
9
+ if (entries.length === 0) {
10
+ this.stores.set("app", new AppStore_1.AppStore({}));
11
+ return;
19
12
  }
20
- catch { }
21
- // Crea los stores
22
- Object.entries(config)
23
- .forEach(([name, entry]) => {
13
+ entries.forEach(entry => {
24
14
  if (entry.type === "api") {
25
- this.stores[name] = new ApiClient_1.ApiClient(entry.baseUrl ?? "/api");
15
+ this.stores.set(entry.name, new ApiStore_1.ApiStore(entry.data ?? {}, entry.name, entry.path ?? "/api"));
26
16
  }
27
17
  else {
28
- let data = {};
29
- try {
30
- data = entry.path
31
- ? JSON.parse(fs_1.default.readFileSync(path_1.default.resolve(process.cwd(), entry.path), "utf-8"))
32
- : (entry.data ?? {});
33
- }
34
- catch { }
35
- this.stores[name] = new StoreClient_1.StoreClient(data);
18
+ this.stores.set(entry.name, new AppStore_1.AppStore(entry.data ?? {}, entry.name));
36
19
  }
37
20
  });
38
21
  }
39
22
  getStore(name) {
40
- return this.stores[name];
23
+ const store = this.stores.get(name);
24
+ if (!store)
25
+ throw new Error(`Store "${name}" no encontrado.`);
26
+ return store;
41
27
  }
42
28
  }
43
29
  exports.StoreManager = StoreManager;
@@ -1,17 +1,20 @@
1
+ import { ApiResponse } from "@nano-app/backend";
1
2
  import { ReactNode } from "react";
2
- import { useRouter } from "next/navigation";
3
- import { StoreManager } from "../store/StoreManager";
4
- export declare abstract class Controller<Params = {}> {
5
- protected storeManager: StoreManager;
6
- params: Params & {
7
- children?: ReactNode;
8
- };
9
- router: ReturnType<typeof useRouter>;
10
- pathname: string | null;
11
- constructor(storeManager: StoreManager, params: Params & {
12
- children?: ReactNode;
13
- });
14
- protected getStore(name: string): import("..").StoreClient | import("..").ApiClient;
15
- onInit(): void;
16
- onRender(): void;
3
+ export type ReactParams = Record<string, any> & {
4
+ children?: ReactNode;
5
+ hook?: () => void;
6
+ };
7
+ export declare abstract class Controller {
8
+ private componentId;
9
+ constructor(hook: () => void, params: any);
10
+ get<T = any>(path: string, name?: string): T;
11
+ read<T = any>(path: string, params?: {}, name?: string): Promise<ApiResponse<T>>;
12
+ set(path: string, value: any, name?: string): void;
13
+ create<T = any>(path: string, body: any, name?: string): Promise<ApiResponse<T>>;
14
+ update<T = any>(path: string, body: any, name?: string): Promise<ApiResponse<T>>;
15
+ delete<T = any>(path: string, id: any, name?: string): Promise<ApiResponse<T>>;
16
+ destroy(): void;
17
+ onInit(params?: any): void;
18
+ onRender(params?: any): void;
19
+ useHooks(): void;
17
20
  }
@@ -1,20 +1,49 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.Controller = void 0;
7
+ const StoreManager_1 = __importDefault(require("../store/StoreManager"));
8
+ const RenderManager_1 = __importDefault(require("../store/RenderManager"));
4
9
  class Controller {
5
- storeManager;
6
- params = {};
7
- router;
8
- pathname;
9
- constructor(storeManager, params) {
10
- this.storeManager = storeManager;
11
- this.params = params;
12
- this.onInit();
13
- }
14
- getStore(name) {
15
- return this.storeManager.getStore(name);
16
- }
17
- onInit() { }
18
- onRender() { }
10
+ componentId;
11
+ constructor(hook, params) {
12
+ // Registra el componente para reactividad
13
+ this.componentId = Symbol();
14
+ RenderManager_1.default.register(this.componentId, hook);
15
+ // Inicializa el controller
16
+ this.onInit(params);
17
+ }
18
+ get(path, name = 'app') {
19
+ // Registra el path como dependencia
20
+ RenderManager_1.default.dependsOn(this.componentId, path, name);
21
+ // Retorna el valor del store
22
+ return StoreManager_1.default.getStore(name)?.get(path) || undefined;
23
+ }
24
+ read(path, params = {}, name = 'api') {
25
+ // Registra el path como dependencia
26
+ RenderManager_1.default.dependsOn(this.componentId, path, name);
27
+ // Retorna el valor de la api
28
+ return StoreManager_1.default.getStore(name)?.read(path, params);
29
+ }
30
+ set(path, value, name = 'app') {
31
+ StoreManager_1.default.getStore(name)?.set(path, value);
32
+ }
33
+ create(path, body, name = 'api') {
34
+ return StoreManager_1.default.getStore(name)?.create(path, body);
35
+ }
36
+ update(path, body, name = 'api') {
37
+ return StoreManager_1.default.getStore(name)?.update(path, body);
38
+ }
39
+ delete(path, id, name = 'api') {
40
+ return StoreManager_1.default.getStore(name)?.delete(path, id);
41
+ }
42
+ destroy() {
43
+ RenderManager_1.default.unregister(this.componentId);
44
+ }
45
+ onInit(params) { }
46
+ onRender(params) { }
47
+ useHooks() { }
19
48
  }
20
49
  exports.Controller = Controller;
@@ -1,5 +1,17 @@
1
+ import { ReactNode } from "react";
1
2
  import { Controller } from "./Controller";
2
- import storeInstance from "../store/StoreManager";
3
- export type ControllerClass<C extends Controller> = new (storeManager: typeof storeInstance, params: Record<string, any>) => C;
4
- export type ViewFn<C extends Controller> = (controller: C) => React.ReactNode;
5
- export declare function createComponent<C extends Controller>(stores: string[], ControllerClass: ControllerClass<C>, view: ViewFn<C>): (params?: Record<string, any>) => React.ReactNode;
3
+ export type ViewParams = any & {
4
+ children?: ReactNode;
5
+ };
6
+ export type View<C> = (controller: C, params: ViewParams) => ReactNode;
7
+ export type CreateComponentProps<C> = {
8
+ controller?: new (hook: () => void, params: any) => C;
9
+ view?: View<C>;
10
+ };
11
+ /**
12
+ * Crea un componente reactivo que se actualiza automáticamente cuando los datos de los stores cambian.
13
+ * @param ControllerClass - Clase del controller
14
+ * @param view - Función que renderiza el componente
15
+ * @returns - Función que retorna el componente reactivo
16
+ */
17
+ export declare function createComponent<C extends Controller = Controller>({ controller, view }: CreateComponentProps<C>): (params: ViewParams) => ReactNode;
@@ -1,24 +1,32 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.createComponent = createComponent;
7
4
  const react_1 = require("react");
8
- const navigation_1 = require("next/navigation");
9
- const StoreManager_1 = __importDefault(require("../store/StoreManager"));
10
- function createComponent(stores, ControllerClass, view) {
11
- return function (params = {}) {
12
- stores.forEach((name) => StoreManager_1.default.getStore(name)?.use());
13
- const router = (0, navigation_1.useRouter)();
14
- const pathname = (0, navigation_1.usePathname)();
15
- const ref = (0, react_1.useRef)(undefined);
16
- if (!ref.current)
17
- ref.current = new ControllerClass(StoreManager_1.default, params);
18
- const c = ref.current;
19
- c.router = router;
20
- c.pathname = pathname;
21
- c.onRender();
22
- return view(c);
5
+ const Controller_1 = require("./Controller");
6
+ class BaseController extends Controller_1.Controller {
7
+ }
8
+ const BaseView = (_, { children }) => children;
9
+ /**
10
+ * Crea un componente reactivo que se actualiza automáticamente cuando los datos de los stores cambian.
11
+ * @param ControllerClass - Clase del controller
12
+ * @param view - Función que renderiza el componente
13
+ * @returns - Función que retorna el componente reactivo
14
+ */
15
+ function createComponent({ controller, view }) {
16
+ return function (params) {
17
+ // Hook para re-renderizar el componente
18
+ const [, setTick] = (0, react_1.useState)(0);
19
+ // Instancia el controller
20
+ const controllerRef = (0, react_1.useRef)();
21
+ if (!controllerRef.current) {
22
+ controllerRef.current = new (controller || BaseController)(() => setTick((t) => t + 1), params);
23
+ }
24
+ // Ejecuta el método onRender del controller
25
+ controllerRef.current.onRender(params);
26
+ // Ejecuta las hooks del usuario
27
+ controllerRef.current.useHooks();
28
+ // Cleanup del componente
29
+ (0, react_1.useEffect)(() => () => controllerRef.current?.destroy(), []);
30
+ return view ? view(controllerRef.current, params) : BaseView(controllerRef.current, params);
23
31
  };
24
32
  }
@@ -10,8 +10,10 @@ function buildFilters(filters) {
10
10
  }
11
11
  class QueryBuilder {
12
12
  static build(path, params = {}) {
13
- const { skip, filters, expand, orderby, top } = params;
14
- const queryParams = [];
13
+ const { skip, filters, expand, orderby, top, ...extraParams } = params;
14
+ const queryParams = [
15
+ ...Object.entries(extraParams).map(([key, value]) => `${key}=${value}`)
16
+ ];
15
17
  const filtersQuery = buildFilters(filters);
16
18
  if (filtersQuery)
17
19
  queryParams.push(`filter=${filtersQuery}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nano-app/frontend",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "View + Controller frontend architecture for React/Next.js",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -11,8 +11,12 @@
11
11
  "types": "./dist/index.d.ts"
12
12
  }
13
13
  },
14
+ "bin":{
15
+ "generate-stores": "./bin/generate-stores.mjs"
16
+ },
14
17
  "files": [
15
- "dist"
18
+ "dist",
19
+ "bin"
16
20
  ],
17
21
  "scripts": {
18
22
  "build": "tsc",
@@ -1,16 +0,0 @@
1
- import type { ApiResponse } from "@nano-app/backend";
2
- import { StoreClient } from "../store/StoreClient";
3
- export type ApiRequest = (query: string, body?: unknown) => Promise<ApiResponse>;
4
- /**
5
- * Cliente de API que extiende StoreClient y expone CRUD.
6
- * @param baseUrl - Prefijo de todas las peticiones. Por defecto "/api".
7
- */
8
- export declare class ApiClient extends StoreClient {
9
- private baseUrl;
10
- constructor(baseUrl?: string);
11
- create: ApiRequest;
12
- read: ApiRequest;
13
- update: ApiRequest;
14
- delete: ApiRequest;
15
- private request;
16
- }
@@ -1,69 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ApiClient = void 0;
4
- const StoreClient_1 = require("../store/StoreClient");
5
- const QueryBuilder_1 = require("./QueryBuilder");
6
- const TokenHelper_1 = require("../utils/TokenHelper");
7
- const Toast_1 = require("../utils/Toast");
8
- /**
9
- * Cliente de API que extiende StoreClient y expone CRUD.
10
- * @param baseUrl - Prefijo de todas las peticiones. Por defecto "/api".
11
- */
12
- class ApiClient extends StoreClient_1.StoreClient {
13
- baseUrl;
14
- constructor(baseUrl = "/api") {
15
- super();
16
- this.baseUrl = baseUrl;
17
- }
18
- create = async (entity, body) => {
19
- return this.request("POST", entity, body);
20
- };
21
- read = async (query, params = {}) => {
22
- const path = query.split("?")[0];
23
- const response = await this.request("GET", QueryBuilder_1.QueryBuilder.build(query, params));
24
- this.set(`/${path}`, response.result);
25
- return response;
26
- };
27
- update = async (entity, body) => {
28
- return this.request("PUT", entity, body);
29
- };
30
- delete = async (entity, id) => {
31
- return this.request("DELETE", entity, id);
32
- };
33
- async request(method, path, body) {
34
- let oResponse = {
35
- result: null,
36
- success: false,
37
- message: "",
38
- warning: false,
39
- };
40
- this.set("/busyCount", (this.get("/busyCount") || 0) + 1);
41
- this.set("/busy", true);
42
- try {
43
- oResponse = await fetch(`${this.baseUrl}${path}`, {
44
- method,
45
- headers: {
46
- "Content-Type": "application/json",
47
- Authorization: `Bearer ${TokenHelper_1.TokenHelper.get()}`,
48
- },
49
- body: body ? JSON.stringify(body) : undefined,
50
- })
51
- .then((response) => response.json())
52
- .then((response) => Toast_1.Toast.apiResponse(response));
53
- }
54
- catch (error) {
55
- console.error(error);
56
- }
57
- finally {
58
- this.set("/busyCount", this.get("/busyCount") - 1);
59
- if (this.get("/busyCount") <= 0) {
60
- this.set("/busy", false);
61
- }
62
- if (method !== "GET") {
63
- this.set("/refresh", !this.get("/refresh"));
64
- }
65
- }
66
- return oResponse;
67
- }
68
- }
69
- exports.ApiClient = ApiClient;
@@ -1,8 +0,0 @@
1
- export declare class QueryBuilder {
2
- private static readonly ISO_DATE_REGEX;
3
- private static buildFilters;
4
- /**
5
- * Construye una query OData a partir de un objeto de filtros.
6
- */
7
- static build(path: string, params?: Record<string, unknown>): string;
8
- }
@@ -1,51 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.QueryBuilder = void 0;
4
- const DEFAULT_STEP_SKIP_TOP = 10;
5
- class QueryBuilder {
6
- static ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?Z?)?$/;
7
- static buildFilters(filters = {}) {
8
- const filterParts = [];
9
- Object.entries(filters).forEach(([key, value]) => {
10
- if (value !== undefined && value !== null) {
11
- if (typeof value === "string") {
12
- if (QueryBuilder.ISO_DATE_REGEX.test(value)) {
13
- filterParts.push(`${key} ge ${value}`);
14
- }
15
- else {
16
- filterParts.push(`${key} contains ${value}`);
17
- }
18
- }
19
- else {
20
- filterParts.push(`${key} eq ${value}`);
21
- }
22
- }
23
- });
24
- return filterParts.length > 0 ? filterParts.join(" and ") : "";
25
- }
26
- /**
27
- * Construye una query OData a partir de un objeto de filtros.
28
- */
29
- static build(path, params = {}) {
30
- const { skip, filters, expand, orderby, top = 10, ...otherParams } = params;
31
- const queryParams = Object.entries(otherParams).map(([key, value]) => `${key}=${value}`);
32
- const filtersQuery = this.buildFilters(filters ?? {});
33
- if (filtersQuery) {
34
- queryParams.push(`filter=${filtersQuery}`);
35
- }
36
- if (expand) {
37
- queryParams.push(`expand=${expand}`);
38
- }
39
- if (orderby) {
40
- queryParams.push(`orderby=${orderby}`);
41
- }
42
- if (top) {
43
- queryParams.push(`top=${top}`);
44
- }
45
- if (skip) {
46
- queryParams.push(`skip=${skip}`);
47
- }
48
- return `${path}?${queryParams.join("&")}`;
49
- }
50
- }
51
- exports.QueryBuilder = QueryBuilder;
@@ -1,16 +0,0 @@
1
- import { usePathname, useRouter } from "next/navigation";
2
- import { ApiClient } from "../api/ApiClient";
3
- import { StoreClient } from "../store/StoreClient";
4
- export declare abstract class Controller {
5
- private storeManager;
6
- private isInitialized;
7
- protected router?: ReturnType<typeof useRouter>;
8
- protected pathname?: ReturnType<typeof usePathname>;
9
- protected onInit(): void;
10
- protected getStore(model: 'api'): ApiClient;
11
- protected getStore(model?: 'app'): StoreClient;
12
- protected getStore(model: string): ApiClient | StoreClient;
13
- params: any;
14
- deps(): any[];
15
- render(params: any): void;
16
- }
@@ -1,29 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Controller = void 0;
4
- const navigation_1 = require("next/navigation");
5
- const StoreManager_1 = require("../store/StoreManager");
6
- class Controller {
7
- storeManager = new StoreManager_1.StoreManager();
8
- isInitialized = false;
9
- router;
10
- pathname;
11
- onInit() { }
12
- getStore(model = 'app') {
13
- return this.storeManager.getStore(model);
14
- }
15
- params = {};
16
- deps() { return []; }
17
- render(params) {
18
- this.params = params;
19
- this.router = (0, navigation_1.useRouter)();
20
- this.pathname = (0, navigation_1.usePathname)();
21
- // Inicializa el controlador si no ha sido inicializado
22
- if (!this.isInitialized) {
23
- this.isInitialized = true;
24
- this.onInit();
25
- this.storeManager.init();
26
- }
27
- }
28
- }
29
- exports.Controller = Controller;
@@ -1,21 +0,0 @@
1
- export type LocalStoreEntry = {
2
- type: "local";
3
- /** Path relativo a la raíz del proyecto. Ej: "src/models/app.json" */
4
- path?: string;
5
- /** Datos inline (alternativa a path) */
6
- data?: Record<string, any>;
7
- };
8
- export type ApiStoreEntry = {
9
- type: "api";
10
- /** Prefijo base para todas las peticiones de este store. Ej: "/api/users" */
11
- baseUrl?: string;
12
- };
13
- export type StoreEntry = LocalStoreEntry | ApiStoreEntry;
14
- export type NanoAppConfig = {
15
- stores: Record<string, StoreEntry>;
16
- };
17
- /**
18
- * Define la configuración del paquete con tipado completo.
19
- * Usar en nano-app.config.ts en la raíz del proyecto.
20
- */
21
- export declare function defineConfig(config: NanoAppConfig): NanoAppConfig;
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defineConfig = defineConfig;
4
- /**
5
- * Define la configuración del paquete con tipado completo.
6
- * Usar en nano-app.config.ts en la raíz del proyecto.
7
- */
8
- function defineConfig(config) {
9
- return config;
10
- }
@@ -1,8 +0,0 @@
1
- import { Controller } from "../components/Controller";
2
- type useComponentParams<CI> = {
3
- controller: new () => CI;
4
- view: (controller: CI) => React.ReactNode;
5
- };
6
- export type useComponent = <CI extends Controller>(p: useComponentParams<CI>) => (params?: Object) => React.ReactNode;
7
- export declare const useComponent: useComponent;
8
- export {};
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useComponent = void 0;
4
- const react_1 = require("react");
5
- const useComponent = ({ controller, view }) => (params = {}) => {
6
- const c = (0, react_1.useMemo)(() => new controller(), [controller]);
7
- c.render(params);
8
- return (0, react_1.useMemo)(() => view(c), c.deps());
9
- };
10
- exports.useComponent = useComponent;
@@ -1,11 +0,0 @@
1
- type NextConfig = Record<string, any>;
2
- /**
3
- * Envuelve la configuración de Next.js agregando el plugin de nano-app.
4
- * Usar en next.config.ts:
5
- *
6
- * @example
7
- * import { withNanoApp } from "@nano-app/frontend/plugin";
8
- * export default withNanoApp();
9
- */
10
- export declare function withNanoApp(nextConfig?: NextConfig): NextConfig;
11
- export {};