@mapomodule/core 1.0.0 → 2.0.0-beta.2
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.md +46 -0
- package/dist/index.d.mts +13 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +3 -0
- package/dist/module.d.mts +10 -0
- package/dist/module.d.ts +10 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.json +9 -0
- package/dist/module.mjs +73 -0
- package/dist/runtime/__tests__/plugins/00.fetch.spec.d.ts +2 -0
- package/dist/runtime/__tests__/plugins/00.fetch.spec.d.ts.map +1 -0
- package/dist/runtime/api/crud.d.ts +23 -0
- package/dist/runtime/api/crud.d.ts.map +1 -0
- package/dist/runtime/api/crud.js +74 -0
- package/dist/runtime/api/multipart.d.ts +15 -0
- package/dist/runtime/api/multipart.d.ts.map +1 -0
- package/dist/runtime/api/multipart.js +31 -0
- package/dist/runtime/auth/useCanAccessRoute.d.ts +12 -0
- package/dist/runtime/auth/useCanAccessRoute.d.ts.map +1 -0
- package/dist/runtime/auth/useCanAccessRoute.js +28 -0
- package/dist/runtime/auth/useMapoAuth.d.ts +28 -0
- package/dist/runtime/auth/useMapoAuth.d.ts.map +1 -0
- package/dist/runtime/auth/useMapoAuth.js +38 -0
- package/dist/runtime/composables/useMapo.d.ts +48 -0
- package/dist/runtime/composables/useMapo.d.ts.map +1 -0
- package/dist/runtime/composables/useMapo.js +15 -0
- package/dist/runtime/middleware/auth.d.ts +10 -0
- package/dist/runtime/middleware/auth.d.ts.map +1 -0
- package/dist/runtime/middleware/auth.js +15 -0
- package/dist/runtime/middleware/permissions.d.ts +20 -0
- package/dist/runtime/middleware/permissions.d.ts.map +1 -0
- package/dist/runtime/middleware/permissions.js +27 -0
- package/dist/runtime/middleware/roles.d.ts +12 -0
- package/dist/runtime/middleware/roles.d.ts.map +1 -0
- package/dist/runtime/middleware/roles.js +13 -0
- package/dist/runtime/page-meta.nuxt.d.ts +23 -0
- package/dist/runtime/plugins/00.fetch.d.ts +21 -0
- package/dist/runtime/plugins/00.fetch.d.ts.map +1 -0
- package/dist/runtime/plugins/00.fetch.js +57 -0
- package/dist/runtime/plugins/01.init.server.d.ts +14 -0
- package/dist/runtime/plugins/01.init.server.d.ts.map +1 -0
- package/dist/runtime/plugins/01.init.server.js +37 -0
- package/dist/runtime/types.d.ts +62 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +10 -0
- package/dist/runtime/types.nuxt.d.ts +18 -0
- package/dist/runtime/utils/useMapoFetch.d.ts +30 -0
- package/dist/runtime/utils/useMapoFetch.d.ts.map +1 -0
- package/dist/runtime/utils/useMapoFetch.js +8 -0
- package/dist/types.d.mts +13 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +58 -15
- package/src/index.ts +4 -0
- package/src/module.ts +102 -0
- package/src/runtime/__tests__/plugins/00.fetch.spec.ts +144 -0
- package/src/runtime/api/crud.ts +130 -0
- package/src/runtime/api/multipart.ts +78 -0
- package/src/runtime/auth/useCanAccessRoute.ts +48 -0
- package/src/runtime/auth/useMapoAuth.ts +91 -0
- package/src/runtime/composables/useMapo.ts +61 -0
- package/src/runtime/middleware/auth.ts +24 -0
- package/src/runtime/middleware/permissions.ts +52 -0
- package/src/runtime/middleware/roles.ts +23 -0
- package/src/runtime/page-meta.nuxt.d.ts +23 -0
- package/src/runtime/plugins/00.fetch.ts +85 -0
- package/src/runtime/plugins/01.init.server.ts +62 -0
- package/src/runtime/types.nuxt.d.ts +18 -0
- package/src/runtime/types.ts +88 -0
- package/src/runtime/utils/useMapoFetch.ts +41 -0
- package/src/types.ts +13 -0
- package/CHANGELOG.md +0 -248
- package/api/crud.js +0 -141
- package/api/multipart.js +0 -41
- package/index.js +0 -134
- package/interceptor/auth.js +0 -26
- package/interceptor/index.js +0 -5
- package/middleware/auth.js +0 -10
- package/middleware/permissions.js +0 -36
- package/middleware/roles.js +0 -10
- package/module.js +0 -44
- package/templates/options.js +0 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineNuxtRouteMiddleware, createError } from "nuxt/app";
|
|
2
|
+
import { useAuthStore } from "@mapomodule/store/runtime/stores/auth";
|
|
3
|
+
export default defineNuxtRouteMiddleware((to) => {
|
|
4
|
+
const auth = useAuthStore();
|
|
5
|
+
const required = to.meta.roles;
|
|
6
|
+
if (!required?.length) return;
|
|
7
|
+
if (auth.info?.is_superuser) return;
|
|
8
|
+
const userGroups = auth.info?.groups ?? [];
|
|
9
|
+
const hasRole = required.some((r) => userGroups.includes(r));
|
|
10
|
+
if (!hasRole) {
|
|
11
|
+
throw createError({ statusCode: 403, message: "Forbidden" });
|
|
12
|
+
}
|
|
13
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
declare module "#app" {
|
|
2
|
+
interface PageMeta {
|
|
3
|
+
/**
|
|
4
|
+
* Permissions required to access this route. Checked by the 'permissions' middleware and sidebar visibility.
|
|
5
|
+
* - `{ model: string }` — derives `view_<model>` from a Django model name and populates `authStore.pagePermissions`
|
|
6
|
+
* - `string[]` — raw Django permission codenames (e.g. `['view_article', 'change_article']`)
|
|
7
|
+
*/
|
|
8
|
+
permissions?: { model: string } | string[];
|
|
9
|
+
/** Required role/group names. Checked by the 'roles' middleware. */
|
|
10
|
+
roles?: string[];
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare module "vue-router" {
|
|
15
|
+
interface RouteMeta {
|
|
16
|
+
permissions?: { model: string } | string[];
|
|
17
|
+
roles?: string[];
|
|
18
|
+
/** Route middleware names applied to this route. Read by useCanAccessRoute for sidebar visibility. */
|
|
19
|
+
middleware?: string | string[];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registers the global Mapo fetch client and loading state.
|
|
3
|
+
*
|
|
4
|
+
* The plugin provides:
|
|
5
|
+
* - `$mapoFetch`: a shared `$fetch` instance with centralized request/response hooks.
|
|
6
|
+
* - `$mapoFetchLoading`: a computed boolean based on a global pending-request counter.
|
|
7
|
+
*
|
|
8
|
+
* Error handling behavior:
|
|
9
|
+
* - `401` (except logout calls): reset auth state and, on client, redirect to login
|
|
10
|
+
* with the current route encoded in a `redirect` query parameter.
|
|
11
|
+
* - `403`: show a global "Permission denied" error snackbar.
|
|
12
|
+
*/
|
|
13
|
+
declare const _default: import("nuxt/app").Plugin<{
|
|
14
|
+
mapoFetch: import("nitropack/types").$Fetch<unknown, import("nitropack/types").NitroFetchRequest>;
|
|
15
|
+
mapoFetchLoading: import("vue").ComputedRef<boolean>;
|
|
16
|
+
}> & import("nuxt/app").ObjectPlugin<{
|
|
17
|
+
mapoFetch: import("nitropack/types").$Fetch<unknown, import("nitropack/types").NitroFetchRequest>;
|
|
18
|
+
mapoFetchLoading: import("vue").ComputedRef<boolean>;
|
|
19
|
+
}>;
|
|
20
|
+
export default _default;
|
|
21
|
+
//# sourceMappingURL=00.fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"00.fetch.d.ts","sourceRoot":"","sources":["../../../src/runtime/plugins/00.fetch.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;GAWG;;;;;;;;AACH,wBA6DG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ref, computed } from "vue";
|
|
2
|
+
import {
|
|
3
|
+
defineNuxtPlugin,
|
|
4
|
+
navigateTo,
|
|
5
|
+
useRoute,
|
|
6
|
+
useRuntimeConfig
|
|
7
|
+
} from "nuxt/app";
|
|
8
|
+
import { useAuthStore } from "@mapomodule/store/runtime/stores/auth";
|
|
9
|
+
import { useSnackStore } from "@mapomodule/store/runtime/stores/snack";
|
|
10
|
+
export default defineNuxtPlugin({
|
|
11
|
+
name: "mapo-core:fetch",
|
|
12
|
+
enforce: "pre",
|
|
13
|
+
setup() {
|
|
14
|
+
const rc = useRuntimeConfig().public.mapoCore;
|
|
15
|
+
const logoutUrl = rc.logoutUrl;
|
|
16
|
+
const loginUrl = rc.loginUrl;
|
|
17
|
+
let redirectInFlight = false;
|
|
18
|
+
const handle = (status, requestUrl) => {
|
|
19
|
+
if (status === 401 && !requestUrl.includes(logoutUrl) && !redirectInFlight) {
|
|
20
|
+
redirectInFlight = true;
|
|
21
|
+
const auth = useAuthStore();
|
|
22
|
+
auth.reset();
|
|
23
|
+
if (import.meta.client) {
|
|
24
|
+
const route = useRoute();
|
|
25
|
+
navigateTo(
|
|
26
|
+
`${loginUrl}?redirect=${encodeURIComponent(route.fullPath)}`
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (status === 403) {
|
|
31
|
+
useSnackStore().show("Permission denied", "error");
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const pending = ref(0);
|
|
35
|
+
const mapoFetchLoading = computed(() => pending.value > 0);
|
|
36
|
+
const mapoFetch = $fetch.create({
|
|
37
|
+
onRequest() {
|
|
38
|
+
pending.value++;
|
|
39
|
+
},
|
|
40
|
+
onResponse({ response, request }) {
|
|
41
|
+
pending.value--;
|
|
42
|
+
handle(response.status, String(request));
|
|
43
|
+
},
|
|
44
|
+
onResponseError({ response, request, error }) {
|
|
45
|
+
pending.value--;
|
|
46
|
+
handle(response?.status ?? 0, String(request));
|
|
47
|
+
return Promise.reject(error);
|
|
48
|
+
},
|
|
49
|
+
onRequestError() {
|
|
50
|
+
pending.value--;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
provide: { mapoFetch, mapoFetchLoading }
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performs server-side bootstrap of Mapo runtime stores.
|
|
3
|
+
*
|
|
4
|
+
* On each SSR request, this plugin:
|
|
5
|
+
* - Activates the request Pinia instance and initializes auth/sidebar stores.
|
|
6
|
+
* - Restores sidebar UI state from cookies.
|
|
7
|
+
* - If the HttpOnly session cookie is present, calls the configured `userInfoApi`
|
|
8
|
+
* (forwarding request cookies) to restore the authenticated user in the auth store.
|
|
9
|
+
*
|
|
10
|
+
* On session restore failure, it resets auth state and clears the session cookie.
|
|
11
|
+
*/
|
|
12
|
+
declare const _default: import("nuxt/app").Plugin<Record<string, unknown>> & import("nuxt/app").ObjectPlugin<Record<string, unknown>>;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=01.init.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"01.init.server.d.ts","sourceRoot":"","sources":["../../../src/runtime/plugins/01.init.server.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;GAUG;;AACH,wBAmCG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineNuxtPlugin,
|
|
3
|
+
useRuntimeConfig,
|
|
4
|
+
useCookie,
|
|
5
|
+
useRequestHeaders,
|
|
6
|
+
useRequestURL
|
|
7
|
+
} from "nuxt/app";
|
|
8
|
+
import { setActivePinia } from "pinia";
|
|
9
|
+
import { useAuthStore } from "@mapomodule/store/runtime/stores/auth";
|
|
10
|
+
import { useSidebarStore } from "@mapomodule/store/runtime/stores/sidebar";
|
|
11
|
+
import { CoreCookieEnum } from "../types.js";
|
|
12
|
+
export default defineNuxtPlugin({
|
|
13
|
+
name: "mapo-core:init",
|
|
14
|
+
async setup(nuxtApp) {
|
|
15
|
+
const runtimeConfig = useRuntimeConfig().public.mapoCore;
|
|
16
|
+
const userInfoApi = runtimeConfig?.userInfoApi ?? "/api/profiles/me/";
|
|
17
|
+
const pinia = nuxtApp.$pinia;
|
|
18
|
+
setActivePinia(pinia);
|
|
19
|
+
const authStore = useAuthStore(pinia);
|
|
20
|
+
const sidebarStore = useSidebarStore(pinia);
|
|
21
|
+
sidebarStore.hydrateFromCookies();
|
|
22
|
+
const sessionCookie = useCookie(CoreCookieEnum.Session);
|
|
23
|
+
if (!sessionCookie.value) return;
|
|
24
|
+
try {
|
|
25
|
+
const headers = useRequestHeaders(["cookie"]);
|
|
26
|
+
const url = useRequestURL();
|
|
27
|
+
const absolute = `${url.protocol}//${url.host}${userInfoApi}`;
|
|
28
|
+
const user = await nuxtApp.$mapoFetch(absolute, { method: "GET", headers });
|
|
29
|
+
authStore.setUser(user);
|
|
30
|
+
} catch (e) {
|
|
31
|
+
console.error(`[mapo] Cannot restore session from cookie:
|
|
32
|
+
${e}`);
|
|
33
|
+
authStore.reset();
|
|
34
|
+
sessionCookie.value = null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export declare enum MultipartPolicyEnum {
|
|
2
|
+
Auto = "auto",
|
|
3
|
+
Force = "force",
|
|
4
|
+
Disable = "disable"
|
|
5
|
+
}
|
|
6
|
+
export type MultipartPolicy = `${MultipartPolicyEnum}`;
|
|
7
|
+
export declare enum CoreCookieEnum {
|
|
8
|
+
Session = "__mapo_session"
|
|
9
|
+
}
|
|
10
|
+
export interface ListParams {
|
|
11
|
+
page?: number;
|
|
12
|
+
limit?: number;
|
|
13
|
+
search?: string;
|
|
14
|
+
ordering?: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface PaginatedResponse<T> {
|
|
18
|
+
results: T[];
|
|
19
|
+
count: number;
|
|
20
|
+
next?: string | null;
|
|
21
|
+
previous?: string | null;
|
|
22
|
+
}
|
|
23
|
+
export type ApiResponse<T> = T;
|
|
24
|
+
export interface CrudConfig {
|
|
25
|
+
baseURL?: string;
|
|
26
|
+
headers?: Record<string, string>;
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
export interface CrudOptions {
|
|
30
|
+
multipart?: MultipartPolicy;
|
|
31
|
+
}
|
|
32
|
+
export interface CrudRepository<T> {
|
|
33
|
+
list(params?: ListParams, config?: CrudConfig): Promise<PaginatedResponse<T>>;
|
|
34
|
+
detail(id: string | number, config?: CrudConfig): Promise<T>;
|
|
35
|
+
create(data: Partial<T>, config?: CrudConfig, opts?: CrudOptions): Promise<T>;
|
|
36
|
+
update(id: string | number, data: Partial<T>, config?: CrudConfig, opts?: CrudOptions): Promise<T>;
|
|
37
|
+
partialUpdate(id: string | number, diff: Partial<T>, config?: CrudConfig, opts?: CrudOptions): Promise<T>;
|
|
38
|
+
delete(id: string | number, config?: CrudConfig): Promise<void>;
|
|
39
|
+
updateOrCreate(data: Partial<T> & {
|
|
40
|
+
id?: string | number;
|
|
41
|
+
}, config?: CrudConfig, opts?: CrudOptions): Promise<T>;
|
|
42
|
+
updateOrder(startId: string | number, endId: string | number, config?: CrudConfig): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
export interface Credentials {
|
|
45
|
+
username: string;
|
|
46
|
+
password: string;
|
|
47
|
+
}
|
|
48
|
+
export interface AuthToken {
|
|
49
|
+
token: string;
|
|
50
|
+
[key: string]: unknown;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Shape of `runtimeConfig.public.mapoCore` as written by the module setup.
|
|
54
|
+
* All entries are guaranteed by the module `defaults`.
|
|
55
|
+
*/
|
|
56
|
+
export interface MapoCoreRuntimeConfig {
|
|
57
|
+
authLoginUrl: string;
|
|
58
|
+
userInfoApi: string;
|
|
59
|
+
logoutUrl: string;
|
|
60
|
+
loginUrl: string;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export var MultipartPolicyEnum = /* @__PURE__ */ ((MultipartPolicyEnum2) => {
|
|
2
|
+
MultipartPolicyEnum2["Auto"] = "auto";
|
|
3
|
+
MultipartPolicyEnum2["Force"] = "force";
|
|
4
|
+
MultipartPolicyEnum2["Disable"] = "disable";
|
|
5
|
+
return MultipartPolicyEnum2;
|
|
6
|
+
})(MultipartPolicyEnum || {});
|
|
7
|
+
export var CoreCookieEnum = /* @__PURE__ */ ((CoreCookieEnum2) => {
|
|
8
|
+
CoreCookieEnum2["Session"] = "__mapo_session";
|
|
9
|
+
return CoreCookieEnum2;
|
|
10
|
+
})(CoreCookieEnum || {});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { $Fetch } from "ofetch";
|
|
2
|
+
|
|
3
|
+
declare module "nuxt/app" {
|
|
4
|
+
interface NuxtApp {
|
|
5
|
+
$mapoFetch: $Fetch;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
declare module "vue-router" {
|
|
10
|
+
interface RouteMeta {
|
|
11
|
+
permissions?: { model: string } | string[];
|
|
12
|
+
roles?: string[];
|
|
13
|
+
/** Route middleware names applied to this route. Read by useCanAccessRoute for sidebar visibility. */
|
|
14
|
+
middleware?: string | string[];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { $Fetch } from "ofetch";
|
|
2
|
+
import type { ComputedRef } from "vue";
|
|
3
|
+
export interface UseMapoFetchReturn {
|
|
4
|
+
/** The auth-aware `$mapoFetch` instance (same one provided by the plugin). */
|
|
5
|
+
fetch: $Fetch;
|
|
6
|
+
/**
|
|
7
|
+
* `true` while at least one `$mapoFetch` request is in flight — globally,
|
|
8
|
+
* across the entire app. Incremented by the plugin-level `onRequest` hook
|
|
9
|
+
* and decremented by `onResponse` / `onResponseError`, so it stays accurate
|
|
10
|
+
* even for raw `useNuxtApp().$mapoFetch` calls outside this composable.
|
|
11
|
+
*/
|
|
12
|
+
loading: ComputedRef<boolean>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Returns the global `$mapoFetch` instance together with a centralized
|
|
16
|
+
* `loading` indicator that tracks **all** in-flight `$mapoFetch` requests,
|
|
17
|
+
* not just the ones made through this composable.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const { fetch, loading } = useMapoFetch()
|
|
22
|
+
* await fetch('/api/articles/', { method: 'POST', body: payload })
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* ```vue
|
|
26
|
+
* <UButton :loading="loading" @click="submit">Save</UButton>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function useMapoFetch(): UseMapoFetchReturn;
|
|
30
|
+
//# sourceMappingURL=useMapoFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMapoFetch.d.ts","sourceRoot":"","sources":["../../../src/runtime/utils/useMapoFetch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,IAAI,kBAAkB,CASjD"}
|
package/dist/types.d.mts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { NuxtModule } from '@nuxt/schema'
|
|
2
|
+
|
|
3
|
+
import type { default as Module } from './module.mjs'
|
|
4
|
+
|
|
5
|
+
export type ModuleOptions = typeof Module extends NuxtModule<infer O> ? Partial<O> : Record<string, any>
|
|
6
|
+
|
|
7
|
+
export { type ApiResponse, type AuthToken, type CoreCookieEnum, type Credentials, type CrudConfig, type CrudOptions, type CrudRepository, type ListParams, type MultipartPolicy, type MultipartPolicyEnum, type PaginatedResponse } from '../dist/runtime/types.js'
|
|
8
|
+
|
|
9
|
+
export { type MapoApiLayer, type MapoFacade } from '../dist/runtime/composables/useMapo.js'
|
|
10
|
+
|
|
11
|
+
export { type RoutePermissions } from '../dist/runtime/auth/useCanAccessRoute.js'
|
|
12
|
+
|
|
13
|
+
export { type MapoOptions, default } from './module.mjs'
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface MapoOptions {
|
|
2
|
+
authLoginUrl?: string;
|
|
3
|
+
userInfoApi?: string;
|
|
4
|
+
logoutUrl?: string;
|
|
5
|
+
loginUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const MAPO_DEFAULTS: {
|
|
8
|
+
authLoginUrl: string;
|
|
9
|
+
userInfoApi: string;
|
|
10
|
+
logoutUrl: string;
|
|
11
|
+
loginUrl: string;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,aAAa;;;;;CAKO,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,22 +1,65 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mapomodule/core",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"keywords": [
|
|
7
|
-
"mapo",
|
|
8
|
-
"nuxt",
|
|
9
|
-
"Admin",
|
|
10
|
-
"Panel"
|
|
11
|
-
],
|
|
3
|
+
"version": "2.0.0-beta.2",
|
|
4
|
+
"description": "Mapo core: API layer, auth, composables, middleware",
|
|
5
|
+
"type": "module",
|
|
12
6
|
"license": "MIT",
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
7
|
+
"author": "Lotrek Agency (https://lotrek.it)",
|
|
8
|
+
"homepage": "https://lotrekagency.github.io/mapo-new/",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/lotrekagency/mapo-new.git",
|
|
12
|
+
"directory": "packages/@mapomodule/core"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/lotrekagency/mapo-new/issues"
|
|
17
16
|
},
|
|
18
17
|
"publishConfig": {
|
|
19
|
-
"access": "public"
|
|
18
|
+
"access": "public",
|
|
19
|
+
"tag": "next"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/module.d.mts",
|
|
24
|
+
"import": "./dist/module.mjs"
|
|
25
|
+
},
|
|
26
|
+
"./types": {
|
|
27
|
+
"types": "./dist/index.d.mts",
|
|
28
|
+
"import": "./dist/index.mjs"
|
|
29
|
+
},
|
|
30
|
+
"./runtime/*": {
|
|
31
|
+
"types": "./src/runtime/*.ts",
|
|
32
|
+
"import": "./dist/runtime/*.js",
|
|
33
|
+
"default": "./src/runtime/*"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"src"
|
|
39
|
+
],
|
|
40
|
+
"scripts": {
|
|
41
|
+
"dev": "nuxt-module-build build --stub --watch",
|
|
42
|
+
"build": "nuxt-module-build build && tsc -p tsconfig.build-types.json",
|
|
43
|
+
"prepack": "pnpm build",
|
|
44
|
+
"dev:prepare": "nuxt-module-build build --stub",
|
|
45
|
+
"typecheck": "tsc --noEmit",
|
|
46
|
+
"lint": "eslint src"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@mapomodule/store": "2.0.0-beta.2",
|
|
50
|
+
"@mapomodule/utils": "2.0.0-beta.1"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"nuxt": ">=4.0.0"
|
|
20
54
|
},
|
|
21
|
-
"
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@nuxt/kit": "4.4.2",
|
|
57
|
+
"@nuxt/module-builder": "^1.0.2",
|
|
58
|
+
"@nuxt/schema": "4.4.2",
|
|
59
|
+
"nuxt": "^4.4.2",
|
|
60
|
+
"ofetch": "^1.5.1",
|
|
61
|
+
"pinia": "^3.0.4",
|
|
62
|
+
"vue": "^3.5.32",
|
|
63
|
+
"vue-router": "^5.0.4"
|
|
64
|
+
}
|
|
22
65
|
}
|
package/src/index.ts
ADDED
package/src/module.ts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import {
|
|
3
|
+
defineNuxtModule,
|
|
4
|
+
addImports,
|
|
5
|
+
addPlugin,
|
|
6
|
+
addRouteMiddleware,
|
|
7
|
+
addTypeTemplate,
|
|
8
|
+
hasNuxtModule,
|
|
9
|
+
installModule,
|
|
10
|
+
createResolver,
|
|
11
|
+
} from "@nuxt/kit";
|
|
12
|
+
import type { NuxtModule } from "@nuxt/schema";
|
|
13
|
+
import { MAPO_DEFAULTS } from "./types";
|
|
14
|
+
import type { MapoOptions } from "./types";
|
|
15
|
+
|
|
16
|
+
export type { MapoOptions } from "./types";
|
|
17
|
+
export type {
|
|
18
|
+
ListParams,
|
|
19
|
+
PaginatedResponse,
|
|
20
|
+
ApiResponse,
|
|
21
|
+
CrudConfig,
|
|
22
|
+
CrudOptions,
|
|
23
|
+
CrudRepository,
|
|
24
|
+
MultipartPolicy,
|
|
25
|
+
Credentials,
|
|
26
|
+
AuthToken,
|
|
27
|
+
} from "./runtime/types";
|
|
28
|
+
export { MultipartPolicyEnum, CoreCookieEnum } from "./runtime/types";
|
|
29
|
+
export type { MapoFacade, MapoApiLayer } from "./runtime/composables/useMapo";
|
|
30
|
+
export type { RoutePermissions } from "./runtime/auth/useCanAccessRoute";
|
|
31
|
+
|
|
32
|
+
export default defineNuxtModule<MapoOptions>({
|
|
33
|
+
meta: {
|
|
34
|
+
name: "@mapomodule/core",
|
|
35
|
+
configKey: "mapoCore",
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
defaults: MAPO_DEFAULTS,
|
|
39
|
+
|
|
40
|
+
async setup(options, nuxt) {
|
|
41
|
+
const resolver = createResolver(import.meta.url);
|
|
42
|
+
|
|
43
|
+
addTypeTemplate({
|
|
44
|
+
filename: "types/mapo-core-page-meta.d.ts",
|
|
45
|
+
getContents: () =>
|
|
46
|
+
readFileSync(
|
|
47
|
+
resolver.resolve("./runtime/page-meta.nuxt.d.ts"),
|
|
48
|
+
"utf-8",
|
|
49
|
+
),
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
if (!hasNuxtModule("@mapomodule/store")) {
|
|
53
|
+
await installModule("@mapomodule/store");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// `defaults` guarantees these are set at runtime, but MapoOptions keeps
|
|
57
|
+
// them optional — spread the defaults so the assignment is fully defined.
|
|
58
|
+
nuxt.options.runtimeConfig.public.mapoCore = {
|
|
59
|
+
...MAPO_DEFAULTS,
|
|
60
|
+
...options,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
addPlugin({ src: resolver.resolve("./runtime/plugins/00.fetch") });
|
|
64
|
+
addPlugin({
|
|
65
|
+
src: resolver.resolve("./runtime/plugins/01.init.server"),
|
|
66
|
+
mode: "server",
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
addImports([
|
|
70
|
+
{ name: "useCrud", from: resolver.resolve("./runtime/api/crud") },
|
|
71
|
+
{
|
|
72
|
+
name: "useMapoAuth",
|
|
73
|
+
from: resolver.resolve("./runtime/auth/useMapoAuth"),
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "useMapo",
|
|
77
|
+
from: resolver.resolve("./runtime/composables/useMapo"),
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "useCanAccessRoute",
|
|
81
|
+
from: resolver.resolve("./runtime/auth/useCanAccessRoute"),
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: "useMapoFetch",
|
|
85
|
+
from: resolver.resolve("./runtime/utils/useMapoFetch"),
|
|
86
|
+
},
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
addRouteMiddleware({
|
|
90
|
+
name: "auth",
|
|
91
|
+
path: resolver.resolve("./runtime/middleware/auth"),
|
|
92
|
+
});
|
|
93
|
+
addRouteMiddleware({
|
|
94
|
+
name: "permissions",
|
|
95
|
+
path: resolver.resolve("./runtime/middleware/permissions"),
|
|
96
|
+
});
|
|
97
|
+
addRouteMiddleware({
|
|
98
|
+
name: "roles",
|
|
99
|
+
path: resolver.resolve("./runtime/middleware/roles"),
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
}) satisfies NuxtModule<MapoOptions>;
|