@bobbykim/manguito-cms-cli 0.4.4 → 0.4.5
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.
|
@@ -10786,10 +10786,10 @@ var require_parser = __commonJS({
|
|
|
10786
10786
|
}
|
|
10787
10787
|
});
|
|
10788
10788
|
|
|
10789
|
-
// ../api/dist/handler-
|
|
10789
|
+
// ../api/dist/handler-7LVYEU5C.mjs
|
|
10790
10790
|
init_esm_shims();
|
|
10791
10791
|
|
|
10792
|
-
// ../api/dist/chunk-
|
|
10792
|
+
// ../api/dist/chunk-S4NT6FUM.mjs
|
|
10793
10793
|
init_esm_shims();
|
|
10794
10794
|
|
|
10795
10795
|
// ../../node_modules/.pnpm/graphql-yoga@5.21.2_graphql@16.14.2/node_modules/graphql-yoga/esm/index.js
|
|
@@ -30122,7 +30122,7 @@ function createYoga(options) {
|
|
|
30122
30122
|
});
|
|
30123
30123
|
}
|
|
30124
30124
|
|
|
30125
|
-
// ../api/dist/chunk-
|
|
30125
|
+
// ../api/dist/chunk-S4NT6FUM.mjs
|
|
30126
30126
|
var import_dataloader = __toESM(require_dataloader(), 1);
|
|
30127
30127
|
|
|
30128
30128
|
// ../../node_modules/.pnpm/@escape.tech+graphql-armor@3.2.0_@envelop+core@5.5.1_@escape.tech+graphql-armor-types@0.7.0/node_modules/@escape.tech/graphql-armor/dist/graphql-armor.esm.js
|
|
@@ -30880,7 +30880,7 @@ var EnvelopArmor = class {
|
|
|
30880
30880
|
}
|
|
30881
30881
|
};
|
|
30882
30882
|
|
|
30883
|
-
// ../api/dist/chunk-
|
|
30883
|
+
// ../api/dist/chunk-S4NT6FUM.mjs
|
|
30884
30884
|
var DateTimeScalar = new GraphQLScalarType({
|
|
30885
30885
|
name: "DateTime",
|
|
30886
30886
|
description: "ISO-8601 date-time string",
|
|
@@ -30975,14 +30975,14 @@ var SortOrderEnum = new GraphQLEnumType({
|
|
|
30975
30975
|
values: { ASC: { value: "asc" }, DESC: { value: "desc" } }
|
|
30976
30976
|
});
|
|
30977
30977
|
var SORTABLE = [
|
|
30978
|
-
{ gql: "title",
|
|
30979
|
-
{ gql: "createdAt",
|
|
30980
|
-
{ gql: "updatedAt",
|
|
30978
|
+
{ gql: "title", value: "title" },
|
|
30979
|
+
{ gql: "createdAt", value: "created_at" },
|
|
30980
|
+
{ gql: "updatedAt", value: "updated_at" }
|
|
30981
30981
|
];
|
|
30982
30982
|
function buildSortFieldEnum(typeName) {
|
|
30983
30983
|
return new GraphQLEnumType({
|
|
30984
30984
|
name: `${typeName}SortField`,
|
|
30985
|
-
values: Object.fromEntries(SORTABLE.map((s) => [s.gql, { value: s.
|
|
30985
|
+
values: Object.fromEntries(SORTABLE.map((s) => [s.gql, { value: s.value }]))
|
|
30986
30986
|
});
|
|
30987
30987
|
}
|
|
30988
30988
|
function comparableFilterInput(name, scalar) {
|
|
@@ -31108,11 +31108,13 @@ function collectionResolver(typeName, nameMap, fieldKeys) {
|
|
|
31108
31108
|
throw codeError("INVALID_PAGINATION", "perPage must be between 1 and 100");
|
|
31109
31109
|
}
|
|
31110
31110
|
const repo = ctx.repos[typeName];
|
|
31111
|
+
const sortBy = args.sortBy ?? "created_at";
|
|
31112
|
+
const sortColumn = fieldKeys?.columnFor(sortBy) ?? sortBy;
|
|
31111
31113
|
const result = await repo.findMany({
|
|
31112
31114
|
published_only: true,
|
|
31113
31115
|
page,
|
|
31114
31116
|
per_page: perPage,
|
|
31115
|
-
sort_by:
|
|
31117
|
+
sort_by: sortColumn,
|
|
31116
31118
|
sort_order: args.sortOrder ?? "asc",
|
|
31117
31119
|
filters: translateFilters(args.filter, nameMap, fieldKeys?.columnFor)
|
|
31118
31120
|
});
|
package/dist/index.js
CHANGED
|
@@ -47122,6 +47122,52 @@ function createProgrammaticResolver(resolvers, options) {
|
|
|
47122
47122
|
}
|
|
47123
47123
|
return { resolveItem, resolveList, hasSchema };
|
|
47124
47124
|
}
|
|
47125
|
+
function isPlainRow(v2) {
|
|
47126
|
+
return typeof v2 === "object" && v2 !== null && !Array.isArray(v2) && !(v2 instanceof Date);
|
|
47127
|
+
}
|
|
47128
|
+
var MEDIA_FIELD_TYPES = /* @__PURE__ */ new Set(["image", "video", "file"]);
|
|
47129
|
+
function nestedTargets(fields) {
|
|
47130
|
+
const out = [];
|
|
47131
|
+
for (const f of fields) {
|
|
47132
|
+
if (MEDIA_FIELD_TYPES.has(f.field_type)) continue;
|
|
47133
|
+
if (f.field_type !== "paragraph" && f.field_type !== "reference") continue;
|
|
47134
|
+
const ref = f.ui_component.ref;
|
|
47135
|
+
if (!ref) continue;
|
|
47136
|
+
out.push({ label: f.name, target: ref });
|
|
47137
|
+
}
|
|
47138
|
+
return out;
|
|
47139
|
+
}
|
|
47140
|
+
function buildProjectors(registry2, fieldKeyMaps) {
|
|
47141
|
+
const projectors = {};
|
|
47142
|
+
const sources = [
|
|
47143
|
+
registry2.content_types,
|
|
47144
|
+
registry2.taxonomy_types,
|
|
47145
|
+
registry2.paragraph_types
|
|
47146
|
+
];
|
|
47147
|
+
for (const source of sources) {
|
|
47148
|
+
for (const [typeName, type] of Object.entries(source)) {
|
|
47149
|
+
const map2 = fieldKeyMaps[typeName];
|
|
47150
|
+
if (!map2) continue;
|
|
47151
|
+
projectors[typeName] = { map: map2, nested: nestedTargets(type.fields) };
|
|
47152
|
+
}
|
|
47153
|
+
}
|
|
47154
|
+
return projectors;
|
|
47155
|
+
}
|
|
47156
|
+
function projectRow(row, typeName, projectors) {
|
|
47157
|
+
const p2 = projectors[typeName];
|
|
47158
|
+
if (!p2) return row;
|
|
47159
|
+
const out = p2.map.toLabels(row);
|
|
47160
|
+
for (const { label, target } of p2.nested) {
|
|
47161
|
+
const v2 = out[label];
|
|
47162
|
+
if (v2 === null || v2 === void 0) continue;
|
|
47163
|
+
if (Array.isArray(v2)) {
|
|
47164
|
+
out[label] = v2.map((item) => isPlainRow(item) ? projectRow(item, target, projectors) : item);
|
|
47165
|
+
} else if (isPlainRow(v2)) {
|
|
47166
|
+
out[label] = projectRow(v2, target, projectors);
|
|
47167
|
+
}
|
|
47168
|
+
}
|
|
47169
|
+
return out;
|
|
47170
|
+
}
|
|
47125
47171
|
var SORTABLE_FIELDS = /* @__PURE__ */ new Set(["title", "created_at", "updated_at"]);
|
|
47126
47172
|
var RELATION_FIELD_TYPES = /* @__PURE__ */ new Set([
|
|
47127
47173
|
"paragraph",
|
|
@@ -47173,7 +47219,7 @@ function parseFilters(url2, validFields, columnFor) {
|
|
|
47173
47219
|
function isPublished(item) {
|
|
47174
47220
|
return item["published"] === true;
|
|
47175
47221
|
}
|
|
47176
|
-
function registerPublicContentRoutes(app, registry2, repos,
|
|
47222
|
+
function registerPublicContentRoutes(app, registry2, repos, projectors, paths, listRateLimit, resolver) {
|
|
47177
47223
|
function registerListRoute(path3, handler) {
|
|
47178
47224
|
if (listRateLimit) {
|
|
47179
47225
|
app.get(path3, listRateLimit, handler);
|
|
@@ -47216,13 +47262,14 @@ function registerPublicContentRoutes(app, registry2, repos, fieldKeyMaps, paths,
|
|
|
47216
47262
|
404
|
|
47217
47263
|
);
|
|
47218
47264
|
}
|
|
47219
|
-
let data =
|
|
47265
|
+
let data = projectRow(result.data[0], typeName, projectors);
|
|
47220
47266
|
if (resolver?.hasSchema(typeName)) data = await resolver.resolveItem(typeName, data);
|
|
47221
47267
|
return c.json({ ok: true, data });
|
|
47222
47268
|
});
|
|
47223
47269
|
} else {
|
|
47224
47270
|
registerListRoute(paths.collection(basePath), async (c) => {
|
|
47225
|
-
const
|
|
47271
|
+
const projector = projectors[typeName];
|
|
47272
|
+
const fieldKeys = projector.map;
|
|
47226
47273
|
const pagination = parsePagination(c.req.query("page"), c.req.query("per_page"));
|
|
47227
47274
|
if (!pagination.ok) {
|
|
47228
47275
|
return c.json(
|
|
@@ -47290,17 +47337,18 @@ function registerPublicContentRoutes(app, registry2, repos, fieldKeyMaps, paths,
|
|
|
47290
47337
|
);
|
|
47291
47338
|
}
|
|
47292
47339
|
}
|
|
47340
|
+
const sortColumn = fieldKeys.columnFor(sortBy) ?? sortBy;
|
|
47293
47341
|
const result = await repo.findMany({
|
|
47294
47342
|
published_only: true,
|
|
47295
47343
|
page: pagination.page,
|
|
47296
47344
|
per_page: pagination.per_page,
|
|
47297
|
-
sort_by:
|
|
47345
|
+
sort_by: sortColumn,
|
|
47298
47346
|
sort_order: sortOrder,
|
|
47299
47347
|
filters: filtersResult.filters,
|
|
47300
47348
|
include
|
|
47301
47349
|
});
|
|
47302
47350
|
const labeled = result.data.map(
|
|
47303
|
-
(row) =>
|
|
47351
|
+
(row) => projectRow(row, typeName, projectors)
|
|
47304
47352
|
);
|
|
47305
47353
|
const data = resolver?.hasSchema(typeName) ? await resolver.resolveList(typeName, labeled) : labeled;
|
|
47306
47354
|
return c.json({ ...result, data });
|
|
@@ -47332,7 +47380,7 @@ function registerPublicContentRoutes(app, registry2, repos, fieldKeyMaps, paths,
|
|
|
47332
47380
|
404
|
|
47333
47381
|
);
|
|
47334
47382
|
}
|
|
47335
|
-
let data =
|
|
47383
|
+
let data = projectRow(item, typeName, projectors);
|
|
47336
47384
|
if (resolver?.hasSchema(typeName)) data = await resolver.resolveItem(typeName, data);
|
|
47337
47385
|
return c.json({ ok: true, data });
|
|
47338
47386
|
});
|
|
@@ -47360,9 +47408,8 @@ function registerPublicContentRoutes(app, registry2, repos, fieldKeyMaps, paths,
|
|
|
47360
47408
|
page: pagination.page,
|
|
47361
47409
|
per_page: pagination.per_page
|
|
47362
47410
|
});
|
|
47363
|
-
const fieldKeys = fieldKeyMaps[typeName];
|
|
47364
47411
|
const labeled = result.data.map(
|
|
47365
|
-
(row) =>
|
|
47412
|
+
(row) => projectRow(row, typeName, projectors)
|
|
47366
47413
|
);
|
|
47367
47414
|
const data = resolver?.hasSchema(typeName) ? await resolver.resolveList(typeName, labeled) : labeled;
|
|
47368
47415
|
return c.json({ ...result, data });
|
|
@@ -47379,7 +47426,7 @@ function registerPublicContentRoutes(app, registry2, repos, fieldKeyMaps, paths,
|
|
|
47379
47426
|
404
|
|
47380
47427
|
);
|
|
47381
47428
|
}
|
|
47382
|
-
let data =
|
|
47429
|
+
let data = projectRow(item, typeName, projectors);
|
|
47383
47430
|
if (resolver?.hasSchema(typeName)) data = await resolver.resolveItem(typeName, data);
|
|
47384
47431
|
return c.json({ ok: true, data });
|
|
47385
47432
|
});
|
|
@@ -47584,7 +47631,7 @@ function parseListQuery(url2, schemaFieldNames, relationFieldNames, columnFor) {
|
|
|
47584
47631
|
search
|
|
47585
47632
|
};
|
|
47586
47633
|
}
|
|
47587
|
-
function registerAdminContentRoutes(app, registry2, repos,
|
|
47634
|
+
function registerAdminContentRoutes(app, registry2, repos, projectors, mediaRepo, requirePermission, db) {
|
|
47588
47635
|
for (const [typeName, contentType] of Object.entries(registry2.content_types)) {
|
|
47589
47636
|
const basePath = `content/${typeName}`;
|
|
47590
47637
|
const repo = repos[typeName];
|
|
@@ -47596,7 +47643,8 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
47596
47643
|
const relationFieldNames = new Set(
|
|
47597
47644
|
contentType.fields.filter((f) => RELATION_FIELD_TYPES.has(f.field_type)).map((f) => f.name)
|
|
47598
47645
|
);
|
|
47599
|
-
const
|
|
47646
|
+
const projector = projectors[typeName];
|
|
47647
|
+
const fieldKeys = projector.map;
|
|
47600
47648
|
const requiredFields = contentType.fields.filter((f) => f.required);
|
|
47601
47649
|
const mediaFields = contentType.fields.filter(
|
|
47602
47650
|
(f) => f.field_type === "image" || f.field_type === "video" || f.field_type === "file"
|
|
@@ -47617,10 +47665,11 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
47617
47665
|
const publishedParam = c.req.query("published");
|
|
47618
47666
|
const extraFilters = {};
|
|
47619
47667
|
if (publishedParam === "false") extraFilters["published"] = false;
|
|
47668
|
+
const sortColumn = fieldKeys.columnFor(parsed.sortBy) ?? parsed.sortBy;
|
|
47620
47669
|
const findOpts = {
|
|
47621
47670
|
page: parsed.pagination.page,
|
|
47622
47671
|
per_page: parsed.pagination.per_page,
|
|
47623
|
-
sort_by:
|
|
47672
|
+
sort_by: sortColumn,
|
|
47624
47673
|
sort_order: parsed.sortOrder,
|
|
47625
47674
|
filters: { ...parsed.filters, ...extraFilters },
|
|
47626
47675
|
include: parsed.include
|
|
@@ -47630,7 +47679,9 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
47630
47679
|
findOpts.search = { term: parsed.search, columns: searchableColumns };
|
|
47631
47680
|
}
|
|
47632
47681
|
const result = await repo.findMany(findOpts);
|
|
47633
|
-
const data = result.data.map(
|
|
47682
|
+
const data = result.data.map(
|
|
47683
|
+
(row) => projectRow(row, typeName, projectors)
|
|
47684
|
+
);
|
|
47634
47685
|
return c.json({ ...result, data });
|
|
47635
47686
|
}
|
|
47636
47687
|
);
|
|
@@ -47666,7 +47717,7 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
47666
47717
|
}
|
|
47667
47718
|
}
|
|
47668
47719
|
}
|
|
47669
|
-
const data =
|
|
47720
|
+
const data = projectRow(item, typeName, projectors);
|
|
47670
47721
|
return c.json({ ok: true, data });
|
|
47671
47722
|
}
|
|
47672
47723
|
);
|
|
@@ -47807,7 +47858,7 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
47807
47858
|
}
|
|
47808
47859
|
}
|
|
47809
47860
|
await applyMediaReferenceDelta(mergeMediaDeltas(...mediaDeltas), mediaRepo);
|
|
47810
|
-
const data =
|
|
47861
|
+
const data = projectRow(item, typeName, projectors);
|
|
47811
47862
|
return c.json({ ok: true, data }, 201);
|
|
47812
47863
|
};
|
|
47813
47864
|
app.patch(
|
|
@@ -47928,7 +47979,7 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
47928
47979
|
}
|
|
47929
47980
|
}
|
|
47930
47981
|
await applyMediaReferenceDelta(mergeMediaDeltas(...mediaDeltas), mediaRepo);
|
|
47931
|
-
const data =
|
|
47982
|
+
const data = projectRow(updated, typeName, projectors);
|
|
47932
47983
|
return c.json({ ok: true, data });
|
|
47933
47984
|
};
|
|
47934
47985
|
if (contentType.only_one) {
|
|
@@ -47989,7 +48040,8 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
47989
48040
|
const relationFieldNames = new Set(
|
|
47990
48041
|
taxonomyType.fields.filter((f) => RELATION_FIELD_TYPES.has(f.field_type)).map((f) => f.name)
|
|
47991
48042
|
);
|
|
47992
|
-
const
|
|
48043
|
+
const projector = projectors[typeName];
|
|
48044
|
+
const fieldKeys = projector.map;
|
|
47993
48045
|
const requiredFields = taxonomyType.fields.filter((f) => f.required);
|
|
47994
48046
|
const mediaFields = taxonomyType.fields.filter(
|
|
47995
48047
|
(f) => f.field_type === "image" || f.field_type === "video" || f.field_type === "file"
|
|
@@ -48010,10 +48062,11 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
48010
48062
|
const publishedParam = c.req.query("published");
|
|
48011
48063
|
const extraFilters = {};
|
|
48012
48064
|
if (publishedParam === "false") extraFilters["published"] = false;
|
|
48065
|
+
const sortColumn = fieldKeys.columnFor(parsed.sortBy) ?? parsed.sortBy;
|
|
48013
48066
|
const findOpts = {
|
|
48014
48067
|
page: parsed.pagination.page,
|
|
48015
48068
|
per_page: parsed.pagination.per_page,
|
|
48016
|
-
sort_by:
|
|
48069
|
+
sort_by: sortColumn,
|
|
48017
48070
|
sort_order: parsed.sortOrder,
|
|
48018
48071
|
filters: { ...parsed.filters, ...extraFilters },
|
|
48019
48072
|
include: parsed.include
|
|
@@ -48023,7 +48076,9 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
48023
48076
|
findOpts.search = { term: parsed.search, columns: searchableColumns };
|
|
48024
48077
|
}
|
|
48025
48078
|
const result = await repo.findMany(findOpts);
|
|
48026
|
-
const data = result.data.map(
|
|
48079
|
+
const data = result.data.map(
|
|
48080
|
+
(row) => projectRow(row, typeName, projectors)
|
|
48081
|
+
);
|
|
48027
48082
|
return c.json({ ...result, data });
|
|
48028
48083
|
}
|
|
48029
48084
|
);
|
|
@@ -48039,7 +48094,7 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
48039
48094
|
404
|
|
48040
48095
|
);
|
|
48041
48096
|
}
|
|
48042
|
-
const data =
|
|
48097
|
+
const data = projectRow(item, typeName, projectors);
|
|
48043
48098
|
return c.json({ ok: true, data });
|
|
48044
48099
|
}
|
|
48045
48100
|
);
|
|
@@ -48092,7 +48147,7 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
48092
48147
|
}
|
|
48093
48148
|
}
|
|
48094
48149
|
await applyMediaReferenceDelta(mergeMediaDeltas(...mediaDeltas), mediaRepo);
|
|
48095
|
-
const data =
|
|
48150
|
+
const data = projectRow(item, typeName, projectors);
|
|
48096
48151
|
return c.json({ ok: true, data }, 201);
|
|
48097
48152
|
}
|
|
48098
48153
|
);
|
|
@@ -48160,7 +48215,7 @@ function registerAdminContentRoutes(app, registry2, repos, fieldKeyMaps, mediaRe
|
|
|
48160
48215
|
}
|
|
48161
48216
|
}
|
|
48162
48217
|
await applyMediaReferenceDelta(mergeMediaDeltas(...mediaDeltas), mediaRepo);
|
|
48163
|
-
const data =
|
|
48218
|
+
const data = projectRow(updated, typeName, projectors);
|
|
48164
48219
|
return c.json({ ok: true, data });
|
|
48165
48220
|
}
|
|
48166
48221
|
);
|
|
@@ -49134,7 +49189,7 @@ function registerUserRoutes(app, db, requirePermission, requireHierarchy) {
|
|
|
49134
49189
|
}
|
|
49135
49190
|
var API_VERSION = (() => {
|
|
49136
49191
|
try {
|
|
49137
|
-
return "0.4.
|
|
49192
|
+
return "0.4.1";
|
|
49138
49193
|
} catch {
|
|
49139
49194
|
return "0.0.0";
|
|
49140
49195
|
}
|
|
@@ -49289,7 +49344,7 @@ function whereFragment(conds) {
|
|
|
49289
49344
|
return conds.length > 0 ? sql` WHERE ${sql.join(conds, sql` AND `)}` : sql``;
|
|
49290
49345
|
}
|
|
49291
49346
|
function createDrizzleContentRepository(db, tableName, options = {}) {
|
|
49292
|
-
const { relations = {}, publishedRelations = false } = options;
|
|
49347
|
+
const { relations = {}, publishedRelations = false, sortableColumns } = options;
|
|
49293
49348
|
function tableRaw() {
|
|
49294
49349
|
return sql.raw(quoteIdent2(tableName));
|
|
49295
49350
|
}
|
|
@@ -49327,8 +49382,9 @@ function createDrizzleContentRepository(db, tableName, options = {}) {
|
|
|
49327
49382
|
sort_order = "asc",
|
|
49328
49383
|
search
|
|
49329
49384
|
} = opts;
|
|
49330
|
-
|
|
49331
|
-
|
|
49385
|
+
const allowed = sortableColumns ?? SORTABLE_FIELDS2;
|
|
49386
|
+
if (!allowed.has(sort_by)) {
|
|
49387
|
+
throw codeError("INVALID_SORT_FIELD", `'${sort_by}' is not sortable.`);
|
|
49332
49388
|
}
|
|
49333
49389
|
const offset = (page - 1) * per_page;
|
|
49334
49390
|
const conds = buildConditions(published_only, filters, search);
|
|
@@ -49567,16 +49623,38 @@ function createCmsApp(options) {
|
|
|
49567
49623
|
return result.rows[0]?.role ?? null;
|
|
49568
49624
|
};
|
|
49569
49625
|
const requireHierarchy = createHierarchyMiddleware(rolesRegistry, getUserRole);
|
|
49626
|
+
const fieldKeyMaps = Object.fromEntries([
|
|
49627
|
+
...Object.entries(registry2.content_types).map(([typeName, ct2]) => [
|
|
49628
|
+
typeName,
|
|
49629
|
+
createFieldKeyMap(ct2.fields)
|
|
49630
|
+
]),
|
|
49631
|
+
...Object.entries(registry2.taxonomy_types).map(([typeName, tt2]) => [
|
|
49632
|
+
typeName,
|
|
49633
|
+
createFieldKeyMap(tt2.fields)
|
|
49634
|
+
]),
|
|
49635
|
+
...Object.entries(registry2.paragraph_types).map(([typeName, pt]) => [
|
|
49636
|
+
typeName,
|
|
49637
|
+
createFieldKeyMap(pt.fields)
|
|
49638
|
+
])
|
|
49639
|
+
]);
|
|
49640
|
+
const projectors = buildProjectors(registry2, fieldKeyMaps);
|
|
49641
|
+
const sortableColumnsFor = (typeName) => new Set(
|
|
49642
|
+
[...SORTABLE_FIELDS].map((label) => fieldKeyMaps[typeName].columnFor(label) ?? label)
|
|
49643
|
+
);
|
|
49570
49644
|
const contentRepos = Object.fromEntries(
|
|
49571
49645
|
Object.entries(registry2.content_types).map(([typeName, ct2]) => [
|
|
49572
49646
|
typeName,
|
|
49573
|
-
createDrizzleContentRepository(db, ct2.db.table_name
|
|
49647
|
+
createDrizzleContentRepository(db, ct2.db.table_name, {
|
|
49648
|
+
sortableColumns: sortableColumnsFor(typeName)
|
|
49649
|
+
})
|
|
49574
49650
|
])
|
|
49575
49651
|
);
|
|
49576
49652
|
const taxonomyRepos = Object.fromEntries(
|
|
49577
49653
|
Object.entries(registry2.taxonomy_types).map(([typeName, tt2]) => [
|
|
49578
49654
|
typeName,
|
|
49579
|
-
createDrizzleContentRepository(db, tt2.db.table_name
|
|
49655
|
+
createDrizzleContentRepository(db, tt2.db.table_name, {
|
|
49656
|
+
sortableColumns: sortableColumnsFor(typeName)
|
|
49657
|
+
})
|
|
49580
49658
|
])
|
|
49581
49659
|
);
|
|
49582
49660
|
const repos = { ...contentRepos, ...taxonomyRepos };
|
|
@@ -49586,7 +49664,8 @@ function createCmsApp(options) {
|
|
|
49586
49664
|
typeName,
|
|
49587
49665
|
createDrizzleContentRepository(db, ct2.db.table_name, {
|
|
49588
49666
|
relations: buildRelationsMap(ct2.fields, registry2),
|
|
49589
|
-
publishedRelations: true
|
|
49667
|
+
publishedRelations: true,
|
|
49668
|
+
sortableColumns: sortableColumnsFor(typeName)
|
|
49590
49669
|
})
|
|
49591
49670
|
])
|
|
49592
49671
|
);
|
|
@@ -49595,7 +49674,8 @@ function createCmsApp(options) {
|
|
|
49595
49674
|
typeName,
|
|
49596
49675
|
createDrizzleContentRepository(db, tt2.db.table_name, {
|
|
49597
49676
|
relations: buildRelationsMap(tt2.fields, registry2),
|
|
49598
|
-
publishedRelations: true
|
|
49677
|
+
publishedRelations: true,
|
|
49678
|
+
sortableColumns: sortableColumnsFor(typeName)
|
|
49599
49679
|
})
|
|
49600
49680
|
])
|
|
49601
49681
|
);
|
|
@@ -49603,11 +49683,15 @@ function createCmsApp(options) {
|
|
|
49603
49683
|
const graphqlRepos = Object.fromEntries([
|
|
49604
49684
|
...Object.entries(registry2.content_types).map(([typeName, ct2]) => [
|
|
49605
49685
|
typeName,
|
|
49606
|
-
createDrizzleContentRepository(db, ct2.db.table_name
|
|
49686
|
+
createDrizzleContentRepository(db, ct2.db.table_name, {
|
|
49687
|
+
sortableColumns: sortableColumnsFor(typeName)
|
|
49688
|
+
})
|
|
49607
49689
|
]),
|
|
49608
49690
|
...Object.entries(registry2.taxonomy_types).map(([typeName, tt2]) => [
|
|
49609
49691
|
typeName,
|
|
49610
|
-
createDrizzleContentRepository(db, tt2.db.table_name
|
|
49692
|
+
createDrizzleContentRepository(db, tt2.db.table_name, {
|
|
49693
|
+
sortableColumns: sortableColumnsFor(typeName)
|
|
49694
|
+
})
|
|
49611
49695
|
])
|
|
49612
49696
|
]);
|
|
49613
49697
|
registerAuthRoutes(app, db);
|
|
@@ -49648,23 +49732,13 @@ function createCmsApp(options) {
|
|
|
49648
49732
|
paths: {}
|
|
49649
49733
|
})
|
|
49650
49734
|
);
|
|
49651
|
-
|
|
49652
|
-
...Object.entries(registry2.content_types).map(([typeName, ct2]) => [
|
|
49653
|
-
typeName,
|
|
49654
|
-
createFieldKeyMap(ct2.fields)
|
|
49655
|
-
]),
|
|
49656
|
-
...Object.entries(registry2.taxonomy_types).map(([typeName, tt2]) => [
|
|
49657
|
-
typeName,
|
|
49658
|
-
createFieldKeyMap(tt2.fields)
|
|
49659
|
-
])
|
|
49660
|
-
]);
|
|
49661
|
-
registerPublicContentRoutes(app, registry2, publicRepos, fieldKeyMaps, publicPaths, listRateLimit, programmaticResolver);
|
|
49735
|
+
registerPublicContentRoutes(app, registry2, publicRepos, projectors, publicPaths, listRateLimit, programmaticResolver);
|
|
49662
49736
|
registerPublicMediaRoutes(app, mediaRepo, publicPaths, listRateLimit);
|
|
49663
49737
|
if (options.graphql?.enabled) {
|
|
49664
49738
|
const gqlOptions = options.graphql;
|
|
49665
49739
|
let gqlHandler = null;
|
|
49666
49740
|
let initError = null;
|
|
49667
|
-
const ready = import("./handler-
|
|
49741
|
+
const ready = import("./handler-7LVYEU5C-ZAJVEGKT.js").then(({ createGraphQLHandler }) => {
|
|
49668
49742
|
gqlHandler = createGraphQLHandler(registry2, graphqlRepos, fieldKeyMaps, programmaticResolver, db, gqlOptions);
|
|
49669
49743
|
}).catch((err) => {
|
|
49670
49744
|
initError = err;
|
|
@@ -49705,7 +49779,7 @@ function createCmsApp(options) {
|
|
|
49705
49779
|
);
|
|
49706
49780
|
registerSchemaRoute(app, registry2, db);
|
|
49707
49781
|
registerUserRoutes(app, db, requirePermission, requireHierarchy);
|
|
49708
|
-
registerAdminContentRoutes(app, registry2, repos,
|
|
49782
|
+
registerAdminContentRoutes(app, registry2, repos, projectors, mediaRepo, requirePermission, db);
|
|
49709
49783
|
registerAdminMediaRoutes(app, mediaRepo, storage, requirePermission, maxFileSize);
|
|
49710
49784
|
return { prefix, app };
|
|
49711
49785
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bobbykim/manguito-cms-cli",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Bobby Kim <bobby.sihun.kim@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/bobbykim89/manguito-cms",
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
"tsup": "^8.5.1",
|
|
30
30
|
"typescript": "^6.0.3",
|
|
31
31
|
"vite": "^8.1.3",
|
|
32
|
-
"@bobbykim/manguito-cms-api": "0.4.0",
|
|
33
|
-
"@bobbykim/manguito-cms-core": "0.3.0",
|
|
34
32
|
"@bobbykim/manguito-cms-admin": "0.4.0",
|
|
35
|
-
"@bobbykim/manguito-cms-
|
|
33
|
+
"@bobbykim/manguito-cms-core": "0.3.0",
|
|
34
|
+
"@bobbykim/manguito-cms-db": "0.1.3",
|
|
35
|
+
"@bobbykim/manguito-cms-api": "0.4.1"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^25.9.5",
|