@paneljs/paneljs 0.1.0 → 0.2.1

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 (55) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/adapter.d.ts +10 -6
  3. package/dist/adminService.d.ts +49 -0
  4. package/dist/adminService.js +307 -0
  5. package/dist/adminService.js.map +1 -0
  6. package/dist/authStore.d.ts +31 -0
  7. package/dist/authStore.js +3 -0
  8. package/dist/authStore.js.map +1 -0
  9. package/dist/builtInAuth.d.ts +49 -0
  10. package/dist/builtInAuth.js +117 -0
  11. package/dist/builtInAuth.js.map +1 -0
  12. package/dist/cli/args.d.ts +2 -0
  13. package/dist/cli/args.js +16 -0
  14. package/dist/cli/args.js.map +1 -0
  15. package/dist/cli/auth.d.ts +7 -0
  16. package/dist/cli/auth.js +95 -0
  17. package/dist/cli/auth.js.map +1 -0
  18. package/dist/cli/init.d.ts +37 -0
  19. package/dist/cli/init.js +137 -0
  20. package/dist/cli/init.js.map +1 -0
  21. package/dist/cli/project.d.ts +31 -0
  22. package/dist/cli/project.js +150 -0
  23. package/dist/cli/project.js.map +1 -0
  24. package/dist/cli/prompt.d.ts +10 -0
  25. package/dist/cli/prompt.js +129 -0
  26. package/dist/cli/prompt.js.map +1 -0
  27. package/dist/cli/stack.d.ts +18 -0
  28. package/dist/cli/stack.js +129 -0
  29. package/dist/cli/stack.js.map +1 -0
  30. package/dist/cli.d.ts +2 -0
  31. package/dist/cli.js +53 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/deleteRelations.d.ts +17 -0
  34. package/dist/deleteRelations.js +100 -0
  35. package/dist/deleteRelations.js.map +1 -0
  36. package/dist/index.d.ts +21 -7
  37. package/dist/index.js +25 -7
  38. package/dist/index.js.map +1 -1
  39. package/dist/listQuery.d.ts +6 -12
  40. package/dist/listQuery.js +10 -17
  41. package/dist/listQuery.js.map +1 -1
  42. package/dist/query.d.ts +65 -0
  43. package/dist/query.js +12 -0
  44. package/dist/query.js.map +1 -0
  45. package/dist/recordSelection.d.ts +3 -6
  46. package/dist/recordSelection.js +26 -20
  47. package/dist/recordSelection.js.map +1 -1
  48. package/dist/scope.d.ts +1 -1
  49. package/dist/types.d.ts +6 -1
  50. package/package.json +19 -10
  51. package/ui/dist/assets/index-BFz2MB0D.js +11 -0
  52. package/ui/dist/assets/index-B_bCMkti.css +1 -0
  53. package/ui/dist/index.html +2 -2
  54. package/ui/dist/assets/index-ChtweaBk.js +0 -11
  55. package/ui/dist/assets/index-eXfQCDXx.css +0 -1
package/dist/listQuery.js CHANGED
@@ -37,15 +37,7 @@ function parseFilterValue(field, value) {
37
37
  throw new RequestValidationError(`Filter "${field.name}" is not supported.`);
38
38
  }
39
39
  }
40
- export function buildListWhere(scope, filters, search) {
41
- const conditions = [scope, filters, search].filter((condition) => condition !== undefined && Object.keys(condition).length > 0);
42
- if (conditions.length === 0)
43
- return {};
44
- if (conditions.length === 1)
45
- return conditions[0] ?? {};
46
- return { AND: conditions };
47
- }
48
- export function parseListQuery(query, meta, model, databaseProvider) {
40
+ export function parseListQuery(query, meta, model) {
49
41
  const pageValue = Number(getQueryValue(query, "page") ?? 1);
50
42
  if (!Number.isInteger(pageValue) || pageValue < 1)
51
43
  throw new RequestValidationError("Query parameter \"page\" must be a positive integer.");
@@ -79,12 +71,15 @@ export function parseListQuery(query, meta, model, databaseProvider) {
79
71
  if (field.type !== "datetime")
80
72
  throw new RequestValidationError(`Filter "${parameterName}" is only supported for date-time fields.`);
81
73
  const operator = rangeMatch[2];
82
- if (!operator)
74
+ if (operator !== "gte" && operator !== "lte")
83
75
  throw new RequestValidationError(`Filter "${parameterName}" is invalid.`);
84
- filters[fieldName] = { ...filters[fieldName], [operator]: parseFilterValue(field, rawValue) };
76
+ const existing = filters[fieldName];
77
+ const range = existing && !("equals" in existing) && !("in" in existing) ? { ...existing } : {};
78
+ range[operator] = parseFilterValue(field, rawValue);
79
+ filters[fieldName] = range;
85
80
  }
86
81
  else {
87
- filters[fieldName] = parseFilterValue(field, rawValue);
82
+ filters[fieldName] = { equals: parseFilterValue(field, rawValue) };
88
83
  }
89
84
  }
90
85
  const searchValue = getQueryValue(query, "search")?.trim();
@@ -94,13 +89,11 @@ export function parseListQuery(query, meta, model, databaseProvider) {
94
89
  const field = fieldsByName.get(fieldName);
95
90
  return field?.type === "string" && isFieldVisible(field, model.raw);
96
91
  });
