@paroicms/server 1.117.3 → 1.118.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 (49) hide show
  1. package/README.md +1 -1
  2. package/dist/admin-backend/document/document-moving.queries.d.ts +5 -0
  3. package/dist/admin-backend/document/document-moving.queries.js +166 -0
  4. package/dist/admin-backend/document/document-moving.queries.js.map +1 -0
  5. package/dist/admin-backend/document/document.resolver.js +37 -10
  6. package/dist/admin-backend/document/document.resolver.js.map +1 -1
  7. package/dist/admin-backend/document/load-documents.queries.js +4 -1
  8. package/dist/admin-backend/document/load-documents.queries.js.map +1 -1
  9. package/dist/admin-backend/event-log/event-log.types.d.ts +14 -1
  10. package/dist/admin-backend/fields/fields.resolver.d.ts +1 -1
  11. package/dist/admin-backend/fields/fields.resolver.js +2 -2
  12. package/dist/admin-backend/fields/fields.resolver.js.map +1 -1
  13. package/dist/admin-backend/lnode/{lnode-wrap.resolver.d.ts → document-list.resolver.d.ts} +1 -1
  14. package/dist/admin-backend/lnode/{lnode-wrap.resolver.js → document-list.resolver.js} +16 -18
  15. package/dist/admin-backend/lnode/document-list.resolver.js.map +1 -0
  16. package/dist/admin-backend/lnode/lnode.queries.d.ts +7 -14
  17. package/dist/admin-backend/lnode/lnode.queries.js +130 -67
  18. package/dist/admin-backend/lnode/lnode.queries.js.map +1 -1
  19. package/dist/admin-backend/lnode/redirect-lnode.queries.d.ts +26 -0
  20. package/dist/admin-backend/lnode/redirect-lnode.queries.js +82 -0
  21. package/dist/admin-backend/lnode/redirect-lnode.queries.js.map +1 -0
  22. package/dist/admin-backend/node/node.resolver.extend.d.ts +1 -1
  23. package/dist/admin-backend/node/node.resolver.extend.js +2 -2
  24. package/dist/admin-backend/node/node.resolver.extend.js.map +1 -1
  25. package/dist/admin-backend/part/part.resolver.extend.d.ts +1 -1
  26. package/dist/admin-backend/part/part.resolver.extend.js +2 -2
  27. package/dist/admin-backend/part/part.resolver.extend.js.map +1 -1
  28. package/dist/admin-backend/part/part.resolver.js +4 -4
  29. package/dist/admin-backend/part/part.resolver.js.map +1 -1
  30. package/dist/admin-backend/routing-cluster/routing-cluster.resolver.js +2 -2
  31. package/dist/admin-backend/routing-cluster/routing-cluster.resolver.js.map +1 -1
  32. package/dist/common/data-format.d.ts +3 -1
  33. package/dist/common/data-format.js +4 -2
  34. package/dist/common/data-format.js.map +1 -1
  35. package/dist/connector/db-init/init-node-queries.d.ts +4 -0
  36. package/dist/connector/db-init/init-node-queries.js +1 -1
  37. package/dist/connector/db-init/init-node-queries.js.map +1 -1
  38. package/dist/connector/row-types.d.ts +1 -0
  39. package/dist/graphql/apollo-server-init.js +8 -10
  40. package/dist/graphql/apollo-server-init.js.map +1 -1
  41. package/dist/running-server/running-server-connector.js +9 -0
  42. package/dist/running-server/running-server-connector.js.map +1 -1
  43. package/dist/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +7 -7
  45. package/schema.graphql +55 -39
  46. package/dist/admin-backend/document/document.resolver.extend.d.ts +0 -3
  47. package/dist/admin-backend/document/document.resolver.extend.js +0 -16
  48. package/dist/admin-backend/document/document.resolver.extend.js.map +0 -1
  49. package/dist/admin-backend/lnode/lnode-wrap.resolver.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paroicms/server",
3
- "version": "1.117.3",
3
+ "version": "1.118.0",
4
4
  "description": "The ParoiCMS server",
