@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.
Files changed (134) hide show
  1. package/assets/admin.css +2 -0
  2. package/assets/alpine.min.js +5 -0
  3. package/assets/input.css +2286 -0
  4. package/assets/shamar-ui.js +3658 -0
  5. package/dist/assets-controller.d.ts +12 -0
  6. package/dist/assets-controller.d.ts.map +1 -0
  7. package/dist/assets-controller.js +32 -0
  8. package/dist/assets-controller.js.map +1 -0
  9. package/dist/config.d.ts +79 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +38 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/configure.d.ts +21 -0
  14. package/dist/configure.d.ts.map +1 -0
  15. package/dist/configure.js +20 -0
  16. package/dist/configure.js.map +1 -0
  17. package/dist/context.d.ts +22 -0
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +2 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/controller.d.ts +31 -0
  22. package/dist/controller.d.ts.map +1 -0
  23. package/dist/controller.js +45 -0
  24. package/dist/controller.js.map +1 -0
  25. package/dist/controllers/admin_controller.d.ts +72 -0
  26. package/dist/controllers/admin_controller.d.ts.map +1 -0
  27. package/dist/controllers/admin_controller.js +1075 -0
  28. package/dist/controllers/admin_controller.js.map +1 -0
  29. package/dist/discover.d.ts +7 -0
  30. package/dist/discover.d.ts.map +1 -0
  31. package/dist/discover.js +50 -0
  32. package/dist/discover.js.map +1 -0
  33. package/dist/form-state.d.ts +41 -0
  34. package/dist/form-state.d.ts.map +1 -0
  35. package/dist/form-state.js +74 -0
  36. package/dist/form-state.js.map +1 -0
  37. package/dist/index.d.ts +10 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +10 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/middleware/require_api_key_middleware.d.ts +30 -0
  42. package/dist/middleware/require_api_key_middleware.d.ts.map +1 -0
  43. package/dist/middleware/require_api_key_middleware.js +59 -0
  44. package/dist/middleware/require_api_key_middleware.js.map +1 -0
  45. package/dist/provider.d.ts +9 -0
  46. package/dist/provider.d.ts.map +1 -0
  47. package/dist/provider.js +66 -0
  48. package/dist/provider.js.map +1 -0
  49. package/dist/resources/api_key_resource.d.ts +35 -0
  50. package/dist/resources/api_key_resource.d.ts.map +1 -0
  51. package/dist/resources/api_key_resource.js +225 -0
  52. package/dist/resources/api_key_resource.js.map +1 -0
  53. package/dist/routes.d.ts +5 -0
  54. package/dist/routes.d.ts.map +1 -0
  55. package/dist/routes.js +97 -0
  56. package/dist/routes.js.map +1 -0
  57. package/dist/runtime.d.ts +27 -0
  58. package/dist/runtime.d.ts.map +1 -0
  59. package/dist/runtime.js +74 -0
  60. package/dist/runtime.js.map +1 -0
  61. package/dist/shamar/auth.d.ts +30 -0
  62. package/dist/shamar/auth.d.ts.map +1 -0
  63. package/dist/shamar/auth.js +218 -0
  64. package/dist/shamar/auth.js.map +1 -0
  65. package/dist/shamar/branding.d.ts +24 -0
  66. package/dist/shamar/branding.d.ts.map +1 -0
  67. package/dist/shamar/branding.js +91 -0
  68. package/dist/shamar/branding.js.map +1 -0
  69. package/dist/shamar/display-relations.d.ts +7 -0
  70. package/dist/shamar/display-relations.d.ts.map +1 -0
  71. package/dist/shamar/display-relations.js +89 -0
  72. package/dist/shamar/display-relations.js.map +1 -0
  73. package/dist/shamar/list-headers.d.ts +38 -0
  74. package/dist/shamar/list-headers.d.ts.map +1 -0
  75. package/dist/shamar/list-headers.js +218 -0
  76. package/dist/shamar/list-headers.js.map +1 -0
  77. package/dist/shamar/list-query.d.ts +229 -0
  78. package/dist/shamar/list-query.d.ts.map +1 -0
  79. package/dist/shamar/list-query.js +564 -0
  80. package/dist/shamar/list-query.js.map +1 -0
  81. package/dist/shamar/menu.d.ts +48 -0
  82. package/dist/shamar/menu.d.ts.map +1 -0
  83. package/dist/shamar/menu.js +93 -0
  84. package/dist/shamar/menu.js.map +1 -0
  85. package/dist/shamar/paths.d.ts +5 -0
  86. package/dist/shamar/paths.d.ts.map +1 -0
  87. package/dist/shamar/paths.js +16 -0
  88. package/dist/shamar/paths.js.map +1 -0
  89. package/dist/shamar/relation-fields.d.ts +54 -0
  90. package/dist/shamar/relation-fields.d.ts.map +1 -0
  91. package/dist/shamar/relation-fields.js +94 -0
  92. package/dist/shamar/relation-fields.js.map +1 -0
  93. package/dist/shamar/resource-actions.d.ts +9 -0
  94. package/dist/shamar/resource-actions.d.ts.map +1 -0
  95. package/dist/shamar/resource-actions.js +42 -0
  96. package/dist/shamar/resource-actions.js.map +1 -0
  97. package/dist/shamar/view-context.d.ts +79 -0
  98. package/dist/shamar/view-context.d.ts.map +1 -0
  99. package/dist/shamar/view-context.js +74 -0
  100. package/dist/shamar/view-context.js.map +1 -0
  101. package/dist/types.d.ts +15 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +2 -0
  104. package/dist/types.js.map +1 -0
  105. package/package.json +67 -0
  106. package/resources/views/shamar/dashboard.edge +24 -0
  107. package/resources/views/shamar/form.edge +87 -0
  108. package/resources/views/shamar/index.edge +149 -0
  109. package/resources/views/shamar/partials/boolean-value.edge +25 -0
  110. package/resources/views/shamar/partials/csrf.edge +1 -0
  111. package/resources/views/shamar/partials/detail-entry.edge +72 -0
  112. package/resources/views/shamar/partials/dialog-host.edge +125 -0
  113. package/resources/views/shamar/partials/field-affix-icon.edge +23 -0
  114. package/resources/views/shamar/partials/field-input.edge +585 -0
  115. package/resources/views/shamar/partials/field-relation-checkbox.edge +104 -0
  116. package/resources/views/shamar/partials/field-relation-m2m.edge +110 -0
  117. package/resources/views/shamar/partials/field-relation-m2o.edge +116 -0
  118. package/resources/views/shamar/partials/field-relation-table.edge +139 -0
  119. package/resources/views/shamar/partials/form-container.edge +82 -0
  120. package/resources/views/shamar/partials/icon.edge +14 -0
  121. package/resources/views/shamar/partials/list-row.edge +73 -0
  122. package/resources/views/shamar/partials/list-toolbar.edge +269 -0
  123. package/resources/views/shamar/partials/nav-mobile.edge +21 -0
  124. package/resources/views/shamar/partials/nav.edge +58 -0
  125. package/resources/views/shamar/partials/page-heading.edge +130 -0
  126. package/resources/views/shamar/partials/pagination.edge +73 -0
  127. package/resources/views/shamar/partials/record-pager.edge +37 -0
  128. package/resources/views/shamar/partials/schema-node.edge +289 -0
  129. package/resources/views/shamar/partials/shell-close.edge +20 -0
  130. package/resources/views/shamar/partials/shell-open.edge +51 -0
  131. package/resources/views/shamar/partials/toast.edge +5 -0
  132. package/resources/views/shamar/partials/topbar.edge +115 -0
  133. package/resources/views/shamar/show.edge +17 -0
  134. 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,5 @@
1
+ export declare function shamarAssetsDir(): string;
2
+ export declare function shamarAdminCssPath(): string;
3
+ export declare function shamarAlpineJsPath(): string;
4
+ export declare function shamarUiJsPath(): string;
5
+ //# sourceMappingURL=paths.d.ts.map
@@ -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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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
+ }