97
- const search = searchValue ? {
98
- OR: searchFields.map((fieldName) => ({
99
- [fieldName]: { contains: searchValue, ...(databaseProvider === "postgresql" ? { mode: "insensitive" } : {}) },
100
- })),
101
- } : undefined;
102
92
  if (searchValue && searchFields.length === 0)
103
93
  throw new RequestValidationError(`Model "${meta.name}" has no searchable fields.`);
94
+ const search = searchValue
95
+ ? { text: searchValue, fields: searchFields }
96
+ : undefined;
104
97
  return { page: pageValue, sort, dir, filters, search };
105
98
  }
106
99
  //# sourceMappingURL=listQuery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"listQuery.js","sourceRoot":"","sources":["../src/listQuery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"listQuery.js","sourceRoot":"","sources":["../src/listQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /** Field equality used by `scope()` and as the base of every query. */
2
+ export type EqualityFilter = Record<string, unknown>;
3
+ /** One list/query constraint on a single field. Not a Prisma `where` object. */
4
+ export type FieldFilter = {
5
+ equals: string | number | boolean | Date | null;
6
+ } | {
7
+ in: Array<string | number>;
8
+ } | {
9
+ gte?: Date | number;
10
+ lte?: Date | number;
11
+ };
12
+ export type FieldFilters = Record<string, FieldFilter>;
13
+ export type SearchQuery = {
14
+ text: string;
15
+ fields: string[];
16
+ };
17
+ export type RelationSelect = {
18
+ field: string;
19
+ displayField: string;
20
+ };
21
+ export type FieldSelect = {
22
+ fields: string[];
23
+ relations: RelationSelect[];
24
+ };
25
+ export type FindManyQuery = {
26
+ scope: EqualityFilter;
27
+ filters: FieldFilters;
28
+ search?: SearchQuery;
29
+ ids?: Array<string | number>;
30
+ sort?: {
31
+ field: string;
32
+ direction: "asc" | "desc";
33
+ };
34
+ skip?: number;
35
+ take?: number;
36
+ select: FieldSelect;
37
+ };
38
+ export type CountQuery = Pick<FindManyQuery, "scope" | "filters" | "search" | "ids">;
39
+ export type FindFirstQuery = {
40
+ scope: EqualityFilter;
41
+ id: string | number;
42
+ select: FieldSelect;
43
+ };
44
+ export type CreateQuery = {
45
+ data: Record<string, unknown>;
46
+ select: FieldSelect;
47
+ };
48
+ export type UpdateManyQuery = {
49
+ scope: EqualityFilter;
50
+ id?: string | number;
51
+ ids?: Array<string | number>;
52
+ data: Record<string, unknown>;
53
+ };
54
+ export type DeleteManyQuery = {
55
+ scope: EqualityFilter;
56
+ id?: string | number;
57
+ ids?: Array<string | number>;
58
+ };
59
+ /** Custom action `where`: scope plus the selected row ids. Not a Prisma `where`. */
60
+ export type ActionWhere = {
61
+ scope: EqualityFilter;
62
+ ids: Array<string | number>;
63
+ };
64
+ export declare function idSelect(idField: string): FieldSelect;
65
+ export declare function withSelectFields(select: FieldSelect, fieldNames: string[]): FieldSelect;
package/dist/query.js ADDED
@@ -0,0 +1,12 @@
1
+ export function idSelect(idField) {
2
+ return { fields: [idField], relations: [] };
3
+ }
4
+ export function withSelectFields(select, fieldNames) {
5
+ const fields = [...select.fields];
6
+ for (const name of fieldNames) {
7
+ if (!fields.includes(name))
8
+ fields.push(name);
9
+ }
10
+ return { fields, relations: select.relations };
11
+ }
12
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAqEA,MAAM,UAAU,QAAQ,CAAC,OAAe;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAmB,EAAE,UAAoB;IACvE,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AAClD,CAAC"}
@@ -1,13 +1,10 @@
1
1
  import type { DataAdapter } from "./adapter.js";
