@shamar/adonis 0.1.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/assets/admin.css +2 -0
- package/assets/alpine.min.js +5 -0
- package/assets/input.css +2286 -0
- package/assets/shamar-ui.js +3658 -0
- package/dist/assets-controller.d.ts +12 -0
- package/dist/assets-controller.d.ts.map +1 -0
- package/dist/assets-controller.js +32 -0
- package/dist/assets-controller.js.map +1 -0
- package/dist/config.d.ts +79 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -0
- package/dist/configure.d.ts +21 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +20 -0
- package/dist/configure.js.map +1 -0
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/controller.d.ts +31 -0
- package/dist/controller.d.ts.map +1 -0
- package/dist/controller.js +45 -0
- package/dist/controller.js.map +1 -0
- package/dist/controllers/admin_controller.d.ts +72 -0
- package/dist/controllers/admin_controller.d.ts.map +1 -0
- package/dist/controllers/admin_controller.js +1075 -0
- package/dist/controllers/admin_controller.js.map +1 -0
- package/dist/discover.d.ts +7 -0
- package/dist/discover.d.ts.map +1 -0
- package/dist/discover.js +50 -0
- package/dist/discover.js.map +1 -0
- package/dist/form-state.d.ts +41 -0
- package/dist/form-state.d.ts.map +1 -0
- package/dist/form-state.js +74 -0
- package/dist/form-state.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/require_api_key_middleware.d.ts +30 -0
- package/dist/middleware/require_api_key_middleware.d.ts.map +1 -0
- package/dist/middleware/require_api_key_middleware.js +59 -0
- package/dist/middleware/require_api_key_middleware.js.map +1 -0
- package/dist/provider.d.ts +9 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +66 -0
- package/dist/provider.js.map +1 -0
- package/dist/resources/api_key_resource.d.ts +35 -0
- package/dist/resources/api_key_resource.d.ts.map +1 -0
- package/dist/resources/api_key_resource.js +225 -0
- package/dist/resources/api_key_resource.js.map +1 -0
- package/dist/routes.d.ts +5 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +97 -0
- package/dist/routes.js.map +1 -0
- package/dist/runtime.d.ts +27 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +74 -0
- package/dist/runtime.js.map +1 -0
- package/dist/shamar/auth.d.ts +30 -0
- package/dist/shamar/auth.d.ts.map +1 -0
- package/dist/shamar/auth.js +218 -0
- package/dist/shamar/auth.js.map +1 -0
- package/dist/shamar/branding.d.ts +24 -0
- package/dist/shamar/branding.d.ts.map +1 -0
- package/dist/shamar/branding.js +91 -0
- package/dist/shamar/branding.js.map +1 -0
- package/dist/shamar/display-relations.d.ts +7 -0
- package/dist/shamar/display-relations.d.ts.map +1 -0
- package/dist/shamar/display-relations.js +89 -0
- package/dist/shamar/display-relations.js.map +1 -0
- package/dist/shamar/list-headers.d.ts +38 -0
- package/dist/shamar/list-headers.d.ts.map +1 -0
- package/dist/shamar/list-headers.js +218 -0
- package/dist/shamar/list-headers.js.map +1 -0
- package/dist/shamar/list-query.d.ts +229 -0
- package/dist/shamar/list-query.d.ts.map +1 -0
- package/dist/shamar/list-query.js +564 -0
- package/dist/shamar/list-query.js.map +1 -0
- package/dist/shamar/menu.d.ts +48 -0
- package/dist/shamar/menu.d.ts.map +1 -0
- package/dist/shamar/menu.js +93 -0
- package/dist/shamar/menu.js.map +1 -0
- package/dist/shamar/paths.d.ts +5 -0
- package/dist/shamar/paths.d.ts.map +1 -0
- package/dist/shamar/paths.js +16 -0
- package/dist/shamar/paths.js.map +1 -0
- package/dist/shamar/relation-fields.d.ts +54 -0
- package/dist/shamar/relation-fields.d.ts.map +1 -0
- package/dist/shamar/relation-fields.js +94 -0
- package/dist/shamar/relation-fields.js.map +1 -0
- package/dist/shamar/resource-actions.d.ts +9 -0
- package/dist/shamar/resource-actions.d.ts.map +1 -0
- package/dist/shamar/resource-actions.js +42 -0
- package/dist/shamar/resource-actions.js.map +1 -0
- package/dist/shamar/view-context.d.ts +79 -0
- package/dist/shamar/view-context.d.ts.map +1 -0
- package/dist/shamar/view-context.js +74 -0
- package/dist/shamar/view-context.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +67 -0
- package/resources/views/shamar/dashboard.edge +24 -0
- package/resources/views/shamar/form.edge +87 -0
- package/resources/views/shamar/index.edge +149 -0
- package/resources/views/shamar/partials/boolean-value.edge +25 -0
- package/resources/views/shamar/partials/csrf.edge +1 -0
- package/resources/views/shamar/partials/detail-entry.edge +72 -0
- package/resources/views/shamar/partials/dialog-host.edge +125 -0
- package/resources/views/shamar/partials/field-affix-icon.edge +23 -0
- package/resources/views/shamar/partials/field-input.edge +585 -0
- package/resources/views/shamar/partials/field-relation-checkbox.edge +104 -0
- package/resources/views/shamar/partials/field-relation-m2m.edge +110 -0
- package/resources/views/shamar/partials/field-relation-m2o.edge +116 -0
- package/resources/views/shamar/partials/field-relation-table.edge +139 -0
- package/resources/views/shamar/partials/form-container.edge +82 -0
- package/resources/views/shamar/partials/icon.edge +14 -0
- package/resources/views/shamar/partials/list-row.edge +73 -0
- package/resources/views/shamar/partials/list-toolbar.edge +269 -0
- package/resources/views/shamar/partials/nav-mobile.edge +21 -0
- package/resources/views/shamar/partials/nav.edge +58 -0
- package/resources/views/shamar/partials/page-heading.edge +130 -0
- package/resources/views/shamar/partials/pagination.edge +73 -0
- package/resources/views/shamar/partials/record-pager.edge +37 -0
- package/resources/views/shamar/partials/schema-node.edge +289 -0
- package/resources/views/shamar/partials/shell-close.edge +20 -0
- package/resources/views/shamar/partials/shell-open.edge +51 -0
- package/resources/views/shamar/partials/toast.edge +5 -0
- package/resources/views/shamar/partials/topbar.edge +115 -0
- package/resources/views/shamar/show.edge +17 -0
- package/stubs/config/shamar.stub +29 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const GROUP_ICONS = {
|
|
2
|
+
Administration: 'cog',
|
|
3
|
+
General: 'squares-2x2',
|
|
4
|
+
CRM: 'users',
|
|
5
|
+
Settings: 'cog',
|
|
6
|
+
};
|
|
7
|
+
function compareNavigationItems(a, b) {
|
|
8
|
+
const sortA = a.navigationSort ?? Number.POSITIVE_INFINITY;
|
|
9
|
+
const sortB = b.navigationSort ?? Number.POSITIVE_INFINITY;
|
|
10
|
+
if (sortA !== sortB)
|
|
11
|
+
return sortA - sortB;
|
|
12
|
+
return a.label.localeCompare(b.label);
|
|
13
|
+
}
|
|
14
|
+
function firstGroupHref(group, basePath) {
|
|
15
|
+
const sorted = [...group.items].sort(compareNavigationItems);
|
|
16
|
+
return `${basePath}/${sorted[0]?.slug ?? ''}`;
|
|
17
|
+
}
|
|
18
|
+
export function menuLayoutContext(groups, basePath, currentSlug, pageTitle, record) {
|
|
19
|
+
const menuRoots = [
|
|
20
|
+
{
|
|
21
|
+
label: 'Dashboard',
|
|
22
|
+
icon: 'home',
|
|
23
|
+
href: basePath,
|
|
24
|
+
rootIndex: 0,
|
|
25
|
+
active: !currentSlug,
|
|
26
|
+
},
|
|
27
|
+
...groups.map((group, index) => {
|
|
28
|
+
const href = firstGroupHref(group, basePath);
|
|
29
|
+
const active = Boolean(currentSlug && group.items.some((item) => item.slug === currentSlug));
|
|
30
|
+
return {
|
|
31
|
+
label: group.name,
|
|
32
|
+
icon: group.icon ?? GROUP_ICONS[group.name] ?? 'squares-2x2',
|
|
33
|
+
href,
|
|
34
|
+
rootIndex: index + 1,
|
|
35
|
+
active,
|
|
36
|
+
};
|
|
37
|
+
}),
|
|
38
|
+
];
|
|
39
|
+
const menuActiveRootIndex = currentSlug
|
|
40
|
+
? (menuRoots.find((root) => root.active)?.rootIndex ?? null)
|
|
41
|
+
: 0;
|
|
42
|
+
const menuActiveRoot = menuActiveRootIndex !== null
|
|
43
|
+
? (menuRoots.find((root) => root.rootIndex === menuActiveRootIndex) ?? null)
|
|
44
|
+
: null;
|
|
45
|
+
const activeGroup = currentSlug
|
|
46
|
+
? groups.find((group) => group.items.some((item) => item.slug === currentSlug))
|
|
47
|
+
: undefined;
|
|
48
|
+
const menuSecondary = activeGroup
|
|
49
|
+
? activeGroup.items.sort(compareNavigationItems).map((item) => ({
|
|
50
|
+
label: item.label,
|
|
51
|
+
href: `${basePath}/${item.slug}`,
|
|
52
|
+
active: item.slug === currentSlug,
|
|
53
|
+
icon: item.icon,
|
|
54
|
+
}))
|
|
55
|
+
: [];
|
|
56
|
+
const breadcrumbs = [{ label: 'Home', href: basePath }];
|
|
57
|
+
if (menuActiveRoot && menuActiveRoot.label !== 'Dashboard') {
|
|
58
|
+
breadcrumbs.push({ label: menuActiveRoot.label, href: menuActiveRoot.href });
|
|
59
|
+
}
|
|
60
|
+
if (currentSlug && activeGroup) {
|
|
61
|
+
const resource = activeGroup.items.find((item) => item.slug === currentSlug);
|
|
62
|
+
if (resource) {
|
|
63
|
+
breadcrumbs.push({ label: resource.label, href: `${basePath}/${resource.slug}` });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const mode = record?.mode;
|
|
67
|
+
const recordTitle = record?.recordTitle?.trim();
|
|
68
|
+
const recordHref = record?.recordHref;
|
|
69
|
+
if (mode === 'create') {
|
|
70
|
+
breadcrumbs.push({ label: pageTitle || 'New' });
|
|
71
|
+
}
|
|
72
|
+
else if (mode === 'edit' && recordTitle) {
|
|
73
|
+
breadcrumbs.push({
|
|
74
|
+
label: recordTitle,
|
|
75
|
+
href: recordHref,
|
|
76
|
+
});
|
|
77
|
+
breadcrumbs.push({ label: 'Edit' });
|
|
78
|
+
}
|
|
79
|
+
else if (mode === 'show' && recordTitle) {
|
|
80
|
+
breadcrumbs.push({ label: recordTitle });
|
|
81
|
+
}
|
|
82
|
+
else if (pageTitle && breadcrumbs[breadcrumbs.length - 1]?.label !== pageTitle) {
|
|
83
|
+
breadcrumbs.push({ label: pageTitle });
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
menuRoots,
|
|
87
|
+
menuActiveRoot,
|
|
88
|
+
menuActiveRootIndex,
|
|
89
|
+
menuSecondary,
|
|
90
|
+
breadcrumbs,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/shamar/menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/shamar/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { dirname, join } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '../..');
|
|
4
|
+
export function shamarAssetsDir() {
|
|
5
|
+
return join(packageRoot, 'assets');
|
|
6
|
+
}
|
|
7
|
+
export function shamarAdminCssPath() {
|
|
8
|
+
return join(shamarAssetsDir(), 'admin.css');
|
|
9
|
+
}
|
|
10
|
+
export function shamarAlpineJsPath() {
|
|
11
|
+
return join(shamarAssetsDir(), 'alpine.min.js');
|
|
12
|
+
}
|
|
13
|
+
export function shamarUiJsPath() {
|
|
14
|
+
return join(shamarAssetsDir(), 'shamar-ui.js');
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/shamar/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAE3E,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,eAAe,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,cAAc,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { FieldConfig, RelationConfig, RelationSearchResult, ResourceMeta, ResourceRegistry } from '@shamar/core';
|
|
2
|
+
import { relationTitleAttribute } from '@shamar/core';
|
|
3
|
+
export interface RelationUiConfig {
|
|
4
|
+
name: string;
|
|
5
|
+
relatedResource: string;
|
|
6
|
+
singularLabel: string;
|
|
7
|
+
searchUrl: string;
|
|
8
|
+
quickCreateUrl: string | null;
|
|
9
|
+
createUrl: string | null;
|
|
10
|
+
detailUrlBase: string;
|
|
11
|
+
attachUrl?: string | null;
|
|
12
|
+
detachUrl?: string | null;
|
|
13
|
+
readonly: boolean;
|
|
14
|
+
required: boolean;
|
|
15
|
+
kind: RelationConfig['kind'];
|
|
16
|
+
widget: NonNullable<RelationConfig['widget']>;
|
|
17
|
+
foreignKey?: string;
|
|
18
|
+
parentId?: string | null;
|
|
19
|
+
/** BelongsTo */
|
|
20
|
+
initialId?: string | null;
|
|
21
|
+
initialLabel?: string;
|
|
22
|
+
/** M2M / HasMany */
|
|
23
|
+
initialItems?: RelationSearchResult[];
|
|
24
|
+
/** Preloaded options for radio / checkbox list */
|
|
25
|
+
options?: RelationSearchResult[];
|
|
26
|
+
checkboxColumns?: number;
|
|
27
|
+
checkboxFramed?: boolean;
|
|
28
|
+
cascadeWildcards?: boolean;
|
|
29
|
+
groupBy?: string;
|
|
30
|
+
/** Attribute used as dehydrated form values (default `id`). */
|
|
31
|
+
valueAttribute?: string;
|
|
32
|
+
/** True when hasMany on create — show empty state until parent is saved */
|
|
33
|
+
requiresParent?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare function isRelationField(field: FieldConfig): boolean;
|
|
36
|
+
export declare function relationWidget(field: FieldConfig): NonNullable<RelationConfig['widget']>;
|
|
37
|
+
/**
|
|
38
|
+
* Build Alpine `data-shamar-m2o/m2m-config` payload for a relation field.
|
|
39
|
+
*/
|
|
40
|
+
export declare function buildRelationUiConfig(options: {
|
|
41
|
+
field: FieldConfig;
|
|
42
|
+
parentMeta: ResourceMeta;
|
|
43
|
+
relatedMeta: ResourceMeta;
|
|
44
|
+
basePath: string;
|
|
45
|
+
record: Record<string, unknown> | null;
|
|
46
|
+
initialItems?: RelationSearchResult[];
|
|
47
|
+
preloadedOptions?: RelationSearchResult[];
|
|
48
|
+
operation: 'create' | 'edit' | 'show';
|
|
49
|
+
}): RelationUiConfig;
|
|
50
|
+
export declare function resolveRelatedMeta(registry: ResourceRegistry, relation: RelationConfig): ResourceMeta;
|
|
51
|
+
export declare function collectRelationIds(field: FieldConfig, record: Record<string, unknown> | null): string[];
|
|
52
|
+
export declare function recordSummaryLabel(meta: ResourceMeta, record: Record<string, unknown>, titleAttribute?: string): string;
|
|
53
|
+
export { relationTitleAttribute };
|
|
54
|
+
//# sourceMappingURL=relation-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-fields.d.ts","sourceRoot":"","sources":["../../src/shamar/relation-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACtC,kDAAkD;IAClD,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAExF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,YAAY,CAAC;IACzB,WAAW,EAAE,YAAY,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACtC,gBAAgB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC1C,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;CACvC,GAAG,gBAAgB,CA+DnB;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,cAAc,GACvB,YAAY,CAEd;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACrC,MAAM,EAAE,CAUV;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CASR;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { relationTitleAttribute } from '@shamar/core';
|
|
2
|
+
export function isRelationField(field) {
|
|
3
|
+
return field.relation != null;
|
|
4
|
+
}
|
|
5
|
+
export function relationWidget(field) {
|
|
6
|
+
return field.relation?.widget ?? (field.multiple ? 'combobox' : 'combobox');
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Build Alpine `data-shamar-m2o/m2m-config` payload for a relation field.
|
|
10
|
+
*/
|
|
11
|
+
export function buildRelationUiConfig(options) {
|
|
12
|
+
const { field, parentMeta, relatedMeta, basePath, record, operation } = options;
|
|
13
|
+
const relation = field.relation;
|
|
14
|
+
const widget = relation.widget ?? 'combobox';
|
|
15
|
+
const parentId = record?.id != null ? String(record.id) : null;
|
|
16
|
+
const searchParams = new URLSearchParams({ field: field.name });
|
|
17
|
+
// Do not scope search by parent — Add/search should find all related records.
|
|
18
|
+
// Linked rows are provided via `initialItems` from a scoped adapter.search.
|
|
19
|
+
const searchUrl = `${basePath}/${parentMeta.slug}/relation-search?${searchParams.toString()}`;
|
|
20
|
+
const quickCreateUrl = relation.createOption
|
|
21
|
+
? `${basePath}/${parentMeta.slug}/relation-quick-create`
|
|
22
|
+
: null;
|
|
23
|
+
const attachUrl = relation.kind === 'hasMany'
|
|
24
|
+
? `${basePath}/${parentMeta.slug}/relation-attach`
|
|
25
|
+
: null;
|
|
26
|
+
const detachUrl = relation.kind === 'hasMany'
|
|
27
|
+
? `${basePath}/${parentMeta.slug}/relation-detach`
|
|
28
|
+
: null;
|
|
29
|
+
let createUrl = null;
|
|
30
|
+
if (relation.createAndEditOption) {
|
|
31
|
+
createUrl = `${basePath}/${relatedMeta.slug}/create`;
|
|
32
|
+
if (relation.kind === 'hasMany' && relation.foreignKey && parentId) {
|
|
33
|
+
createUrl += `?${encodeURIComponent(relation.foreignKey)}=${encodeURIComponent(parentId)}`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const initialItems = options.initialItems ?? [];
|
|
37
|
+
const first = initialItems[0];
|
|
38
|
+
return {
|
|
39
|
+
name: field.name,
|
|
40
|
+
relatedResource: relatedMeta.slug,
|
|
41
|
+
singularLabel: relatedMeta.singularLabel,
|
|
42
|
+
searchUrl,
|
|
43
|
+
quickCreateUrl,
|
|
44
|
+
createUrl,
|
|
45
|
+
detailUrlBase: `${basePath}/${relatedMeta.slug}`,
|
|
46
|
+
attachUrl,
|
|
47
|
+
detachUrl,
|
|
48
|
+
readonly: options.operation === 'show' || !!field.readonly,
|
|
49
|
+
required: !!field.required,
|
|
50
|
+
kind: relation.kind,
|
|
51
|
+
widget,
|
|
52
|
+
foreignKey: relation.foreignKey,
|
|
53
|
+
parentId,
|
|
54
|
+
initialId: relation.kind === 'belongsTo'
|
|
55
|
+
? first?.id ?? (record?.[field.name] != null ? String(record[field.name]) : null)
|
|
56
|
+
: null,
|
|
57
|
+
initialLabel: relation.kind === 'belongsTo' ? first?.label ?? '' : undefined,
|
|
58
|
+
initialItems: relation.kind === 'belongsTo' ? undefined : initialItems,
|
|
59
|
+
options: options.preloadedOptions,
|
|
60
|
+
checkboxColumns: field.checkboxColumns ?? relation.checkboxColumns ?? 2,
|
|
61
|
+
checkboxFramed: field.checkboxFramed ?? relation.checkboxFramed ?? true,
|
|
62
|
+
cascadeWildcards: field.cascadeWildcards ?? relation.cascadeWildcards ?? false,
|
|
63
|
+
groupBy: field.groupBy ?? relation.groupBy ?? '',
|
|
64
|
+
valueAttribute: relation.valueAttribute ?? 'id',
|
|
65
|
+
requiresParent: relation.kind === 'hasMany' && (operation === 'create' || !parentId),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function resolveRelatedMeta(registry, relation) {
|
|
69
|
+
return registry.require(relation.resource);
|
|
70
|
+
}
|
|
71
|
+
export function collectRelationIds(field, record) {
|
|
72
|
+
if (!record)
|
|
73
|
+
return [];
|
|
74
|
+
const raw = record[field.name];
|
|
75
|
+
if (Array.isArray(raw)) {
|
|
76
|
+
return raw.map((item) => String(item)).filter(Boolean);
|
|
77
|
+
}
|
|
78
|
+
if (raw != null && raw !== '') {
|
|
79
|
+
return [String(raw)];
|
|
80
|
+
}
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
export function recordSummaryLabel(meta, record, titleAttribute) {
|
|
84
|
+
const attr = titleAttribute ??
|
|
85
|
+
meta.recordTitleField ??
|
|
86
|
+
meta.fields.find((field) => field.name === 'name')?.name ??
|
|
87
|
+
'id';
|
|
88
|
+
const value = record[attr];
|
|
89
|
+
if (value != null && String(value).trim())
|
|
90
|
+
return String(value);
|
|
91
|
+
return String(record.id ?? '');
|
|
92
|
+
}
|
|
93
|
+
export { relationTitleAttribute };
|
|
94
|
+
//# sourceMappingURL=relation-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-fields.js","sourceRoot":"","sources":["../../src/shamar/relation-fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ActionConfig, ResourceMeta } from '@shamar/core';
|
|
2
|
+
import type { ResourcePolicyFlags } from './auth.js';
|
|
3
|
+
/** Filter resource actions by placement and CRUD policy flags. */
|
|
4
|
+
export declare function resourceActionsFor(meta: ResourceMeta, placement: ActionConfig['placement'], policy: ResourcePolicyFlags): ActionConfig[];
|
|
5
|
+
/** Row actions visible for a specific record (e.g. revoke vs reactivate). */
|
|
6
|
+
export declare function visibleRowActions(meta: ResourceMeta, policy: ResourcePolicyFlags, record?: Record<string, unknown> | null): ActionConfig[];
|
|
7
|
+
/** Derive Active/Revoked when a resource uses `revokedAt` + a `status` column/entry. */
|
|
8
|
+
export declare function decorateRevokedStatus(records: Record<string, unknown>[]): void;
|
|
9
|
+
//# sourceMappingURL=resource-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-actions.d.ts","sourceRoot":"","sources":["../../src/shamar/resource-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAYpD,kEAAkE;AAClE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,EACpC,MAAM,EAAE,mBAAmB,GAC1B,YAAY,EAAE,CAIhB;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACtC,YAAY,EAAE,CAQhB;AAED,wFAAwF;AACxF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAO9E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
function actionAllowed(action, policy) {
|
|
2
|
+
const gate = action.ability ?? action.name;
|
|
3
|
+
if (gate === 'create')
|
|
4
|
+
return policy.create;
|
|
5
|
+
if (gate === 'edit' || gate === 'update')
|
|
6
|
+
return policy.update;
|
|
7
|
+
if (gate === 'delete')
|
|
8
|
+
return policy.delete;
|
|
9
|
+
if (gate === 'view' || gate === 'viewAny')
|
|
10
|
+
return true;
|
|
11
|
+
// Custom actions without an ability: allow when the user can manage records.
|
|
12
|
+
return policy.delete || policy.update;
|
|
13
|
+
}
|
|
14
|
+
/** Filter resource actions by placement and CRUD policy flags. */
|
|
15
|
+
export function resourceActionsFor(meta, placement, policy) {
|
|
16
|
+
return (meta.actions ?? []).filter((action) => action.placement === placement && actionAllowed(action, policy));
|
|
17
|
+
}
|
|
18
|
+
/** Row actions visible for a specific record (e.g. revoke vs reactivate). */
|
|
19
|
+
export function visibleRowActions(meta, policy, record) {
|
|
20
|
+
return resourceActionsFor(meta, 'row', policy).filter((action) => {
|
|
21
|
+
if (action.name === 'edit' && !policy.update)
|
|
22
|
+
return false;
|
|
23
|
+
if (action.name === 'delete' && !policy.delete)
|
|
24
|
+
return false;
|
|
25
|
+
if (action.name === 'revoke' && record?.revokedAt)
|
|
26
|
+
return false;
|
|
27
|
+
if (action.name === 'reactivate' && !record?.revokedAt)
|
|
28
|
+
return false;
|
|
29
|
+
return true;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Derive Active/Revoked when a resource uses `revokedAt` + a `status` column/entry. */
|
|
33
|
+
export function decorateRevokedStatus(records) {
|
|
34
|
+
for (const record of records) {
|
|
35
|
+
if (!('revokedAt' in record))
|
|
36
|
+
continue;
|
|
37
|
+
const revokedAt = record.revokedAt;
|
|
38
|
+
record.status =
|
|
39
|
+
revokedAt != null && String(revokedAt).trim() !== '' ? 'Revoked' : 'Active';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=resource-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-actions.js","sourceRoot":"","sources":["../../src/shamar/resource-actions.ts"],"names":[],"mappings":"AAGA,SAAS,aAAa,CAAC,MAAoB,EAAE,MAA2B;IACtE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAA;IAC1C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAA;IAC3C,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAA;IAC9D,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAA;IAC3C,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACtD,6EAA6E;IAC7E,OAAO,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAA;AACvC,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,kBAAkB,CAChC,IAAkB,EAClB,SAAoC,EACpC,MAA2B;IAE3B,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAChC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAC5E,CAAA;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAC/B,IAAkB,EAClB,MAA2B,EAC3B,MAAuC;IAEvC,OAAO,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC/D,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAC1D,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAC5D,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,EAAE,SAAS;YAAE,OAAO,KAAK,CAAA;QAC/D,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,MAAM,EAAE,SAAS;YAAE,OAAO,KAAK,CAAA;QACpE,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,qBAAqB,CAAC,OAAkC;IACtE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC;YAAE,SAAQ;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;QAClC,MAAM,CAAC,MAAM;YACX,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC/E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { ResourceMeta, ResourceRegistry } from '@shamar/core';
|
|
2
|
+
import type { AuthorizationContext } from '@shamar/cherubim';
|
|
3
|
+
import type { Authorizer } from '@shamar/cherubim';
|
|
4
|
+
import type { ShamarConfig } from '../config.js';
|
|
5
|
+
import { type ShamarBranding } from './branding.js';
|
|
6
|
+
import { menuLayoutContext, type NavigationGroup, type RecordBreadcrumbOptions } from './menu.js';
|
|
7
|
+
import { type ListViewQuery, type PaginationContext } from './list-query.js';
|
|
8
|
+
import type { PaginatedResult } from '@shamar/core';
|
|
9
|
+
export interface AdminShellContext {
|
|
10
|
+
basePath: string;
|
|
11
|
+
panelTitle: string;
|
|
12
|
+
pageTitle: string;
|
|
13
|
+
branding: ShamarBranding;
|
|
14
|
+
navGroups: NavigationGroup[];
|
|
15
|
+
menuRoots: ReturnType<typeof menuLayoutContext>['menuRoots'];
|
|
16
|
+
menuActiveRoot: ReturnType<typeof menuLayoutContext>['menuActiveRoot'];
|
|
17
|
+
menuSecondary: ReturnType<typeof menuLayoutContext>['menuSecondary'];
|
|
18
|
+
breadcrumbs: ReturnType<typeof menuLayoutContext>['breadcrumbs'];
|
|
19
|
+
user: {
|
|
20
|
+
name: string;
|
|
21
|
+
email?: string;
|
|
22
|
+
};
|
|
23
|
+
userInitial: string;
|
|
24
|
+
logoutPath?: string;
|
|
25
|
+
showCreateButton?: boolean;
|
|
26
|
+
showEditButton?: boolean;
|
|
27
|
+
showDeleteButton?: boolean;
|
|
28
|
+
showBackToList?: boolean;
|
|
29
|
+
flash?: {
|
|
30
|
+
type: string;
|
|
31
|
+
message: string;
|
|
32
|
+
};
|
|
33
|
+
flashJson?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function navigationGroups(registry: ResourceRegistry, options?: {
|
|
36
|
+
authorizer?: Authorizer;
|
|
37
|
+
authCtx?: AuthorizationContext;
|
|
38
|
+
}): NavigationGroup[];
|
|
39
|
+
export declare function buildShellContext(options: {
|
|
40
|
+
config: ShamarConfig;
|
|
41
|
+
registry: ResourceRegistry;
|
|
42
|
+
meta?: ResourceMeta;
|
|
43
|
+
pageTitle: string;
|
|
44
|
+
basePath?: string;
|
|
45
|
+
branding?: ShamarConfig['branding'];
|
|
46
|
+
authorizer?: Authorizer;
|
|
47
|
+
authCtx?: AuthorizationContext;
|
|
48
|
+
showCreateButton?: boolean;
|
|
49
|
+
showEditButton?: boolean;
|
|
50
|
+
showDeleteButton?: boolean;
|
|
51
|
+
showBackToList?: boolean;
|
|
52
|
+
flash?: {
|
|
53
|
+
type: string;
|
|
54
|
+
message: string;
|
|
55
|
+
};
|
|
56
|
+
recordBreadcrumb?: RecordBreadcrumbOptions;
|
|
57
|
+
}): AdminShellContext;
|
|
58
|
+
export declare function buildListContext(options: {
|
|
59
|
+
basePath: string;
|
|
60
|
+
meta: ResourceMeta;
|
|
61
|
+
query: ListViewQuery;
|
|
62
|
+
result: PaginatedResult;
|
|
63
|
+
}): {
|
|
64
|
+
query: ListViewQuery;
|
|
65
|
+
pagination: PaginationContext;
|
|
66
|
+
perPageValue: string;
|
|
67
|
+
};
|
|
68
|
+
export declare function readFlash(ctx: {
|
|
69
|
+
session: {
|
|
70
|
+
flashMessages?: {
|
|
71
|
+
has(k: string): boolean;
|
|
72
|
+
get(k: string): unknown;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
}): {
|
|
76
|
+
type: string;
|
|
77
|
+
message: string;
|
|
78
|
+
} | undefined;
|
|
79
|
+
//# sourceMappingURL=view-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-context.d.ts","sourceRoot":"","sources":["../../src/shamar/view-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { canViewResource } from './auth.js';
|
|
2
|
+
import { resolveBranding } from './branding.js';
|
|
3
|
+
import { menuLayoutContext } from './menu.js';
|
|
4
|
+
import { buildPaginationContext, normalizeListQuery, } from './list-query.js';
|
|
5
|
+
export function navigationGroups(registry, options) {
|
|
6
|
+
const canView = (slug) => {
|
|
7
|
+
if (!options?.authorizer || !options.authCtx)
|
|
8
|
+
return true;
|
|
9
|
+
return canViewResource(options.authorizer, options.authCtx, registry, slug);
|
|
10
|
+
};
|
|
11
|
+
return registry
|
|
12
|
+
.navigationGroups()
|
|
13
|
+
.map((group) => ({
|
|
14
|
+
name: group.name,
|
|
15
|
+
items: group.items.filter((item) => canView(item.slug)),
|
|
16
|
+
}))
|
|
17
|
+
.filter((group) => group.items.length > 0);
|
|
18
|
+
}
|
|
19
|
+
export function buildShellContext(options) {
|
|
20
|
+
const basePath = options.basePath ?? options.config.path ?? '/admin';
|
|
21
|
+
const groups = navigationGroups(options.registry, {
|
|
22
|
+
authorizer: options.authorizer,
|
|
23
|
+
authCtx: options.authCtx,
|
|
24
|
+
});
|
|
25
|
+
const menu = menuLayoutContext(groups, basePath, options.meta?.slug, options.pageTitle, options.recordBreadcrumb);
|
|
26
|
+
const brandingInput = options.branding ?? options.config.branding;
|
|
27
|
+
const branding = resolveBranding(brandingInput);
|
|
28
|
+
const authUser = options.authCtx?.user;
|
|
29
|
+
const userName = authUser?.name ?? brandingInput?.name ?? branding.brandName;
|
|
30
|
+
const flash = options.flash;
|
|
31
|
+
const flashJson = flash ? JSON.stringify(flash).replace(/</g, '\\u003c') : undefined;
|
|
32
|
+
return {
|
|
33
|
+
basePath,
|
|
34
|
+
panelTitle: branding.brandName,
|
|
35
|
+
pageTitle: options.pageTitle,
|
|
36
|
+
branding,
|
|
37
|
+
navGroups: groups,
|
|
38
|
+
menuRoots: menu.menuRoots,
|
|
39
|
+
menuActiveRoot: menu.menuActiveRoot,
|
|
40
|
+
menuSecondary: menu.menuSecondary,
|
|
41
|
+
breadcrumbs: menu.breadcrumbs,
|
|
42
|
+
user: {
|
|
43
|
+
name: userName,
|
|
44
|
+
email: authUser?.email,
|
|
45
|
+
},
|
|
46
|
+
userInitial: userName.slice(0, 2).toUpperCase(),
|
|
47
|
+
logoutPath: options.config.auth?.logoutPath,
|
|
48
|
+
showCreateButton: options.showCreateButton,
|
|
49
|
+
showEditButton: options.showEditButton,
|
|
50
|
+
showDeleteButton: options.showDeleteButton,
|
|
51
|
+
showBackToList: options.showBackToList,
|
|
52
|
+
flash,
|
|
53
|
+
flashJson,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function buildListContext(options) {
|
|
57
|
+
const query = normalizeListQuery(options.query);
|
|
58
|
+
const pagination = buildPaginationContext(options.basePath, options.meta.slug, query, options.result);
|
|
59
|
+
const perPageValue = query.perPage >= 1000 || options.query.perPage === 'all' ? 'all' : String(query.perPage);
|
|
60
|
+
return { query, pagination, perPageValue };
|
|
61
|
+
}
|
|
62
|
+
export function readFlash(ctx) {
|
|
63
|
+
const messages = ctx.session.flashMessages;
|
|
64
|
+
if (!messages)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (messages.has('success')) {
|
|
67
|
+
return { type: 'success', message: String(messages.get('success')) };
|
|
68
|
+
}
|
|
69
|
+
if (messages.has('error')) {
|
|
70
|
+
return { type: 'error', message: String(messages.get('error')) };
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=view-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-context.js","sourceRoot":"","sources":["../../src/shamar/view-context.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DataAdapter, ResourceRegistry } from '@shamar/core';
|
|
2
|
+
import type { Authorizer } from '@shamar/cherubim';
|
|
3
|
+
import type { ShamarRuntime, PanelRuntime } from './runtime.js';
|
|
4
|
+
import type { ShamarConfig } from './config.js';
|
|
5
|
+
declare module '@adonisjs/core/types' {
|
|
6
|
+
interface ContainerBindings {
|
|
7
|
+
'shamar.runtime': ShamarRuntime;
|
|
8
|
+
'shamar.config': ShamarConfig;
|
|
9
|
+
'shamar.registry': ResourceRegistry;
|
|
10
|
+
'shamar.adapter': DataAdapter;
|
|
11
|
+
'shamar.panels': PanelRuntime[];
|
|
12
|
+
'shamar.authorizer': Authorizer;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAU,iBAAiB;QACzB,gBAAgB,EAAE,aAAa,CAAC;QAChC,eAAe,EAAE,YAAY,CAAC;QAC9B,iBAAiB,EAAE,gBAAgB,CAAC;QACpC,gBAAgB,EAAE,WAAW,CAAC;QAC9B,eAAe,EAAE,YAAY,EAAE,CAAC;QAChC,mBAAmB,EAAE,UAAU,CAAC;KACjC;CACF"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shamar/adonis",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AdonisJS service provider for Shamar admin — routes, controllers, middleware, Edge views.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./provider": {
|
|
15
|
+
"types": "./dist/provider.d.ts",
|
|
16
|
+
"import": "./dist/provider.js"
|
|
17
|
+
},
|
|
18
|
+
"./require_api_key_middleware": {
|
|
19
|
+
"types": "./dist/middleware/require_api_key_middleware.d.ts",
|
|
20
|
+
"import": "./dist/middleware/require_api_key_middleware.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"resources",
|
|
26
|
+
"assets",
|
|
27
|
+
"stubs"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@shamar/cherubim": "0.1.0",
|
|
31
|
+
"@shamar/lucid": "0.1.0",
|
|
32
|
+
"@shamar/mongoose": "0.1.0",
|
|
33
|
+
"@shamar/core": "0.1.0"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"@adonisjs/core": ">=6.0.0",
|
|
37
|
+
"@adonisjs/lucid": ">=21.0.0",
|
|
38
|
+
"edge.js": ">=6.0.0",
|
|
39
|
+
"mongoose": ">=8.0.0"
|
|
40
|
+
},
|
|
41
|
+
"peerDependenciesMeta": {
|
|
42
|
+
"edge.js": {
|
|
43
|
+
"optional": true
|
|
44
|
+
},
|
|
45
|
+
"mongoose": {
|
|
46
|
+
"optional": true
|
|
47
|
+
},
|
|
48
|
+
"@adonisjs/lucid": {
|
|
49
|
+
"optional": true
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@adonisjs/core": "^7.3.5",
|
|
54
|
+
"edge.js": "^6.5.1",
|
|
55
|
+
"@types/node": "^22.0.0",
|
|
56
|
+
"tsx": "^4.20.0",
|
|
57
|
+
"typescript": "^5.7.0"
|
|
58
|
+
},
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"access": "public"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsc",
|
|
64
|
+
"build:css": "pnpm dlx @tailwindcss/cli@4.3.2 -i ./assets/input.css -o ./assets/admin.css --minify",
|
|
65
|
+
"test": "tsx --test test/**/*.test.ts"
|
|
66
|
+
}
|
|
67
|
+
}
|