5
5
  "keywords": [
6
6
  "cms",
@@ -38,16 +38,16 @@
38
38
  "dependencies": {
39
39
  "@apollo/server": "~5.4.0",
40
40
  "@as-integrations/express5": "~1.1.2",
41
- "@paroicms/admin-ui": "1.90.13",
41
+ "@paroicms/admin-ui": "1.91.0",
42
42
  "@paroicms/internal-anywhere-lib": "1.37.5",
43
- "@paroicms/internal-server-lib": "1.24.1",
43
+ "@paroicms/internal-server-lib": "1.24.2",
44
44
  "@paroicms/playground_demo1": "0.68.1",
45
45
  "@paroicms/public-anywhere-lib": "0.42.1",
46
- "@paroicms/public-server-lib": "0.52.1",
46
+ "@paroicms/public-server-lib": "0.53.0",
47
47
  "@paroicms/script-lib": "0.3.17",
48
- "@paroicms/server-database-media-storage": "1.26.8",
49
- "@paroicms/server-image-cache-engine": "1.29.23",
50
- "@paroicms/server-text-cache-system": "1.21.23",
48
+ "@paroicms/server-database-media-storage": "1.26.9",
49
+ "@paroicms/server-image-cache-engine": "1.29.24",
50
+ "@paroicms/server-text-cache-system": "1.21.24",
51
51
  "archiver": "~7.0.1",
52
52
  "arktype": "~2.2.0",
53
53
  "bcrypt": "~6.0.0",
package/schema.graphql CHANGED
@@ -11,7 +11,7 @@ type Query {
11
11
  accountRoles(accountId: ID!): [String!]!
12
12
 
13
13
  # Document
14
- document(id: ID!): Document!
14
+ document(documentId: ID!): Document!
15
15
  searchDocuments(
16
16
  language: String!
17
17
  limit: Int!
@@ -19,21 +19,26 @@ type Query {
19
19
  queryString: String!
20
20
  offset: Int!
21
21
  ): PagedDocuments!
22
+ searchRedirectLNodes(
23
+ language: String!
24
+ queryString: String!
25
+ limit: Int!
26
+ offset: Int!
27
+ ): PagedRedirectLNodes!
22
28
 
23
29
  # Parts
24
30
  partsOf(documentId: ID!): [PartOrPlaceholder!]
25
- part(lNodeId: ID!): Part!
31
+ part(partId: ID!): Part!
26
32
 
27
33
  # Nodes
28
34
  pagedChildDocuments(
29
35
  limit: Int!
30
36
  sorting: [SortRule!]
31
- parentLNodeId: ID!
37
+ parentDocumentId: ID!
32
38
  offset: Int!
33
39
  missingInLanguage: Boolean
34
40
  ): PagedDocuments!
35
- lNodeWrap(lNodeId: ID!): LNodeWrap!
36
- lNodeWraps(parentLNodeId: ID!): [LNodeWrap!]!
41
+ documents(parentDocumentId: ID!): [Document!]!
37
42
  translationsOf(nodeId: ID!): [String!]!
38
43
 
39
44
  # Fields
@@ -182,22 +187,37 @@ type BackupListResult {
182
187
  type BreadcrumbItem {
183
188
  language: String!
184
189
  nodeId: ID!
185
- lNodeId: ID!
190
+ documentId: ID!
186
191
  title: String
187
192
  typeName: String!
188
193
  }
189
194
 
190
195
  type Document {
191
- featuredImage: Media
192
- featuredImageHandle: String!
196
+ documentId: ID!
193
197
  language: String!
194
198
  nodeId: ID!
199
+ ready: Boolean!
200
+ updatedAt: DateTime!
201
+ title: String
202
+ slug: String
195
203
  metaDescription: String
196
204
  metaKeywords: String
197
- lNodeId: ID!
198
- slug: String
199
- title: String
205
+ featuredImageHandle: String!
206
+ featuredImage: Media
200
207
  url: String
208
+ translatedInto: [String!]!
209
+ """
210
+ Ordered from home to target node
211
+ """
212
+ breadcrumb: [BreadcrumbItem!]!
213
+ """
214
+ A stringified `ReadFieldValues`
215
+ """
216
+ fieldValues(fieldNames: [String!], preprocess: PreprocessFields): String!
217
+ node: Node!
218
+ parts: [PartOrPlaceholder!]
219
+ translations: [LNodeTranslation!]!
220
+ parentLanguages: [String!]!
201
221
  }
202
222
 
203
223
  type FieldValuesOfList {
@@ -245,11 +265,25 @@ type ImageVariant {
245
265
  }
246
266
 
247
267
  type PagedDocuments {
248
- items: [LNodeWrap!]!
268
+ items: [Document!]!
249
269
  offset: Int!
250
270
  total: Int!
251
271
  }
252
272
 
273
+ type RedirectLNode {
274
+ nodeId: ID!
275
+ language: String!
276
+ typeName: String!
277
+ title: String!
278
+ breadcrumb: [BreadcrumbItem!]!
279
+ }
280
+
281
+ type PagedRedirectLNodes {
282
+ items: [RedirectLNode!]!
283
+ total: Int!
284
+ offset: Int!
285
+ }
286
+
253
287
  union PartOrPlaceholder = Part | PartPlaceholder
254
288
 
255
289
  type Part {
@@ -349,28 +383,6 @@ type LNodeTranslation {
349
383
  lNodeId: ID!
350
384
  }
351
385
 
352
- type LNodeWrap {
353
- lNodeId: ID!
354
- language: String!
355
- nodeId: ID!
356
- ready: Boolean!
357
- updatedAt: DateTime!
358
- translatedInto: [String!]!
359
- """
360
- Ordered from home to target node
361
- """
362
- breadcrumb: [BreadcrumbItem!]!
363
- document: Document
364
- """
365
- A stringified `ReadFieldValues`
366
- """
367
- fieldValues(fieldNames: [String!], preprocess: PreprocessFields): String!
368
- node: Node!
369
- parts: [PartOrPlaceholder!]
370
- translations: [LNodeTranslation!]!
371
- parentLanguages: [String!]!
372
- }
373
-
374
386
  type HistoryEntry {
375
387
  id: ID!
376
388
  updatedAt: DateTime!
@@ -430,9 +442,13 @@ type Mutation {
430
442
 
431
443
  # Document
432
444
  createDocumentOnNode(language: String!, nodeId: ID!, values: CreateDocumentValues): Document!
433
- createNodeWithDocument(parentLNodeId: String!, values: CreateNodeWithDocumentValues!): Document!
434
- deleteDocument(lNodeId: String!): Boolean!
435
- deleteNodeAndDocuments(lNodeId: String!): Boolean!
445
+ createNodeWithDocument(
446
+ parentDocumentId: String!
447
+ values: CreateNodeWithDocumentValues!
448
+ ): Document!
449
+ deleteDocument(documentId: String!): Boolean!
450
+ deleteNodeAndDocuments(documentId: String!): Boolean!
451
+ moveDocument(documentNodeId: String!, newParentNodeId: String!): Boolean!
436
452
  reorderDocuments(nodeIds: [String!]!, parentNodeId: String!): [String!]!
437
453
  """
438
454
  valuesJson is a stringified `UpdateDocumentMetadataValues`
@@ -446,7 +462,7 @@ type Mutation {
446
462
  """
447
463
  language:nodeId
448
464
  """
449
- lNodeId: ID!
465
+ partId: ID!
450
466
  ): Boolean!
451
467
  movePart(partNodeId: String!, newParentNodeId: String!, newListName: String!): Boolean!
452
468
  reorderParts(nodeIds: [String!]!, listName: String!, parentNodeId: String!): [String!]!
@@ -481,7 +497,7 @@ type Mutation {
481
497
  requestJson parameter is a stringified `ClusterManagementRequest`
482
498
  """
483
499
  manageClusterRoutingDocuments(requestJson: String!): Boolean!
484
- deleteCluster(rootLNodeId: String!): Boolean!
500
+ deleteCluster(rootDocumentId: String!): Boolean!
485
501
  deleteNodeAndClusters(rootNodeId: String!): Boolean!
486
502
 
487
503
  # Migration
@@ -1,3 +0,0 @@
1
- import type { GqlResolvers } from "../../graphql/generated-graphql-types.d.ts";
2
- import { type GraphqlContext } from "../../graphql/graphql.types.js";
3
- export declare const extendWithDocumentResolver: GqlResolvers<GraphqlContext>;
@@ -1,16 +0,0 @@
1
- import { toDocumentSeed } from "../../common/data-format.js";
2
- import { siteReadyGuard } from "../../graphql/graphql.types.js";
3
- import { findOneDocument } from "./load-documents.queries.js";
4
- export const extendWithDocumentResolver = {
5
- LNodeWrap: {
6
- document: async (parent, _args, { siteContext }) => {
7
- siteReadyGuard(siteContext);
8
- const document = await findOneDocument(siteContext, {
9
- nodeId: parent.nodeId,
10
- language: parent.language,
11
- });
12
- return document ? toDocumentSeed(document) : null;
13
- },
14
- },
15
- };
16
- //# sourceMappingURL=document.resolver.extend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document.resolver.extend.js","sourceRoot":"","sources":["../../../src/admin-backend/document/document.resolver.extend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAuB,MAAM,gCAAgC,CAAC;AAErF,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,0BAA0B,GAAiC;IACtE,SAAS,EAAE;QACT,QAAQ,EAAE,KAAK,EAAE,MAAqB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;YAChE,cAAc,CAAC,WAAW,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE;gBAClD,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpD,CAAC;KACF;CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"lnode-wrap.resolver.js","sourceRoot":"","sources":["../../../src/admin-backend/lnode/lnode-wrap.resolver.ts"],"names":[],"mappings":"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"}