2
2
  import type { FullRegisteredModel } from "./registry.js";
3
+ import type { FieldSelect } from "./query.js";
3
4
  import type { AdminModelMeta, AdminUser } from "./types.js";
4
5
  /** Build the safe select used by detail and edit endpoints. */
5
- export declare function buildRecordSelect(meta: AdminModelMeta, model: FullRegisteredModel): Record<string, true | {
6
- select: Record<string, true>;
7
- }>;
6
+ export declare function buildRecordSelect(meta: AdminModelMeta, model: FullRegisteredModel): FieldSelect;
8
7
  /** Only return columns the list is configured to display, plus the primary key. */
9
- export declare function buildListRecordSelect(meta: AdminModelMeta, model: FullRegisteredModel): Record<string, true | {
10
- select: Record<string, true>;
11
- }>;
8
+ export declare function buildListRecordSelect(meta: AdminModelMeta, model: FullRegisteredModel): FieldSelect;
12
9
  /** Verify submitted belongs-to IDs are visible under the related model's own access rules. */
13
10
  export declare function assertSelectedRelationsAreVisible(data: Record<string, unknown>, model: FullRegisteredModel, models: Map<string, FullRegisteredModel>, adapter: DataAdapter, adminUser: AdminUser): Promise<void>;
@@ -1,12 +1,14 @@
1
1
  import { hasModelPermission } from "./permissions.js";
2
- import { buildScopedRecordWhere, resolveScope } from "./scope.js";
2
+ import { idSelect } from "./query.js";
3
+ import { resolveScope } from "./scope.js";
3
4
  import { parseRecordId } from "./ids.js";
4
5
  import { isFieldVisible, isSensitiveFieldName, RequestValidationError } from "./validation.js";
5
6
  import { PermissionDeniedError } from "./errors.js";
6
- /** Build the safe select used by detail and edit endpoints. */
7
- export function buildRecordSelect(meta, model) {
8
- const select = Object.fromEntries(meta.fields.filter((field) => field.type !== "relation" && isFieldVisible(field, model.raw)).map((field) => [field.name, true]));
7
+ function relationSelects(meta, model, allowedNames) {
8
+ const relations = [];
9
9
  for (const fieldName of model.resolved.listDisplay) {
10
+ if (allowedNames && !allowedNames.has(fieldName))
11
+ continue;
10
12
  const field = meta.fields.find((candidate) => candidate.name === fieldName);
11
13
  if (!field?.relation || !isFieldVisible(field, model.raw))
12
14
  continue;
@@ -14,25 +16,28 @@ export function buildRecordSelect(meta, model) {
14
16
  continue;
15
17
  if (isSensitiveFieldName(field.relation.displayField))
16
18
  continue;
17
- select[field.name] = { select: { [field.relation.displayField]: true } };
19
+ relations.push({ field: field.name, displayField: field.relation.displayField });
18
20
  }
19
- return select;
21
+ return relations;
22
+ }
23
+ /** Build the safe select used by detail and edit endpoints. */
24
+ export function buildRecordSelect(meta, model) {
25
+ const fields = meta.fields
26
+ .filter((field) => field.type !== "relation" && isFieldVisible(field, model.raw))
27
+ .map((field) => field.name);
28
+ if (!fields.includes(meta.idField))
29
+ fields.unshift(meta.idField);
30
+ return { fields, relations: relationSelects(meta, model) };
20
31
  }
21
32
  /** Only return columns the list is configured to display, plus the primary key. */
22
33
  export function buildListRecordSelect(meta, model) {
23
34
  const allowed = new Set([meta.idField, ...model.resolved.listDisplay]);
24
- const select = Object.fromEntries(meta.fields.filter((field) => field.type !== "relation" && allowed.has(field.name) && isFieldVisible(field, model.raw)).map((field) => [field.name, true]));
25
- select[meta.idField] = true;
26
- for (const fieldName of model.resolved.listDisplay) {
27
- const field = meta.fields.find((candidate) => candidate.name === fieldName);
28
- if (!field?.relation || !isFieldVisible(field, model.raw))
29
- continue;
30
- if (field.relation.kind !== "belongsTo" && field.relation.kind !== "hasOne")
31
- continue;
32
- if (!isSensitiveFieldName(field.relation.displayField))
33
- select[field.name] = { select: { [field.relation.displayField]: true } };
34
- }
35
- return select;
35
+ const fields = meta.fields
36
+ .filter((field) => field.type !== "relation" && allowed.has(field.name) && isFieldVisible(field, model.raw))
37
+ .map((field) => field.name);
38
+ if (!fields.includes(meta.idField))
39
+ fields.unshift(meta.idField);
40
+ return { fields, relations: relationSelects(meta, model, allowed) };
36
41
  }
37
42
  /** Verify submitted belongs-to IDs are visible under the related model's own access rules. */
38
43
  export async function assertSelectedRelationsAreVisible(data, model, models, adapter, adminUser) {
@@ -55,8 +60,9 @@ export async function assertSelectedRelationsAreVisible(data, model, models, ada
55
60
  throw new PermissionDeniedError();
56
61
  const relatedScope = await resolveScope(relatedModel.raw, adminUser);
57
62
  const relatedRecord = await adapter.resource(relatedModel.meta).findFirst({
58
- where: buildScopedRecordWhere(relatedScope, relatedModel.meta.idField, parseRecordId(relatedModel.meta, String(selectedId))),
59
- select: { [relatedModel.meta.idField]: true },
63
+ scope: relatedScope,
64
+ id: parseRecordId(relatedModel.meta, String(selectedId)),
65
+ select: idSelect(relatedModel.meta.idField),
60
66
  });
61
67
  if (!relatedRecord)
62
68
  throw new RequestValidationError(`The selected ${relation.model} record is unavailable.`);
@@ -1 +1 @@
1
- {"version":3,"file":"recordSelection.js","sourceRoot":"","sources":["../src/recordSelection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,+DAA+D;AAC/D,MAAM,UAAU,iBAAiB,CAAC,IAAoB,EAAE,KAA0B;IAC/E,MAAM,MAAM,GAA4D,MAAM,CAAC,WAAW,CACvF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CACjI,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;YAAE,SAAS;QACpE,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACtF,IAAI,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,SAAS;QAChE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;IAC5E,CAAC;IAED,OAAO,MAAM,CAAC;AACjB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CAAC,IAAoB,EAAE,KAA0B;IACnF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACvE,MAAM,MAAM,GAA4D,MAAM,CAAC,WAAW,CACvF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAC5J,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5B,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;YAAE,SAAS;QACpE,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACtF,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;IACpI,CAAC;IACD,OAAO,MAAM,CAAC;AACjB,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACpD,IAA6B,EAC7B,KAA0B,EAC1B,MAAwC,EACxC,OAAoB,EACpB,SAAoB;IAEpB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAExG,KAAK,MAAM,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;QACxC,IAAI,aAAa,CAAC,IAAI,KAAK,UAAU,IAAI,QAAQ,EAAE,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE5H,MAAM,eAAe,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,eAAe,IAAI,IAAI,CAAC;YAAE,SAAS;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;QACzC,IAAI,UAAU,KAAK,IAAI;YAAE,SAAS;QAElC,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,EAAE,CAAC;YACjB,MAAM,IAAI,sBAAsB,CAAC,aAAa,aAAa,CAAC,IAAI,8CAA8C,QAAQ,CAAC,KAAK,sBAAsB,CAAC,CAAC;QACvJ,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;YAAE,MAAM,IAAI,qBAAqB,EAAE,CAAC;QAEjH,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACrE,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;YACvE,KAAK,EAAE,sBAAsB,CAAC,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5H,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,sBAAsB,CAAC,gBAAgB,QAAQ,CAAC,KAAK,yBAAyB,CAAC,CAAC;IACjH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"recordSelection.js","sourceRoot":"","sources":["../src/recordSelection.ts"],"names":[],"mappings":"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"}
package/dist/scope.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { AdminUser, ModelConfig } from "./types.js";
2
- /** A Prisma-compatible where fragment returned by a model scope function. */
2
+ /** Equality (and historically nested) filter returned by a model scope function. */
3
3
  export type ScopeFilter = Record<string, unknown>;
4
4
  /**
5
5
  * Resolve a model's tenant or ownership scope for an authenticated admin.
package/dist/types.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import type { DataAdapter } from "./adapter.js";
2
+ import type { ActionWhere } from "./query.js";
3
+ import type { AdminAuthStore } from "./authStore.js";
2
4
  export type AdminFieldType = "string" | "number" | "boolean" | "datetime" | "json" | "enum" | "relation" | "bytes";
3
5
  export type RelationKind = "belongsTo" | "hasMany" | "manyToMany" | "hasOne";
4
6
  export interface AdminFieldMeta {
@@ -56,7 +58,7 @@ export interface AdminAction {
56
58
  ids: Array<string | number>;
57
59
  adminUser: AdminUser;
58
60
  client: unknown;
59
- where: Record<string, unknown>;
61
+ where: ActionWhere;
60
62
  }) => Promise<{
61
63
  message: string;
62
64
  }>;
@@ -119,6 +121,8 @@ export interface BuiltInAuthConfig {
119
121
  windowMs?: number;
120
122
  maxAttempts?: number;
121
123
  };
124
+ /** Optional override. Prisma adapters supply a store via `createAuthStore`. */
125
+ store?: AdminAuthStore;
122
126
  }
123
127
  export type AuthConfig = ExternalAuthConfig | BuiltInAuthConfig;
124
128
  export interface AdminAuditEvent {
@@ -142,6 +146,7 @@ export interface AdminConfig {
142
146
  audit?: AuditConfig;
143
147
  basePath?: string;
144
148
  siteName?: string;
149
+ /** @deprecated Ignored. The Prisma adapter reads the datasource provider from `schema.prisma`. */
145
150
  databaseProvider?: "postgresql" | "mysql" | "sqlite" | "sqlserver" | "mongodb";
146
151
  }
147
152
  export interface PaginatedResponse<T> {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@paneljs/paneljs",
3
- "version": "0.1.0",
4
- "description": "Schema-driven admin panel core. Register models, serve a guarded operations UI.",
3
+ "version": "0.2.1",
4
+ "description": "Django-style, schema-driven Prisma admin panel for Express and Node.js applications.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "author": "Divinesta",
@@ -15,10 +15,15 @@
15
15
  },
16
16
  "homepage": "https://github.com/divinesta/paneljs",
17
17
  "keywords": [
18
- "admin",
19
- "admin-panel",
18
+ "prisma-admin",
19
+ "prisma-admin-panel",
20
20
  "express",
21
21
  "prisma",
22
+ "express-admin",
23
+ "nodejs-admin",
24
+ "django-admin-alternative",
25
+ "typescript-admin",
26
+ "schema-driven",
22
27
  "crud"
23
28
  ],
24
29
  "exports": {
@@ -33,6 +38,7 @@
33
38
  "dist",
34
39
  "ui/dist",
35
40
  "README.md",
41
+ "CHANGELOG.md",
36
42
  "LICENSE"
37
43
  ],
38
44
  "engines": {
@@ -41,14 +47,17 @@
41
47
  "publishConfig": {
42
48
  "access": "public"
43
49
  },
44
- "devDependencies": {
45
- "@types/node": "^22.15.3",
46
- "typescript": "5.9.2"
47
- },
48
50
  "scripts": {
49
51
  "build": "pnpm --dir ui build && tsc -p tsconfig.build.json",
50
52
  "dev": "pnpm --dir ui dev",
51
53
  "lint": "echo \"paneljs: no lint yet\"",
52
- "check-types": "tsc --noEmit -p tsconfig.json"
54
+ "check-types": "tsc --noEmit -p tsconfig.json",
55
+ "test": "vitest run --passWithNoTests",
56
+ "test:unit": "vitest run --passWithNoTests",
57
+ "prepublishOnly": "pnpm run build"
58
+ },
59
+ "devDependencies": {
60
+ "@types/node": "^22.15.3",
61
+ "typescript": "5.9.2"
53
62
  }
54
- }
63
+ }