@tinacms/graphql 0.0.0-e0ddb8c-20241004065742 → 0.0.0-e5c0e91-20250421003142
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ast-builder/index.d.ts +0 -1
- package/dist/builder/index.d.ts +2 -2
- package/dist/database/datalayer.d.ts +5 -1
- package/dist/database/index.d.ts +2 -0
- package/dist/index.d.ts +1 -32
- package/dist/index.js +917 -142
- package/dist/index.mjs +879 -112
- package/dist/resolver/index.d.ts +37 -2
- package/dist/resolver/media-utils.d.ts +3 -3
- package/package.json +17 -18
package/dist/index.mjs
CHANGED
|
@@ -68,6 +68,15 @@ var SysFieldDefinition = {
|
|
|
68
68
|
selectionSet: {
|
|
69
69
|
kind: "SelectionSet",
|
|
70
70
|
selections: [
|
|
71
|
+
// {
|
|
72
|
+
// kind: 'Field' as const,
|
|
73
|
+
// name: {
|
|
74
|
+
// kind: 'Name' as const,
|
|
75
|
+
// value: 'title',
|
|
76
|
+
// },
|
|
77
|
+
// arguments: [],
|
|
78
|
+
// directives: [],
|
|
79
|
+
// },
|
|
71
80
|
{
|
|
72
81
|
kind: "Field",
|
|
73
82
|
name: {
|
|
@@ -86,6 +95,15 @@ var SysFieldDefinition = {
|
|
|
86
95
|
arguments: [],
|
|
87
96
|
directives: []
|
|
88
97
|
},
|
|
98
|
+
{
|
|
99
|
+
kind: "Field",
|
|
100
|
+
name: {
|
|
101
|
+
kind: "Name",
|
|
102
|
+
value: "hasReferences"
|
|
103
|
+
},
|
|
104
|
+
arguments: [],
|
|
105
|
+
directives: []
|
|
106
|
+
},
|
|
89
107
|
{
|
|
90
108
|
kind: "Field",
|
|
91
109
|
name: {
|
|
@@ -126,6 +144,10 @@ var SysFieldDefinition = {
|
|
|
126
144
|
}
|
|
127
145
|
};
|
|
128
146
|
var astBuilder = {
|
|
147
|
+
/**
|
|
148
|
+
* `FormFieldBuilder` acts as a shortcut to building an entire `ObjectTypeDefinition`, we use this
|
|
149
|
+
* because all Tina field objects share a common set of fields ('name', 'label', 'component')
|
|
150
|
+
*/
|
|
129
151
|
FormFieldBuilder: ({
|
|
130
152
|
name,
|
|
131
153
|
additionalFields
|
|
@@ -349,6 +371,8 @@ var astBuilder = {
|
|
|
349
371
|
kind: "Name",
|
|
350
372
|
value: name
|
|
351
373
|
},
|
|
374
|
+
// @ts-ignore FIXME; this is being handled properly but we're lying to
|
|
375
|
+
// ts and then fixing it in the `extractInlineTypes` function
|
|
352
376
|
fields
|
|
353
377
|
}),
|
|
354
378
|
UnionTypeDefinition: ({
|
|
@@ -361,6 +385,8 @@ var astBuilder = {
|
|
|
361
385
|
value: name
|
|
362
386
|
},
|
|
363
387
|
directives: [],
|
|
388
|
+
// @ts-ignore FIXME; this is being handled properly but we're lying to
|
|
389
|
+
// ts and then fixing it in the `extractInlineTypes` function
|
|
364
390
|
types: types.map((name2) => ({
|
|
365
391
|
kind: "NamedType",
|
|
366
392
|
name: {
|
|
@@ -457,8 +483,11 @@ var astBuilder = {
|
|
|
457
483
|
string: "String",
|
|
458
484
|
boolean: "Boolean",
|
|
459
485
|
number: "Float",
|
|
486
|
+
// FIXME - needs to be float or int
|
|
460
487
|
datetime: "String",
|
|
488
|
+
// FIXME
|
|
461
489
|
image: "String",
|
|
490
|
+
// FIXME
|
|
462
491
|
text: "String"
|
|
463
492
|
};
|
|
464
493
|
return scalars[type];
|
|
@@ -957,8 +986,7 @@ var astBuilder = {
|
|
|
957
986
|
}
|
|
958
987
|
};
|
|
959
988
|
var capitalize = (s) => {
|
|
960
|
-
if (typeof s !== "string")
|
|
961
|
-
return "";
|
|
989
|
+
if (typeof s !== "string") return "";
|
|
962
990
|
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
963
991
|
};
|
|
964
992
|
var extractInlineTypes = (item) => {
|
|
@@ -1001,41 +1029,6 @@ function* walk(maybeNode, visited = /* @__PURE__ */ new WeakSet()) {
|
|
|
1001
1029
|
yield maybeNode;
|
|
1002
1030
|
visited.add(maybeNode);
|
|
1003
1031
|
}
|
|
1004
|
-
function addNamespaceToSchema(maybeNode, namespace = []) {
|
|
1005
|
-
if (typeof maybeNode === "string") {
|
|
1006
|
-
return maybeNode;
|
|
1007
|
-
}
|
|
1008
|
-
if (typeof maybeNode === "boolean") {
|
|
1009
|
-
return maybeNode;
|
|
1010
|
-
}
|
|
1011
|
-
const newNode = maybeNode;
|
|
1012
|
-
const keys = Object.keys(maybeNode);
|
|
1013
|
-
Object.values(maybeNode).map((m, index) => {
|
|
1014
|
-
const key = keys[index];
|
|
1015
|
-
if (Array.isArray(m)) {
|
|
1016
|
-
newNode[key] = m.map((element) => {
|
|
1017
|
-
if (!element) {
|
|
1018
|
-
return;
|
|
1019
|
-
}
|
|
1020
|
-
if (!element.hasOwnProperty("name")) {
|
|
1021
|
-
return element;
|
|
1022
|
-
}
|
|
1023
|
-
const value = element.name || element.value;
|
|
1024
|
-
return addNamespaceToSchema(element, [...namespace, value]);
|
|
1025
|
-
});
|
|
1026
|
-
} else {
|
|
1027
|
-
if (!m) {
|
|
1028
|
-
return;
|
|
1029
|
-
}
|
|
1030
|
-
if (!m.hasOwnProperty("name")) {
|
|
1031
|
-
newNode[key] = m;
|
|
1032
|
-
} else {
|
|
1033
|
-
newNode[key] = addNamespaceToSchema(m, [...namespace, m.name]);
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1036
|
-
});
|
|
1037
|
-
return { ...newNode, namespace };
|
|
1038
|
-
}
|
|
1039
1032
|
var generateNamespacedFieldName = (names, suffix = "") => {
|
|
1040
1033
|
return (suffix ? [...names, suffix] : names).map(capitalize).join("");
|
|
1041
1034
|
};
|
|
@@ -1195,6 +1188,11 @@ var scalarDefinitions = [
|
|
|
1195
1188
|
required: true,
|
|
1196
1189
|
type: astBuilder.TYPES.String
|
|
1197
1190
|
}),
|
|
1191
|
+
astBuilder.FieldDefinition({
|
|
1192
|
+
name: "hasReferences",
|
|
1193
|
+
required: false,
|
|
1194
|
+
type: astBuilder.TYPES.Boolean
|
|
1195
|
+
}),
|
|
1198
1196
|
astBuilder.FieldDefinition({
|
|
1199
1197
|
name: "breadcrumbs",
|
|
1200
1198
|
required: true,
|
|
@@ -1408,6 +1406,19 @@ var Builder = class {
|
|
|
1408
1406
|
this.addToLookupMap = (lookup) => {
|
|
1409
1407
|
this.lookupMap[lookup.type] = lookup;
|
|
1410
1408
|
};
|
|
1409
|
+
/**
|
|
1410
|
+
* ```graphql
|
|
1411
|
+
* # ex.
|
|
1412
|
+
* {
|
|
1413
|
+
* getCollection(collection: $collection) {
|
|
1414
|
+
* name
|
|
1415
|
+
* documents {...}
|
|
1416
|
+
* }
|
|
1417
|
+
* }
|
|
1418
|
+
* ```
|
|
1419
|
+
*
|
|
1420
|
+
* @param collections
|
|
1421
|
+
*/
|
|
1411
1422
|
this.buildCollectionDefinition = async (collections) => {
|
|
1412
1423
|
const name = "collection";
|
|
1413
1424
|
const typeName = "Collection";
|
|
@@ -1478,6 +1489,19 @@ var Builder = class {
|
|
|
1478
1489
|
required: true
|
|
1479
1490
|
});
|
|
1480
1491
|
};
|
|
1492
|
+
/**
|
|
1493
|
+
* ```graphql
|
|
1494
|
+
* # ex.
|
|
1495
|
+
* {
|
|
1496
|
+
* getCollections {
|
|
1497
|
+
* name
|
|
1498
|
+
* documents {...}
|
|
1499
|
+
* }
|
|
1500
|
+
* }
|
|
1501
|
+
* ```
|
|
1502
|
+
*
|
|
1503
|
+
* @param collections
|
|
1504
|
+
*/
|
|
1481
1505
|
this.buildMultiCollectionDefinition = async (collections) => {
|
|
1482
1506
|
const name = "collections";
|
|
1483
1507
|
const typeName = "Collection";
|
|
@@ -1488,6 +1512,17 @@ var Builder = class {
|
|
|
1488
1512
|
required: true
|
|
1489
1513
|
});
|
|
1490
1514
|
};
|
|
1515
|
+
/**
|
|
1516
|
+
* ```graphql
|
|
1517
|
+
* # ex.
|
|
1518
|
+
* {
|
|
1519
|
+
* node(id: $id) {
|
|
1520
|
+
* id
|
|
1521
|
+
* data {...}
|
|
1522
|
+
* }
|
|
1523
|
+
* }
|
|
1524
|
+
* ```
|
|
1525
|
+
*/
|
|
1491
1526
|
this.multiNodeDocument = async () => {
|
|
1492
1527
|
const name = "node";
|
|
1493
1528
|
const args = [
|
|
@@ -1508,6 +1543,19 @@ var Builder = class {
|
|
|
1508
1543
|
required: true
|
|
1509
1544
|
});
|
|
1510
1545
|
};
|
|
1546
|
+
/**
|
|
1547
|
+
* ```graphql
|
|
1548
|
+
* # ex.
|
|
1549
|
+
* {
|
|
1550
|
+
* getDocument(collection: $collection, relativePath: $relativePath) {
|
|
1551
|
+
* id
|
|
1552
|
+
* data {...}
|
|
1553
|
+
* }
|
|
1554
|
+
* }
|
|
1555
|
+
* ```
|
|
1556
|
+
*
|
|
1557
|
+
* @param collections
|
|
1558
|
+
*/
|
|
1511
1559
|
this.multiCollectionDocument = async (collections) => {
|
|
1512
1560
|
const name = "document";
|
|
1513
1561
|
const args = [
|
|
@@ -1533,6 +1581,19 @@ var Builder = class {
|
|
|
1533
1581
|
required: true
|
|
1534
1582
|
});
|
|
1535
1583
|
};
|
|
1584
|
+
/**
|
|
1585
|
+
* ```graphql
|
|
1586
|
+
* # ex.
|
|
1587
|
+
* {
|
|
1588
|
+
* addPendingDocument(collection: $collection, relativePath: $relativePath, params: $params) {
|
|
1589
|
+
* id
|
|
1590
|
+
* data {...}
|
|
1591
|
+
* }
|
|
1592
|
+
* }
|
|
1593
|
+
* ```
|
|
1594
|
+
*
|
|
1595
|
+
* @param collections
|
|
1596
|
+
*/
|
|
1536
1597
|
this.addMultiCollectionDocumentMutation = async () => {
|
|
1537
1598
|
return astBuilder.FieldDefinition({
|
|
1538
1599
|
name: "addPendingDocument",
|
|
@@ -1557,6 +1618,19 @@ var Builder = class {
|
|
|
1557
1618
|
type: astBuilder.TYPES.MultiCollectionDocument
|
|
1558
1619
|
});
|
|
1559
1620
|
};
|
|
1621
|
+
/**
|
|
1622
|
+
* ```graphql
|
|
1623
|
+
* # ex.
|
|
1624
|
+
* {
|
|
1625
|
+
* createDocument(relativePath: $relativePath, params: $params) {
|
|
1626
|
+
* id
|
|
1627
|
+
* data {...}
|
|
1628
|
+
* }
|
|
1629
|
+
* }
|
|
1630
|
+
* ```
|
|
1631
|
+
*
|
|
1632
|
+
* @param collections
|
|
1633
|
+
*/
|
|
1560
1634
|
this.buildCreateCollectionDocumentMutation = async (collections) => {
|
|
1561
1635
|
return astBuilder.FieldDefinition({
|
|
1562
1636
|
name: "createDocument",
|
|
@@ -1584,6 +1658,19 @@ var Builder = class {
|
|
|
1584
1658
|
type: astBuilder.TYPES.MultiCollectionDocument
|
|
1585
1659
|
});
|
|
1586
1660
|
};
|
|
1661
|
+
/**
|
|
1662
|
+
* ```graphql
|
|
1663
|
+
* # ex.
|
|
1664
|
+
* {
|
|
1665
|
+
* updateDocument(relativePath: $relativePath, params: $params) {
|
|
1666
|
+
* id
|
|
1667
|
+
* data {...}
|
|
1668
|
+
* }
|
|
1669
|
+
* }
|
|
1670
|
+
* ```
|
|
1671
|
+
*
|
|
1672
|
+
* @param collections
|
|
1673
|
+
*/
|
|
1587
1674
|
this.buildUpdateCollectionDocumentMutation = async (collections) => {
|
|
1588
1675
|
return astBuilder.FieldDefinition({
|
|
1589
1676
|
name: "updateDocument",
|
|
@@ -1611,6 +1698,19 @@ var Builder = class {
|
|
|
1611
1698
|
type: astBuilder.TYPES.MultiCollectionDocument
|
|
1612
1699
|
});
|
|
1613
1700
|
};
|
|
1701
|
+
/**
|
|
1702
|
+
* ```graphql
|
|
1703
|
+
* # ex.
|
|
1704
|
+
* {
|
|
1705
|
+
* deleteDocument(relativePath: $relativePath, params: $params) {
|
|
1706
|
+
* id
|
|
1707
|
+
* data {...}
|
|
1708
|
+
* }
|
|
1709
|
+
* }
|
|
1710
|
+
* ```
|
|
1711
|
+
*
|
|
1712
|
+
* @param collections
|
|
1713
|
+
*/
|
|
1614
1714
|
this.buildDeleteCollectionDocumentMutation = async (collections) => {
|
|
1615
1715
|
return astBuilder.FieldDefinition({
|
|
1616
1716
|
name: "deleteDocument",
|
|
@@ -1630,6 +1730,19 @@ var Builder = class {
|
|
|
1630
1730
|
type: astBuilder.TYPES.MultiCollectionDocument
|
|
1631
1731
|
});
|
|
1632
1732
|
};
|
|
1733
|
+
/**
|
|
1734
|
+
* ```graphql
|
|
1735
|
+
* # ex.
|
|
1736
|
+
* {
|
|
1737
|
+
* createFolder(folderName: $folderName, params: $params) {
|
|
1738
|
+
* id
|
|
1739
|
+
* data {...}
|
|
1740
|
+
* }
|
|
1741
|
+
* }
|
|
1742
|
+
* ```
|
|
1743
|
+
*
|
|
1744
|
+
* @param collections
|
|
1745
|
+
*/
|
|
1633
1746
|
this.buildCreateCollectionFolderMutation = async () => {
|
|
1634
1747
|
return astBuilder.FieldDefinition({
|
|
1635
1748
|
name: "createFolder",
|
|
@@ -1649,6 +1762,19 @@ var Builder = class {
|
|
|
1649
1762
|
type: astBuilder.TYPES.MultiCollectionDocument
|
|
1650
1763
|
});
|
|
1651
1764
|
};
|
|
1765
|
+
/**
|
|
1766
|
+
* ```graphql
|
|
1767
|
+
* # ex.
|
|
1768
|
+
* {
|
|
1769
|
+
* getPostDocument(relativePath: $relativePath) {
|
|
1770
|
+
* id
|
|
1771
|
+
* data {...}
|
|
1772
|
+
* }
|
|
1773
|
+
* }
|
|
1774
|
+
* ```
|
|
1775
|
+
*
|
|
1776
|
+
* @param collection
|
|
1777
|
+
*/
|
|
1652
1778
|
this.collectionDocument = async (collection) => {
|
|
1653
1779
|
const name = NAMER.queryName([collection.name]);
|
|
1654
1780
|
const type = await this._buildCollectionDocumentType(collection);
|
|
@@ -1709,6 +1835,20 @@ var Builder = class {
|
|
|
1709
1835
|
const args = [];
|
|
1710
1836
|
return astBuilder.FieldDefinition({ type, name, args, required: false });
|
|
1711
1837
|
};
|
|
1838
|
+
/**
|
|
1839
|
+
* Turns a collection into a fragment that gets updated on build. This fragment does not resolve references
|
|
1840
|
+
* ```graphql
|
|
1841
|
+
* # ex.
|
|
1842
|
+
* fragment AuthorsParts on Authors {
|
|
1843
|
+
* name
|
|
1844
|
+
* avatar
|
|
1845
|
+
* ...
|
|
1846
|
+
* }
|
|
1847
|
+
* ```
|
|
1848
|
+
*
|
|
1849
|
+
* @public
|
|
1850
|
+
* @param collection a TinaCloud collection
|
|
1851
|
+
*/
|
|
1712
1852
|
this.collectionFragment = async (collection) => {
|
|
1713
1853
|
const name = NAMER.dataTypeName(collection.namespace);
|
|
1714
1854
|
const fragmentName = NAMER.fragmentName(collection.namespace);
|
|
@@ -1722,6 +1862,20 @@ var Builder = class {
|
|
|
1722
1862
|
selections: filterSelections(selections)
|
|
1723
1863
|
});
|
|
1724
1864
|
};
|
|
1865
|
+
/**
|
|
1866
|
+
* Given a collection this function returns its selections set. For example for Post this would return
|
|
1867
|
+
*
|
|
1868
|
+
* "
|
|
1869
|
+
* body
|
|
1870
|
+
* title
|
|
1871
|
+
* ... on Author {
|
|
1872
|
+
* name
|
|
1873
|
+
* heroImg
|
|
1874
|
+
* }
|
|
1875
|
+
*
|
|
1876
|
+
* But in the AST format
|
|
1877
|
+
*
|
|
1878
|
+
* */
|
|
1725
1879
|
this._getCollectionFragmentSelections = async (collection, depth) => {
|
|
1726
1880
|
const selections = [];
|
|
1727
1881
|
selections.push({
|
|
@@ -1803,9 +1957,9 @@ var Builder = class {
|
|
|
1803
1957
|
]
|
|
1804
1958
|
});
|
|
1805
1959
|
}
|
|
1960
|
+
// TODO: Should we throw here?
|
|
1806
1961
|
case "reference":
|
|
1807
|
-
if (depth >= this.maxDepth)
|
|
1808
|
-
return false;
|
|
1962
|
+
if (depth >= this.maxDepth) return false;
|
|
1809
1963
|
if (!("collections" in field)) {
|
|
1810
1964
|
return false;
|
|
1811
1965
|
}
|
|
@@ -1837,6 +1991,7 @@ var Builder = class {
|
|
|
1837
1991
|
name: field.name,
|
|
1838
1992
|
selections: [
|
|
1839
1993
|
...selections,
|
|
1994
|
+
// This is ... on Document { id }
|
|
1840
1995
|
{
|
|
1841
1996
|
kind: "InlineFragment",
|
|
1842
1997
|
typeCondition: {
|
|
@@ -1867,6 +2022,19 @@ var Builder = class {
|
|
|
1867
2022
|
});
|
|
1868
2023
|
}
|
|
1869
2024
|
};
|
|
2025
|
+
/**
|
|
2026
|
+
* ```graphql
|
|
2027
|
+
* # ex.
|
|
2028
|
+
* mutation {
|
|
2029
|
+
* updatePostDocument(relativePath: $relativePath, params: $params) {
|
|
2030
|
+
* id
|
|
2031
|
+
* data {...}
|
|
2032
|
+
* }
|
|
2033
|
+
* }
|
|
2034
|
+
* ```
|
|
2035
|
+
*
|
|
2036
|
+
* @param collection
|
|
2037
|
+
*/
|
|
1870
2038
|
this.updateCollectionDocumentMutation = async (collection) => {
|
|
1871
2039
|
return astBuilder.FieldDefinition({
|
|
1872
2040
|
type: await this._buildCollectionDocumentType(collection),
|
|
@@ -1886,6 +2054,19 @@ var Builder = class {
|
|
|
1886
2054
|
]
|
|
1887
2055
|
});
|
|
1888
2056
|
};
|
|
2057
|
+
/**
|
|
2058
|
+
* ```graphql
|
|
2059
|
+
* # ex.
|
|
2060
|
+
* mutation {
|
|
2061
|
+
* createPostDocument(relativePath: $relativePath, params: $params) {
|
|
2062
|
+
* id
|
|
2063
|
+
* data {...}
|
|
2064
|
+
* }
|
|
2065
|
+
* }
|
|
2066
|
+
* ```
|
|
2067
|
+
*
|
|
2068
|
+
* @param collection
|
|
2069
|
+
*/
|
|
1889
2070
|
this.createCollectionDocumentMutation = async (collection) => {
|
|
1890
2071
|
return astBuilder.FieldDefinition({
|
|
1891
2072
|
type: await this._buildCollectionDocumentType(collection),
|
|
@@ -1905,6 +2086,22 @@ var Builder = class {
|
|
|
1905
2086
|
]
|
|
1906
2087
|
});
|
|
1907
2088
|
};
|
|
2089
|
+
/**
|
|
2090
|
+
* ```graphql
|
|
2091
|
+
* # ex.
|
|
2092
|
+
* {
|
|
2093
|
+
* getPostList(first: 10) {
|
|
2094
|
+
* edges {
|
|
2095
|
+
* node {
|
|
2096
|
+
* id
|
|
2097
|
+
* }
|
|
2098
|
+
* }
|
|
2099
|
+
* }
|
|
2100
|
+
* }
|
|
2101
|
+
* ```
|
|
2102
|
+
*
|
|
2103
|
+
* @param collection
|
|
2104
|
+
*/
|
|
1908
2105
|
this.collectionDocumentList = async (collection) => {
|
|
1909
2106
|
const connectionName = NAMER.referenceConnectionType(collection.namespace);
|
|
1910
2107
|
this.addToLookupMap({
|
|
@@ -1920,6 +2117,10 @@ var Builder = class {
|
|
|
1920
2117
|
collection
|
|
1921
2118
|
});
|
|
1922
2119
|
};
|
|
2120
|
+
/**
|
|
2121
|
+
* GraphQL type definitions which remain unchanged regardless
|
|
2122
|
+
* of the supplied Tina schema. Ex. "node" interface
|
|
2123
|
+
*/
|
|
1923
2124
|
this.buildStaticDefinitions = () => staticDefinitions;
|
|
1924
2125
|
this._buildCollectionDocumentType = async (collection, suffix = "", extraFields = [], extraInterfaces = []) => {
|
|
1925
2126
|
const documentTypeName = NAMER.documentTypeName(collection.namespace);
|
|
@@ -2424,6 +2625,7 @@ var Builder = class {
|
|
|
2424
2625
|
name: NAMER.dataFilterTypeName(namespace),
|
|
2425
2626
|
fields: await sequential(collections, async (collection2) => {
|
|
2426
2627
|
return astBuilder.InputValueDefinition({
|
|
2628
|
+
// @ts-ignore
|
|
2427
2629
|
name: collection2.name,
|
|
2428
2630
|
type: NAMER.dataFilterTypeName(collection2.namespace)
|
|
2429
2631
|
});
|
|
@@ -2612,7 +2814,8 @@ Visit https://tina.io/docs/errors/ui-not-supported/ for more information
|
|
|
2612
2814
|
]
|
|
2613
2815
|
});
|
|
2614
2816
|
};
|
|
2615
|
-
this.maxDepth =
|
|
2817
|
+
this.maxDepth = // @ts-ignore
|
|
2818
|
+
config?.tinaSchema.schema?.config?.client?.referenceDepth ?? 2;
|
|
2616
2819
|
this.tinaSchema = config.tinaSchema;
|
|
2617
2820
|
this.lookupMap = {};
|
|
2618
2821
|
}
|
|
@@ -2623,8 +2826,7 @@ Visit https://tina.io/docs/errors/ui-not-supported/ for more information
|
|
|
2623
2826
|
selections.push(field);
|
|
2624
2827
|
});
|
|
2625
2828
|
const filteredSelections = filterSelections(selections);
|
|
2626
|
-
if (!filteredSelections.length)
|
|
2627
|
-
return false;
|
|
2829
|
+
if (!filteredSelections.length) return false;
|
|
2628
2830
|
return astBuilder.InlineFragmentDefinition({
|
|
2629
2831
|
selections: filteredSelections,
|
|
2630
2832
|
name: NAMER.dataTypeName(template.namespace)
|
|
@@ -2661,6 +2863,7 @@ var filterSelections = (arr) => {
|
|
|
2661
2863
|
import { TinaSchema } from "@tinacms/schema-tools";
|
|
2662
2864
|
|
|
2663
2865
|
// src/schema/validate.ts
|
|
2866
|
+
import { addNamespaceToSchema } from "@tinacms/schema-tools";
|
|
2664
2867
|
import deepClone from "lodash.clonedeep";
|
|
2665
2868
|
import * as yup2 from "yup";
|
|
2666
2869
|
import {
|
|
@@ -2707,6 +2910,7 @@ var validationCollectionsPathAndMatch = (collections) => {
|
|
|
2707
2910
|
}).map((x) => `${x.path}${x.format || "md"}`);
|
|
2708
2911
|
if (noMatchCollections.length !== new Set(noMatchCollections).size) {
|
|
2709
2912
|
throw new Error(
|
|
2913
|
+
// TODO: add a link to the docs
|
|
2710
2914
|
"Two collections without match can not have the same `path`. Please make the `path` unique or add a matches property to the collection."
|
|
2711
2915
|
);
|
|
2712
2916
|
}
|
|
@@ -2815,7 +3019,7 @@ var validateField = async (field) => {
|
|
|
2815
3019
|
// package.json
|
|
2816
3020
|
var package_default = {
|
|
2817
3021
|
name: "@tinacms/graphql",
|
|
2818
|
-
version: "1.5.
|
|
3022
|
+
version: "1.5.16",
|
|
2819
3023
|
main: "dist/index.js",
|
|
2820
3024
|
module: "dist/index.mjs",
|
|
2821
3025
|
typings: "dist/index.d.ts",
|
|
@@ -2842,8 +3046,8 @@ var package_default = {
|
|
|
2842
3046
|
build: "tinacms-scripts build",
|
|
2843
3047
|
docs: "pnpm typedoc",
|
|
2844
3048
|
serve: "pnpm nodemon dist/server.js",
|
|
2845
|
-
test: "
|
|
2846
|
-
"test-watch": "
|
|
3049
|
+
test: "vitest run",
|
|
3050
|
+
"test-watch": "vitest"
|
|
2847
3051
|
},
|
|
2848
3052
|
dependencies: {
|
|
2849
3053
|
"@iarna/toml": "^2.2.5",
|
|
@@ -2851,22 +3055,22 @@ var package_default = {
|
|
|
2851
3055
|
"@tinacms/schema-tools": "workspace:*",
|
|
2852
3056
|
"abstract-level": "^1.0.4",
|
|
2853
3057
|
"date-fns": "^2.30.0",
|
|
2854
|
-
"fast-glob": "^3.3.
|
|
2855
|
-
"fs-extra": "^11.
|
|
3058
|
+
"fast-glob": "^3.3.3",
|
|
3059
|
+
"fs-extra": "^11.3.0",
|
|
2856
3060
|
"glob-parent": "^6.0.2",
|
|
2857
3061
|
graphql: "15.8.0",
|
|
2858
3062
|
"gray-matter": "^4.0.3",
|
|
2859
|
-
"isomorphic-git": "^1.
|
|
3063
|
+
"isomorphic-git": "^1.29.0",
|
|
2860
3064
|
"js-sha1": "^0.6.0",
|
|
2861
3065
|
"js-yaml": "^3.14.1",
|
|
2862
|
-
"jsonpath-plus": "
|
|
3066
|
+
"jsonpath-plus": "10.1.0",
|
|
2863
3067
|
"lodash.clonedeep": "^4.5.0",
|
|
2864
3068
|
"lodash.set": "^4.3.2",
|
|
2865
3069
|
"lodash.uniqby": "^4.7.0",
|
|
2866
3070
|
"many-level": "^2.0.0",
|
|
2867
3071
|
micromatch: "4.0.8",
|
|
2868
3072
|
"normalize-path": "^3.0.0",
|
|
2869
|
-
"readable-stream": "^4.
|
|
3073
|
+
"readable-stream": "^4.7.0",
|
|
2870
3074
|
scmp: "^2.1.0",
|
|
2871
3075
|
yup: "^0.32.11"
|
|
2872
3076
|
},
|
|
@@ -2884,24 +3088,23 @@ var package_default = {
|
|
|
2884
3088
|
"@types/estree": "^0.0.50",
|
|
2885
3089
|
"@types/express": "^4.17.21",
|
|
2886
3090
|
"@types/fs-extra": "^9.0.13",
|
|
2887
|
-
"@types/jest": "^26.0.24",
|
|
2888
3091
|
"@types/js-yaml": "^3.12.10",
|
|
2889
3092
|
"@types/lodash.camelcase": "^4.3.9",
|
|
2890
3093
|
"@types/lodash.upperfirst": "^4.3.9",
|
|
2891
3094
|
"@types/lru-cache": "^5.1.1",
|
|
2892
3095
|
"@types/mdast": "^3.0.15",
|
|
2893
3096
|
"@types/micromatch": "^4.0.9",
|
|
2894
|
-
"@types/node": "^22.
|
|
3097
|
+
"@types/node": "^22.13.1",
|
|
2895
3098
|
"@types/normalize-path": "^3.0.2",
|
|
2896
3099
|
"@types/ws": "^7.4.7",
|
|
2897
3100
|
"@types/yup": "^0.29.14",
|
|
2898
|
-
jest: "^29.7.0",
|
|
2899
|
-
"jest-diff": "^29.7.0",
|
|
2900
3101
|
"jest-file-snapshot": "^0.5.0",
|
|
2901
|
-
"jest-matcher-utils": "^29.7.0",
|
|
2902
3102
|
"memory-level": "^1.0.0",
|
|
2903
3103
|
nodemon: "3.1.4",
|
|
2904
|
-
typescript: "^5.
|
|
3104
|
+
typescript: "^5.7.3",
|
|
3105
|
+
vite: "^4.5.9",
|
|
3106
|
+
vitest: "^0.32.4",
|
|
3107
|
+
zod: "^3.24.2"
|
|
2905
3108
|
}
|
|
2906
3109
|
};
|
|
2907
3110
|
|
|
@@ -2972,6 +3175,7 @@ var _buildFragments = async (builder, tinaSchema) => {
|
|
|
2972
3175
|
const fragDoc = {
|
|
2973
3176
|
kind: "Document",
|
|
2974
3177
|
definitions: uniqBy2(
|
|
3178
|
+
// @ts-ignore
|
|
2975
3179
|
extractInlineTypes(fragmentDefinitionsFields),
|
|
2976
3180
|
(node) => node.name.value
|
|
2977
3181
|
)
|
|
@@ -2994,6 +3198,7 @@ var _buildQueries = async (builder, tinaSchema) => {
|
|
|
2994
3198
|
fragName,
|
|
2995
3199
|
queryName: queryListName,
|
|
2996
3200
|
filterType: queryFilterTypeName,
|
|
3201
|
+
// look for flag to see if the data layer is enabled
|
|
2997
3202
|
dataLayer: Boolean(
|
|
2998
3203
|
tinaSchema.config?.meta?.flags?.find((x) => x === "experimentalData")
|
|
2999
3204
|
)
|
|
@@ -3003,6 +3208,7 @@ var _buildQueries = async (builder, tinaSchema) => {
|
|
|
3003
3208
|
const queryDoc = {
|
|
3004
3209
|
kind: "Document",
|
|
3005
3210
|
definitions: uniqBy2(
|
|
3211
|
+
// @ts-ignore
|
|
3006
3212
|
extractInlineTypes(operationsDefinitions),
|
|
3007
3213
|
(node) => node.name.value
|
|
3008
3214
|
)
|
|
@@ -3054,7 +3260,9 @@ var _buildSchema = async (builder, tinaSchema) => {
|
|
|
3054
3260
|
await builder.buildCreateCollectionFolderMutation()
|
|
3055
3261
|
);
|
|
3056
3262
|
await sequential(collections, async (collection) => {
|
|
3057
|
-
queryTypeDefinitionFields.push(
|
|
3263
|
+
queryTypeDefinitionFields.push(
|
|
3264
|
+
await builder.collectionDocument(collection)
|
|
3265
|
+
);
|
|
3058
3266
|
if (collection.isAuthCollection) {
|
|
3059
3267
|
queryTypeDefinitionFields.push(
|
|
3060
3268
|
await builder.authenticationCollectionDocument(collection)
|
|
@@ -3091,6 +3299,7 @@ var _buildSchema = async (builder, tinaSchema) => {
|
|
|
3091
3299
|
return {
|
|
3092
3300
|
kind: "Document",
|
|
3093
3301
|
definitions: uniqBy2(
|
|
3302
|
+
// @ts-ignore
|
|
3094
3303
|
extractInlineTypes(definitions),
|
|
3095
3304
|
(node) => node.name.value
|
|
3096
3305
|
)
|
|
@@ -3107,6 +3316,9 @@ import isValid from "date-fns/isValid/index.js";
|
|
|
3107
3316
|
// src/mdx/index.ts
|
|
3108
3317
|
import { parseMDX, stringifyMDX } from "@tinacms/mdx";
|
|
3109
3318
|
|
|
3319
|
+
// src/resolver/index.ts
|
|
3320
|
+
import { JSONPath as JSONPath2 } from "jsonpath-plus";
|
|
3321
|
+
|
|
3110
3322
|
// src/resolver/error.ts
|
|
3111
3323
|
var TinaGraphQLError = class extends Error {
|
|
3112
3324
|
constructor(message, extensions) {
|
|
@@ -3292,8 +3504,7 @@ var resolveMediaCloudToRelative = (value, config = { useRelativeMedia: true }, s
|
|
|
3292
3504
|
}
|
|
3293
3505
|
if (Array.isArray(value)) {
|
|
3294
3506
|
return value.map((v) => {
|
|
3295
|
-
if (!v || typeof v !== "string")
|
|
3296
|
-
return v;
|
|
3507
|
+
if (!v || typeof v !== "string") return v;
|
|
3297
3508
|
const cleanMediaRoot = cleanUpSlashes(
|
|
3298
3509
|
schema.config.media.tina.mediaRoot
|
|
3299
3510
|
);
|
|
@@ -3321,8 +3532,7 @@ var resolveMediaRelativeToCloud = (value, config = { useRelativeMedia: true }, s
|
|
|
3321
3532
|
}
|
|
3322
3533
|
if (Array.isArray(value)) {
|
|
3323
3534
|
return value.map((v) => {
|
|
3324
|
-
if (!v || typeof v !== "string")
|
|
3325
|
-
return v;
|
|
3535
|
+
if (!v || typeof v !== "string") return v;
|
|
3326
3536
|
const strippedValue = v.replace(cleanMediaRoot, "");
|
|
3327
3537
|
return `https://${config.assetsHost}/${config.clientId}${strippedValue}`;
|
|
3328
3538
|
});
|
|
@@ -3340,8 +3550,7 @@ var cleanUpSlashes = (path7) => {
|
|
|
3340
3550
|
return "";
|
|
3341
3551
|
};
|
|
3342
3552
|
var hasTinaMediaConfig = (schema) => {
|
|
3343
|
-
if (!schema.config?.media?.tina)
|
|
3344
|
-
return false;
|
|
3553
|
+
if (!schema.config?.media?.tina) return false;
|
|
3345
3554
|
if (typeof schema.config?.media?.tina?.publicFolder !== "string" && typeof schema.config?.media?.tina?.mediaRoot !== "string")
|
|
3346
3555
|
return false;
|
|
3347
3556
|
return true;
|
|
@@ -3368,7 +3577,9 @@ var LevelProxyHandler = {
|
|
|
3368
3577
|
throw new Error(`The property, ${property.toString()}, doesn't exist`);
|
|
3369
3578
|
}
|
|
3370
3579
|
if (typeof target[property] !== "function") {
|
|
3371
|
-
throw new Error(
|
|
3580
|
+
throw new Error(
|
|
3581
|
+
`The property, ${property.toString()}, is not a function`
|
|
3582
|
+
);
|
|
3372
3583
|
}
|
|
3373
3584
|
if (property === "get") {
|
|
3374
3585
|
return async (...args) => {
|
|
@@ -3385,6 +3596,7 @@ var LevelProxyHandler = {
|
|
|
3385
3596
|
} else if (property === "sublevel") {
|
|
3386
3597
|
return (...args) => {
|
|
3387
3598
|
return new Proxy(
|
|
3599
|
+
// eslint-disable-next-line prefer-spread
|
|
3388
3600
|
target[property].apply(target, args),
|
|
3389
3601
|
LevelProxyHandler
|
|
3390
3602
|
);
|
|
@@ -3752,6 +3964,9 @@ var loadAndParseWithAliases = async (bridge, filepath, collection, templateInfo)
|
|
|
3752
3964
|
|
|
3753
3965
|
// src/database/datalayer.ts
|
|
3754
3966
|
var DEFAULT_COLLECTION_SORT_KEY = "__filepath__";
|
|
3967
|
+
var REFS_COLLECTIONS_SORT_KEY = "__refs__";
|
|
3968
|
+
var REFS_REFERENCE_FIELD = "__tina_ref__";
|
|
3969
|
+
var REFS_PATH_FIELD = "__tina_ref_path__";
|
|
3755
3970
|
var DEFAULT_NUMERIC_LPAD = 4;
|
|
3756
3971
|
var applyPadding = (input, pad) => {
|
|
3757
3972
|
if (pad) {
|
|
@@ -4261,6 +4476,7 @@ var makeFolderOpsForCollection = (folderTree, collection, indexDefinitions, opTy
|
|
|
4261
4476
|
result.push({
|
|
4262
4477
|
type: opType,
|
|
4263
4478
|
key: `${collection.path}/${subFolderKey}.${collection.format}`,
|
|
4479
|
+
// replace the root with the collection path
|
|
4264
4480
|
sublevel: indexSublevel,
|
|
4265
4481
|
value: {}
|
|
4266
4482
|
});
|
|
@@ -4324,6 +4540,57 @@ var makeIndexOpsForDocument = (filepath, collection, indexDefinitions, data, opT
|
|
|
4324
4540
|
}
|
|
4325
4541
|
return result;
|
|
4326
4542
|
};
|
|
4543
|
+
var makeRefOpsForDocument = (filepath, collection, references, data, opType, level) => {
|
|
4544
|
+
const result = [];
|
|
4545
|
+
if (collection) {
|
|
4546
|
+
for (const [c, referencePaths] of Object.entries(references || {})) {
|
|
4547
|
+
if (!referencePaths.length) {
|
|
4548
|
+
continue;
|
|
4549
|
+
}
|
|
4550
|
+
const collectionSublevel = level.sublevel(c, SUBLEVEL_OPTIONS);
|
|
4551
|
+
const refSublevel = collectionSublevel.sublevel(
|
|
4552
|
+
REFS_COLLECTIONS_SORT_KEY,
|
|
4553
|
+
SUBLEVEL_OPTIONS
|
|
4554
|
+
);
|
|
4555
|
+
const references2 = {};
|
|
4556
|
+
for (const path7 of referencePaths) {
|
|
4557
|
+
const ref = JSONPath({ path: path7, json: data });
|
|
4558
|
+
if (!ref) {
|
|
4559
|
+
continue;
|
|
4560
|
+
}
|
|
4561
|
+
if (Array.isArray(ref)) {
|
|
4562
|
+
for (const r of ref) {
|
|
4563
|
+
if (!r) {
|
|
4564
|
+
continue;
|
|
4565
|
+
}
|
|
4566
|
+
if (references2[r]) {
|
|
4567
|
+
references2[r].push(path7);
|
|
4568
|
+
} else {
|
|
4569
|
+
references2[r] = [path7];
|
|
4570
|
+
}
|
|
4571
|
+
}
|
|
4572
|
+
} else {
|
|
4573
|
+
if (references2[ref]) {
|
|
4574
|
+
references2[ref].push(path7);
|
|
4575
|
+
} else {
|
|
4576
|
+
references2[ref] = [path7];
|
|
4577
|
+
}
|
|
4578
|
+
}
|
|
4579
|
+
}
|
|
4580
|
+
for (const ref of Object.keys(references2)) {
|
|
4581
|
+
for (const path7 of references2[ref]) {
|
|
4582
|
+
result.push({
|
|
4583
|
+
type: opType,
|
|
4584
|
+
key: `${ref}${INDEX_KEY_FIELD_SEPARATOR}${path7}${INDEX_KEY_FIELD_SEPARATOR}${filepath}`,
|
|
4585
|
+
sublevel: refSublevel,
|
|
4586
|
+
value: opType === "put" ? {} : void 0
|
|
4587
|
+
});
|
|
4588
|
+
}
|
|
4589
|
+
}
|
|
4590
|
+
}
|
|
4591
|
+
}
|
|
4592
|
+
return result;
|
|
4593
|
+
};
|
|
4327
4594
|
var makeStringEscaper = (regex, replacement) => {
|
|
4328
4595
|
return (input) => {
|
|
4329
4596
|
if (Array.isArray(input)) {
|
|
@@ -4375,6 +4642,7 @@ var resolveFieldData = async ({ namespace, ...field }, rawData, accumulator, tin
|
|
|
4375
4642
|
case "password":
|
|
4376
4643
|
accumulator[field.name] = {
|
|
4377
4644
|
value: void 0,
|
|
4645
|
+
// never resolve the password hash
|
|
4378
4646
|
passwordChangeRequired: value["passwordChangeRequired"] ?? false
|
|
4379
4647
|
};
|
|
4380
4648
|
break;
|
|
@@ -4469,7 +4737,7 @@ var resolveFieldData = async ({ namespace, ...field }, rawData, accumulator, tin
|
|
|
4469
4737
|
}
|
|
4470
4738
|
return accumulator;
|
|
4471
4739
|
};
|
|
4472
|
-
var transformDocumentIntoPayload = async (fullPath, rawData, tinaSchema, config, isAudit) => {
|
|
4740
|
+
var transformDocumentIntoPayload = async (fullPath, rawData, tinaSchema, config, isAudit, hasReferences) => {
|
|
4473
4741
|
const collection = tinaSchema.getCollection(rawData._collection);
|
|
4474
4742
|
try {
|
|
4475
4743
|
const template = tinaSchema.getTemplateForData({
|
|
@@ -4523,6 +4791,7 @@ var transformDocumentIntoPayload = async (fullPath, rawData, tinaSchema, config,
|
|
|
4523
4791
|
basename,
|
|
4524
4792
|
filename,
|
|
4525
4793
|
extension,
|
|
4794
|
+
hasReferences,
|
|
4526
4795
|
path: fullPath,
|
|
4527
4796
|
relativePath,
|
|
4528
4797
|
breadcrumbs,
|
|
@@ -4542,6 +4811,34 @@ var transformDocumentIntoPayload = async (fullPath, rawData, tinaSchema, config,
|
|
|
4542
4811
|
throw e;
|
|
4543
4812
|
}
|
|
4544
4813
|
};
|
|
4814
|
+
var updateObjectWithJsonPath = (obj, path7, oldValue, newValue) => {
|
|
4815
|
+
let updated = false;
|
|
4816
|
+
if (!path7.includes(".") && !path7.includes("[")) {
|
|
4817
|
+
if (path7 in obj && obj[path7] === oldValue) {
|
|
4818
|
+
obj[path7] = newValue;
|
|
4819
|
+
updated = true;
|
|
4820
|
+
}
|
|
4821
|
+
return { object: obj, updated };
|
|
4822
|
+
}
|
|
4823
|
+
const parentPath = path7.replace(/\.[^.\[\]]+$/, "");
|
|
4824
|
+
const keyToUpdate = path7.match(/[^.\[\]]+$/)[0];
|
|
4825
|
+
const parents = JSONPath2({
|
|
4826
|
+
path: parentPath,
|
|
4827
|
+
json: obj,
|
|
4828
|
+
resultType: "value"
|
|
4829
|
+
});
|
|
4830
|
+
if (parents.length > 0) {
|
|
4831
|
+
parents.forEach((parent) => {
|
|
4832
|
+
if (parent && typeof parent === "object" && keyToUpdate in parent) {
|
|
4833
|
+
if (parent[keyToUpdate] === oldValue) {
|
|
4834
|
+
parent[keyToUpdate] = newValue;
|
|
4835
|
+
updated = true;
|
|
4836
|
+
}
|
|
4837
|
+
}
|
|
4838
|
+
});
|
|
4839
|
+
}
|
|
4840
|
+
return { object: obj, updated };
|
|
4841
|
+
};
|
|
4545
4842
|
var Resolver = class {
|
|
4546
4843
|
constructor(init) {
|
|
4547
4844
|
this.init = init;
|
|
@@ -4549,6 +4846,7 @@ var Resolver = class {
|
|
|
4549
4846
|
const collection = this.tinaSchema.getCollection(collectionName);
|
|
4550
4847
|
const extraFields = {};
|
|
4551
4848
|
return {
|
|
4849
|
+
// return the collection and hasDocuments to resolve documents at a lower level
|
|
4552
4850
|
documents: { collection, hasDocuments },
|
|
4553
4851
|
...collection,
|
|
4554
4852
|
...extraFields
|
|
@@ -4556,7 +4854,9 @@ var Resolver = class {
|
|
|
4556
4854
|
};
|
|
4557
4855
|
this.getRaw = async (fullPath) => {
|
|
4558
4856
|
if (typeof fullPath !== "string") {
|
|
4559
|
-
throw new Error(
|
|
4857
|
+
throw new Error(
|
|
4858
|
+
`fullPath must be of type string for getDocument request`
|
|
4859
|
+
);
|
|
4560
4860
|
}
|
|
4561
4861
|
return this.database.get(fullPath);
|
|
4562
4862
|
};
|
|
@@ -4583,22 +4883,28 @@ var Resolver = class {
|
|
|
4583
4883
|
);
|
|
4584
4884
|
}
|
|
4585
4885
|
};
|
|
4586
|
-
this.getDocument = async (fullPath) => {
|
|
4886
|
+
this.getDocument = async (fullPath, opts = {}) => {
|
|
4587
4887
|
if (typeof fullPath !== "string") {
|
|
4588
|
-
throw new Error(
|
|
4888
|
+
throw new Error(
|
|
4889
|
+
`fullPath must be of type string for getDocument request`
|
|
4890
|
+
);
|
|
4589
4891
|
}
|
|
4590
4892
|
const rawData = await this.getRaw(fullPath);
|
|
4893
|
+
const hasReferences = opts?.checkReferences ? await this.hasReferences(fullPath, opts.collection) : void 0;
|
|
4591
4894
|
return transformDocumentIntoPayload(
|
|
4592
4895
|
fullPath,
|
|
4593
4896
|
rawData,
|
|
4594
4897
|
this.tinaSchema,
|
|
4595
4898
|
this.config,
|
|
4596
|
-
this.isAudit
|
|
4899
|
+
this.isAudit,
|
|
4900
|
+
hasReferences
|
|
4597
4901
|
);
|
|
4598
4902
|
};
|
|
4599
4903
|
this.deleteDocument = async (fullPath) => {
|
|
4600
4904
|
if (typeof fullPath !== "string") {
|
|
4601
|
-
throw new Error(
|
|
4905
|
+
throw new Error(
|
|
4906
|
+
`fullPath must be of type string for getDocument request`
|
|
4907
|
+
);
|
|
4602
4908
|
}
|
|
4603
4909
|
await this.database.delete(fullPath);
|
|
4604
4910
|
};
|
|
@@ -4633,7 +4939,9 @@ var Resolver = class {
|
|
|
4633
4939
|
);
|
|
4634
4940
|
} else {
|
|
4635
4941
|
return this.buildFieldMutations(
|
|
4942
|
+
// @ts-ignore FIXME Argument of type 'string | object' is not assignable to parameter of type '{ [fieldName: string]: string | object | (string | object)[]; }'
|
|
4636
4943
|
fieldValue,
|
|
4944
|
+
//@ts-ignore
|
|
4637
4945
|
objectTemplate,
|
|
4638
4946
|
existingData
|
|
4639
4947
|
);
|
|
@@ -4645,6 +4953,7 @@ var Resolver = class {
|
|
|
4645
4953
|
fieldValue.map(async (item) => {
|
|
4646
4954
|
if (typeof item === "string") {
|
|
4647
4955
|
throw new Error(
|
|
4956
|
+
//@ts-ignore
|
|
4648
4957
|
`Expected object for template value for field ${field.name}`
|
|
4649
4958
|
);
|
|
4650
4959
|
}
|
|
@@ -4653,16 +4962,19 @@ var Resolver = class {
|
|
|
4653
4962
|
});
|
|
4654
4963
|
const [templateName] = Object.entries(item)[0];
|
|
4655
4964
|
const template = templates.find(
|
|
4965
|
+
//@ts-ignore
|
|
4656
4966
|
(template2) => template2.name === templateName
|
|
4657
4967
|
);
|
|
4658
4968
|
if (!template) {
|
|
4659
4969
|
throw new Error(`Expected to find template ${templateName}`);
|
|
4660
4970
|
}
|
|
4661
4971
|
return {
|
|
4972
|
+
// @ts-ignore FIXME Argument of type 'unknown' is not assignable to parameter of type '{ [fieldName: string]: string | { [key: string]: unknown; } | (string | { [key: string]: unknown; })[]; }'
|
|
4662
4973
|
...await this.buildFieldMutations(
|
|
4663
4974
|
item[template.name],
|
|
4664
4975
|
template
|
|
4665
4976
|
),
|
|
4977
|
+
//@ts-ignore
|
|
4666
4978
|
_template: template.name
|
|
4667
4979
|
};
|
|
4668
4980
|
})
|
|
@@ -4670,6 +4982,7 @@ var Resolver = class {
|
|
|
4670
4982
|
} else {
|
|
4671
4983
|
if (typeof fieldValue === "string") {
|
|
4672
4984
|
throw new Error(
|
|
4985
|
+
//@ts-ignore
|
|
4673
4986
|
`Expected object for template value for field ${field.name}`
|
|
4674
4987
|
);
|
|
4675
4988
|
}
|
|
@@ -4678,16 +4991,19 @@ var Resolver = class {
|
|
|
4678
4991
|
});
|
|
4679
4992
|
const [templateName] = Object.entries(fieldValue)[0];
|
|
4680
4993
|
const template = templates.find(
|
|
4994
|
+
//@ts-ignore
|
|
4681
4995
|
(template2) => template2.name === templateName
|
|
4682
4996
|
);
|
|
4683
4997
|
if (!template) {
|
|
4684
4998
|
throw new Error(`Expected to find template ${templateName}`);
|
|
4685
4999
|
}
|
|
4686
5000
|
return {
|
|
5001
|
+
// @ts-ignore FIXME Argument of type 'unknown' is not assignable to parameter of type '{ [fieldName: string]: string | { [key: string]: unknown; } | (string | { [key: string]: unknown; })[]; }'
|
|
4687
5002
|
...await this.buildFieldMutations(
|
|
4688
5003
|
fieldValue[template.name],
|
|
4689
5004
|
template
|
|
4690
5005
|
),
|
|
5006
|
+
//@ts-ignore
|
|
4691
5007
|
_template: template.name
|
|
4692
5008
|
};
|
|
4693
5009
|
}
|
|
@@ -4727,6 +5043,7 @@ var Resolver = class {
|
|
|
4727
5043
|
return this.getDocument(realPath);
|
|
4728
5044
|
}
|
|
4729
5045
|
const params = await this.buildObjectMutations(
|
|
5046
|
+
// @ts-ignore
|
|
4730
5047
|
args.params[collection.name],
|
|
4731
5048
|
collection
|
|
4732
5049
|
);
|
|
@@ -4772,6 +5089,7 @@ var Resolver = class {
|
|
|
4772
5089
|
const values = {
|
|
4773
5090
|
...oldDoc,
|
|
4774
5091
|
...await this.buildFieldMutations(
|
|
5092
|
+
// @ts-ignore FIXME: failing on unknown, which we don't need to know because it's recursive
|
|
4775
5093
|
templateParams,
|
|
4776
5094
|
template,
|
|
4777
5095
|
doc?._rawData
|
|
@@ -4785,13 +5103,22 @@ var Resolver = class {
|
|
|
4785
5103
|
return this.getDocument(realPath);
|
|
4786
5104
|
}
|
|
4787
5105
|
const params = await this.buildObjectMutations(
|
|
5106
|
+
//@ts-ignore
|
|
4788
5107
|
isCollectionSpecific ? args.params : args.params[collection.name],
|
|
4789
5108
|
collection,
|
|
4790
5109
|
doc?._rawData
|
|
4791
5110
|
);
|
|
4792
|
-
await this.database.put(
|
|
5111
|
+
await this.database.put(
|
|
5112
|
+
realPath,
|
|
5113
|
+
{ ...oldDoc, ...params },
|
|
5114
|
+
collection.name
|
|
5115
|
+
);
|
|
4793
5116
|
return this.getDocument(realPath);
|
|
4794
5117
|
};
|
|
5118
|
+
/**
|
|
5119
|
+
* Returns top-level fields which are not defined in the collection, so their
|
|
5120
|
+
* values are not eliminated from Tina when new values are saved
|
|
5121
|
+
*/
|
|
4795
5122
|
this.resolveLegacyValues = (oldDoc, collection) => {
|
|
4796
5123
|
const legacyValues = {};
|
|
4797
5124
|
Object.entries(oldDoc).forEach(([key, value]) => {
|
|
@@ -4896,6 +5223,40 @@ var Resolver = class {
|
|
|
4896
5223
|
if (isDeletion) {
|
|
4897
5224
|
const doc = await this.getDocument(realPath);
|
|
4898
5225
|
await this.deleteDocument(realPath);
|
|
5226
|
+
if (await this.hasReferences(realPath, collection)) {
|
|
5227
|
+
const collRefs = await this.findReferences(realPath, collection);
|
|
5228
|
+
for (const [collection2, docsWithRefs] of Object.entries(collRefs)) {
|
|
5229
|
+
for (const [pathToDocWithRef, referencePaths] of Object.entries(
|
|
5230
|
+
docsWithRefs
|
|
5231
|
+
)) {
|
|
5232
|
+
let refDoc = await this.getRaw(pathToDocWithRef);
|
|
5233
|
+
let hasUpdate = false;
|
|
5234
|
+
for (const path7 of referencePaths) {
|
|
5235
|
+
const { object: object2, updated } = updateObjectWithJsonPath(
|
|
5236
|
+
refDoc,
|
|
5237
|
+
path7,
|
|
5238
|
+
realPath,
|
|
5239
|
+
null
|
|
5240
|
+
);
|
|
5241
|
+
refDoc = object2;
|
|
5242
|
+
hasUpdate = updated || hasUpdate;
|
|
5243
|
+
}
|
|
5244
|
+
if (hasUpdate) {
|
|
5245
|
+
const collectionWithRef = this.tinaSchema.getCollectionByFullPath(pathToDocWithRef);
|
|
5246
|
+
if (!collectionWithRef) {
|
|
5247
|
+
throw new Error(
|
|
5248
|
+
`Unable to find collection for ${pathToDocWithRef}`
|
|
5249
|
+
);
|
|
5250
|
+
}
|
|
5251
|
+
await this.database.put(
|
|
5252
|
+
pathToDocWithRef,
|
|
5253
|
+
refDoc,
|
|
5254
|
+
collectionWithRef.name
|
|
5255
|
+
);
|
|
5256
|
+
}
|
|
5257
|
+
}
|
|
5258
|
+
}
|
|
5259
|
+
}
|
|
4899
5260
|
return doc;
|
|
4900
5261
|
}
|
|
4901
5262
|
if (isUpdateName) {
|
|
@@ -4912,12 +5273,49 @@ var Resolver = class {
|
|
|
4912
5273
|
collection?.path,
|
|
4913
5274
|
args.params.relativePath
|
|
4914
5275
|
);
|
|
5276
|
+
if (newRealPath === realPath) {
|
|
5277
|
+
return doc;
|
|
5278
|
+
}
|
|
4915
5279
|
await this.database.put(newRealPath, doc._rawData, collection.name);
|
|
4916
5280
|
await this.deleteDocument(realPath);
|
|
5281
|
+
const collRefs = await this.findReferences(realPath, collection);
|
|
5282
|
+
for (const [collection2, docsWithRefs] of Object.entries(collRefs)) {
|
|
5283
|
+
for (const [pathToDocWithRef, referencePaths] of Object.entries(
|
|
5284
|
+
docsWithRefs
|
|
5285
|
+
)) {
|
|
5286
|
+
let docWithRef = await this.getRaw(pathToDocWithRef);
|
|
5287
|
+
let hasUpdate = false;
|
|
5288
|
+
for (const path7 of referencePaths) {
|
|
5289
|
+
const { object: object2, updated } = updateObjectWithJsonPath(
|
|
5290
|
+
docWithRef,
|
|
5291
|
+
path7,
|
|
5292
|
+
realPath,
|
|
5293
|
+
newRealPath
|
|
5294
|
+
);
|
|
5295
|
+
docWithRef = object2;
|
|
5296
|
+
hasUpdate = updated || hasUpdate;
|
|
5297
|
+
}
|
|
5298
|
+
if (hasUpdate) {
|
|
5299
|
+
const collectionWithRef = this.tinaSchema.getCollectionByFullPath(pathToDocWithRef);
|
|
5300
|
+
if (!collectionWithRef) {
|
|
5301
|
+
throw new Error(
|
|
5302
|
+
`Unable to find collection for ${pathToDocWithRef}`
|
|
5303
|
+
);
|
|
5304
|
+
}
|
|
5305
|
+
await this.database.put(
|
|
5306
|
+
pathToDocWithRef,
|
|
5307
|
+
docWithRef,
|
|
5308
|
+
collectionWithRef.name
|
|
5309
|
+
);
|
|
5310
|
+
}
|
|
5311
|
+
}
|
|
5312
|
+
}
|
|
4917
5313
|
return this.getDocument(newRealPath);
|
|
4918
5314
|
}
|
|
4919
5315
|
if (alreadyExists === false) {
|
|
4920
|
-
throw new Error(
|
|
5316
|
+
throw new Error(
|
|
5317
|
+
`Unable to update document, ${realPath} does not exist`
|
|
5318
|
+
);
|
|
4921
5319
|
}
|
|
4922
5320
|
return this.updateResolveDocument({
|
|
4923
5321
|
collection,
|
|
@@ -4927,7 +5325,10 @@ var Resolver = class {
|
|
|
4927
5325
|
isCollectionSpecific
|
|
4928
5326
|
});
|
|
4929
5327
|
} else {
|
|
4930
|
-
return this.getDocument(realPath
|
|
5328
|
+
return this.getDocument(realPath, {
|
|
5329
|
+
collection,
|
|
5330
|
+
checkReferences: true
|
|
5331
|
+
});
|
|
4931
5332
|
}
|
|
4932
5333
|
};
|
|
4933
5334
|
this.resolveCollectionConnections = async ({ ids }) => {
|
|
@@ -4964,6 +5365,7 @@ var Resolver = class {
|
|
|
4964
5365
|
},
|
|
4965
5366
|
collection: referencedCollection,
|
|
4966
5367
|
hydrator: (path7) => path7
|
|
5368
|
+
// just return the path
|
|
4967
5369
|
}
|
|
4968
5370
|
);
|
|
4969
5371
|
const { edges } = resolvedCollectionConnection;
|
|
@@ -5031,6 +5433,82 @@ var Resolver = class {
|
|
|
5031
5433
|
}
|
|
5032
5434
|
};
|
|
5033
5435
|
};
|
|
5436
|
+
/**
|
|
5437
|
+
* Checks if a document has references to it
|
|
5438
|
+
* @param id The id of the document to check for references
|
|
5439
|
+
* @param c The collection to check for references
|
|
5440
|
+
* @returns true if the document has references, false otherwise
|
|
5441
|
+
*/
|
|
5442
|
+
this.hasReferences = async (id, c) => {
|
|
5443
|
+
let count = 0;
|
|
5444
|
+
await this.database.query(
|
|
5445
|
+
{
|
|
5446
|
+
collection: c.name,
|
|
5447
|
+
filterChain: makeFilterChain({
|
|
5448
|
+
conditions: [
|
|
5449
|
+
{
|
|
5450
|
+
filterPath: REFS_REFERENCE_FIELD,
|
|
5451
|
+
filterExpression: {
|
|
5452
|
+
_type: "string",
|
|
5453
|
+
_list: false,
|
|
5454
|
+
eq: id
|
|
5455
|
+
}
|
|
5456
|
+
}
|
|
5457
|
+
]
|
|
5458
|
+
}),
|
|
5459
|
+
sort: REFS_COLLECTIONS_SORT_KEY
|
|
5460
|
+
},
|
|
5461
|
+
(refId) => {
|
|
5462
|
+
count++;
|
|
5463
|
+
return refId;
|
|
5464
|
+
}
|
|
5465
|
+
);
|
|
5466
|
+
if (count) {
|
|
5467
|
+
return true;
|
|
5468
|
+
}
|
|
5469
|
+
return false;
|
|
5470
|
+
};
|
|
5471
|
+
/**
|
|
5472
|
+
* Finds references to a document
|
|
5473
|
+
* @param id the id of the document to find references to
|
|
5474
|
+
* @param c the collection to find references in
|
|
5475
|
+
* @returns a map of references to the document
|
|
5476
|
+
*/
|
|
5477
|
+
this.findReferences = async (id, c) => {
|
|
5478
|
+
const references = {};
|
|
5479
|
+
await this.database.query(
|
|
5480
|
+
{
|
|
5481
|
+
collection: c.name,
|
|
5482
|
+
filterChain: makeFilterChain({
|
|
5483
|
+
conditions: [
|
|
5484
|
+
{
|
|
5485
|
+
filterPath: REFS_REFERENCE_FIELD,
|
|
5486
|
+
filterExpression: {
|
|
5487
|
+
_type: "string",
|
|
5488
|
+
_list: false,
|
|
5489
|
+
eq: id
|
|
5490
|
+
}
|
|
5491
|
+
}
|
|
5492
|
+
]
|
|
5493
|
+
}),
|
|
5494
|
+
sort: REFS_COLLECTIONS_SORT_KEY
|
|
5495
|
+
},
|
|
5496
|
+
(refId, rawItem) => {
|
|
5497
|
+
if (!references[c.name]) {
|
|
5498
|
+
references[c.name] = {};
|
|
5499
|
+
}
|
|
5500
|
+
if (!references[c.name][refId]) {
|
|
5501
|
+
references[c.name][refId] = [];
|
|
5502
|
+
}
|
|
5503
|
+
const referencePath = rawItem?.[REFS_PATH_FIELD];
|
|
5504
|
+
if (referencePath) {
|
|
5505
|
+
references[c.name][refId].push(referencePath);
|
|
5506
|
+
}
|
|
5507
|
+
return refId;
|
|
5508
|
+
}
|
|
5509
|
+
);
|
|
5510
|
+
return references;
|
|
5511
|
+
};
|
|
5034
5512
|
this.buildFieldMutations = async (fieldParams, template, existingData) => {
|
|
5035
5513
|
const accum = {};
|
|
5036
5514
|
for (const passwordField of template.fields.filter(
|
|
@@ -5117,6 +5595,27 @@ var Resolver = class {
|
|
|
5117
5595
|
}
|
|
5118
5596
|
return accum;
|
|
5119
5597
|
};
|
|
5598
|
+
/**
|
|
5599
|
+
* A mutation looks nearly identical between updateDocument:
|
|
5600
|
+
* ```graphql
|
|
5601
|
+
* updateDocument(collection: $collection,relativePath: $path, params: {
|
|
5602
|
+
* post: {
|
|
5603
|
+
* title: "Hello, World"
|
|
5604
|
+
* }
|
|
5605
|
+
* })`
|
|
5606
|
+
* ```
|
|
5607
|
+
* and `updatePostDocument`:
|
|
5608
|
+
* ```graphql
|
|
5609
|
+
* updatePostDocument(relativePath: $path, params: {
|
|
5610
|
+
* title: "Hello, World"
|
|
5611
|
+
* })
|
|
5612
|
+
* ```
|
|
5613
|
+
* The problem here is that we don't know whether the payload came from `updateDocument`
|
|
5614
|
+
* or `updatePostDocument` (we could, but for now it's easier not to pipe those details through),
|
|
5615
|
+
* But we do know that when given a `args.collection` value, we can assume that
|
|
5616
|
+
* this was a `updateDocument` request, and thus - should grab the data
|
|
5617
|
+
* from the corresponding field name in the key
|
|
5618
|
+
*/
|
|
5120
5619
|
this.buildParams = (args) => {
|
|
5121
5620
|
try {
|
|
5122
5621
|
assertShape(
|
|
@@ -5216,7 +5715,10 @@ var resolve = async ({
|
|
|
5216
5715
|
const graphQLSchema = buildASTSchema(graphQLSchemaAst);
|
|
5217
5716
|
const tinaConfig = await database.getTinaSchema();
|
|
5218
5717
|
const tinaSchema = await createSchema({
|
|
5718
|
+
// TODO: please update all the types to import from @tinacms/schema-tools
|
|
5719
|
+
// @ts-ignore
|
|
5219
5720
|
schema: tinaConfig,
|
|
5721
|
+
// @ts-ignore
|
|
5220
5722
|
flags: tinaConfig?.meta?.flags
|
|
5221
5723
|
});
|
|
5222
5724
|
const resolver = createResolver({
|
|
@@ -5233,8 +5735,7 @@ var resolve = async ({
|
|
|
5233
5735
|
database
|
|
5234
5736
|
},
|
|
5235
5737
|
typeResolver: async (source, _args, info) => {
|
|
5236
|
-
if (source.__typename)
|
|
5237
|
-
return source.__typename;
|
|
5738
|
+
if (source.__typename) return source.__typename;
|
|
5238
5739
|
const namedType = getNamedType(info.returnType).toString();
|
|
5239
5740
|
const lookup = await database.getLookup(namedType);
|
|
5240
5741
|
if (lookup.resolveType === "unionData") {
|
|
@@ -5383,11 +5884,13 @@ var resolve = async ({
|
|
|
5383
5884
|
set(
|
|
5384
5885
|
params,
|
|
5385
5886
|
userField.path.slice(1),
|
|
5887
|
+
// remove _rawData from users path
|
|
5386
5888
|
users.map((u) => {
|
|
5387
5889
|
if (user[idFieldName] === u[idFieldName]) {
|
|
5388
5890
|
return user;
|
|
5389
5891
|
}
|
|
5390
5892
|
return {
|
|
5893
|
+
// don't overwrite other users' passwords
|
|
5391
5894
|
...u,
|
|
5392
5895
|
[passwordFieldName]: {
|
|
5393
5896
|
...u[passwordFieldName],
|
|
@@ -5410,6 +5913,9 @@ var resolve = async ({
|
|
|
5410
5913
|
}
|
|
5411
5914
|
const isCreation = lookup[info.fieldName] === "create";
|
|
5412
5915
|
switch (lookup.resolveType) {
|
|
5916
|
+
/**
|
|
5917
|
+
* `node(id: $id)`
|
|
5918
|
+
*/
|
|
5413
5919
|
case "nodeDocument":
|
|
5414
5920
|
assertShape(
|
|
5415
5921
|
args,
|
|
@@ -5441,6 +5947,7 @@ var resolve = async ({
|
|
|
5441
5947
|
collection: args.collection,
|
|
5442
5948
|
isMutation,
|
|
5443
5949
|
isCreation,
|
|
5950
|
+
// Right now this is the only case for deletion
|
|
5444
5951
|
isDeletion: info.fieldName === "deleteDocument",
|
|
5445
5952
|
isFolderCreation: info.fieldName === "createFolder",
|
|
5446
5953
|
isUpdateName: Boolean(args?.params?.relativePath),
|
|
@@ -5450,6 +5957,9 @@ var resolve = async ({
|
|
|
5450
5957
|
return result;
|
|
5451
5958
|
}
|
|
5452
5959
|
return value;
|
|
5960
|
+
/**
|
|
5961
|
+
* eg `getMovieDocument.data.actors`
|
|
5962
|
+
*/
|
|
5453
5963
|
case "multiCollectionDocumentList":
|
|
5454
5964
|
if (Array.isArray(value)) {
|
|
5455
5965
|
return {
|
|
@@ -5461,7 +5971,15 @@ var resolve = async ({
|
|
|
5461
5971
|
}
|
|
5462
5972
|
if (info.fieldName === "documents" && value?.collection && value?.hasDocuments) {
|
|
5463
5973
|
let filter = args.filter;
|
|
5464
|
-
if (
|
|
5974
|
+
if (
|
|
5975
|
+
// 1. Make sure that the filter exists
|
|
5976
|
+
typeof args?.filter !== "undefined" && args?.filter !== null && // 2. Make sure that the collection name exists
|
|
5977
|
+
// @ts-ignore
|
|
5978
|
+
typeof value?.collection?.name === "string" && // 3. Make sure that the collection name is in the filter and is not undefined
|
|
5979
|
+
// @ts-ignore
|
|
5980
|
+
Object.keys(args.filter).includes(value?.collection?.name) && // @ts-ignore
|
|
5981
|
+
typeof args.filter[value?.collection?.name] !== "undefined"
|
|
5982
|
+
) {
|
|
5465
5983
|
filter = args.filter[value.collection.name];
|
|
5466
5984
|
}
|
|
5467
5985
|
return resolver.resolveCollectionConnection({
|
|
@@ -5469,12 +5987,20 @@ var resolve = async ({
|
|
|
5469
5987
|
...args,
|
|
5470
5988
|
filter
|
|
5471
5989
|
},
|
|
5990
|
+
// @ts-ignore
|
|
5472
5991
|
collection: value.collection
|
|
5473
5992
|
});
|
|
5474
5993
|
}
|
|
5475
5994
|
throw new Error(
|
|
5476
5995
|
`Expected an array for result of ${info.fieldName} at ${info.path}`
|
|
5477
5996
|
);
|
|
5997
|
+
/**
|
|
5998
|
+
* Collections-specific getter
|
|
5999
|
+
* eg. `getPostDocument`/`createPostDocument`/`updatePostDocument`
|
|
6000
|
+
*
|
|
6001
|
+
* if coming from a query result
|
|
6002
|
+
* the field will be `node`
|
|
6003
|
+
*/
|
|
5478
6004
|
case "collectionDocument": {
|
|
5479
6005
|
if (value) {
|
|
5480
6006
|
return value;
|
|
@@ -5489,11 +6015,32 @@ var resolve = async ({
|
|
|
5489
6015
|
});
|
|
5490
6016
|
return result;
|
|
5491
6017
|
}
|
|
6018
|
+
/**
|
|
6019
|
+
* Collections-specific list getter
|
|
6020
|
+
* eg. `getPageList`
|
|
6021
|
+
*/
|
|
5492
6022
|
case "collectionDocumentList":
|
|
5493
6023
|
return resolver.resolveCollectionConnection({
|
|
5494
6024
|
args,
|
|
5495
6025
|
collection: tinaSchema.getCollection(lookup.collection)
|
|
5496
6026
|
});
|
|
6027
|
+
/**
|
|
6028
|
+
* A polymorphic data set, it can be from a document's data
|
|
6029
|
+
* of any nested object which can be one of many shapes
|
|
6030
|
+
*
|
|
6031
|
+
* ```graphql
|
|
6032
|
+
* getPostDocument(relativePath: $relativePath) {
|
|
6033
|
+
* data {...} <- this part
|
|
6034
|
+
* }
|
|
6035
|
+
* ```
|
|
6036
|
+
* ```graphql
|
|
6037
|
+
* getBlockDocument(relativePath: $relativePath) {
|
|
6038
|
+
* data {
|
|
6039
|
+
* blocks {...} <- or this part
|
|
6040
|
+
* }
|
|
6041
|
+
* }
|
|
6042
|
+
* ```
|
|
6043
|
+
*/
|
|
5497
6044
|
case "unionData":
|
|
5498
6045
|
if (!value) {
|
|
5499
6046
|
if (args.relativePath) {
|
|
@@ -5558,8 +6105,7 @@ var TinaLevelClient = class extends ManyLevelGuest {
|
|
|
5558
6105
|
this.port = port || 9e3;
|
|
5559
6106
|
}
|
|
5560
6107
|
openConnection() {
|
|
5561
|
-
if (this._connected)
|
|
5562
|
-
return;
|
|
6108
|
+
if (this._connected) return;
|
|
5563
6109
|
const socket = connect(this.port);
|
|
5564
6110
|
pipeline(socket, this.createRpcStream(), socket, () => {
|
|
5565
6111
|
this._connected = false;
|
|
@@ -5569,7 +6115,7 @@ var TinaLevelClient = class extends ManyLevelGuest {
|
|
|
5569
6115
|
};
|
|
5570
6116
|
|
|
5571
6117
|
// src/database/index.ts
|
|
5572
|
-
import path4 from "path";
|
|
6118
|
+
import path4 from "node:path";
|
|
5573
6119
|
import { GraphQLError as GraphQLError5 } from "graphql";
|
|
5574
6120
|
import micromatch2 from "micromatch";
|
|
5575
6121
|
import sha2 from "js-sha1";
|
|
@@ -5704,6 +6250,7 @@ var Database = class {
|
|
|
5704
6250
|
);
|
|
5705
6251
|
const indexDefinitions = await this.getIndexDefinitions(this.contentLevel);
|
|
5706
6252
|
const collectionIndexDefinitions = indexDefinitions?.[collection.name];
|
|
6253
|
+
const collectionReferences = (await this.getCollectionReferences())?.[collection.name];
|
|
5707
6254
|
const normalizedPath = normalizePath(filepath);
|
|
5708
6255
|
if (!collection?.isDetached) {
|
|
5709
6256
|
if (this.bridge) {
|
|
@@ -5732,6 +6279,14 @@ var Database = class {
|
|
|
5732
6279
|
let delOps = [];
|
|
5733
6280
|
if (!isGitKeep(normalizedPath, collection)) {
|
|
5734
6281
|
putOps = [
|
|
6282
|
+
...makeRefOpsForDocument(
|
|
6283
|
+
normalizedPath,
|
|
6284
|
+
collection?.name,
|
|
6285
|
+
collectionReferences,
|
|
6286
|
+
dataFields,
|
|
6287
|
+
"put",
|
|
6288
|
+
level
|
|
6289
|
+
),
|
|
5735
6290
|
...makeIndexOpsForDocument(
|
|
5736
6291
|
normalizedPath,
|
|
5737
6292
|
collection?.name,
|
|
@@ -5740,6 +6295,7 @@ var Database = class {
|
|
|
5740
6295
|
"put",
|
|
5741
6296
|
level
|
|
5742
6297
|
),
|
|
6298
|
+
// folder indices
|
|
5743
6299
|
...makeIndexOpsForDocument(
|
|
5744
6300
|
normalizedPath,
|
|
5745
6301
|
`${collection?.name}_${folderKey}`,
|
|
@@ -5754,6 +6310,14 @@ var Database = class {
|
|
|
5754
6310
|
SUBLEVEL_OPTIONS
|
|
5755
6311
|
).get(normalizedPath);
|
|
5756
6312
|
delOps = existingItem ? [
|
|
6313
|
+
...makeRefOpsForDocument(
|
|
6314
|
+
normalizedPath,
|
|
6315
|
+
collection?.name,
|
|
6316
|
+
collectionReferences,
|
|
6317
|
+
existingItem,
|
|
6318
|
+
"del",
|
|
6319
|
+
level
|
|
6320
|
+
),
|
|
5757
6321
|
...makeIndexOpsForDocument(
|
|
5758
6322
|
normalizedPath,
|
|
5759
6323
|
collection?.name,
|
|
@@ -5762,6 +6326,7 @@ var Database = class {
|
|
|
5762
6326
|
"del",
|
|
5763
6327
|
level
|
|
5764
6328
|
),
|
|
6329
|
+
// folder indices
|
|
5765
6330
|
...makeIndexOpsForDocument(
|
|
5766
6331
|
normalizedPath,
|
|
5767
6332
|
`${collection?.name}_${folderKey}`,
|
|
@@ -5800,6 +6365,7 @@ var Database = class {
|
|
|
5800
6365
|
);
|
|
5801
6366
|
collectionIndexDefinitions = indexDefinitions?.[collectionName];
|
|
5802
6367
|
}
|
|
6368
|
+
const collectionReferences = (await this.getCollectionReferences())?.[collectionName];
|
|
5803
6369
|
const normalizedPath = normalizePath(filepath);
|
|
5804
6370
|
const dataFields = await this.formatBodyOnPayload(filepath, data);
|
|
5805
6371
|
const collection = await this.collectionForPath(filepath);
|
|
@@ -5847,6 +6413,14 @@ var Database = class {
|
|
|
5847
6413
|
let delOps = [];
|
|
5848
6414
|
if (!isGitKeep(normalizedPath, collection)) {
|
|
5849
6415
|
putOps = [
|
|
6416
|
+
...makeRefOpsForDocument(
|
|
6417
|
+
normalizedPath,
|
|
6418
|
+
collectionName,
|
|
6419
|
+
collectionReferences,
|
|
6420
|
+
dataFields,
|
|
6421
|
+
"put",
|
|
6422
|
+
level
|
|
6423
|
+
),
|
|
5850
6424
|
...makeIndexOpsForDocument(
|
|
5851
6425
|
normalizedPath,
|
|
5852
6426
|
collectionName,
|
|
@@ -5855,6 +6429,7 @@ var Database = class {
|
|
|
5855
6429
|
"put",
|
|
5856
6430
|
level
|
|
5857
6431
|
),
|
|
6432
|
+
// folder indices
|
|
5858
6433
|
...makeIndexOpsForDocument(
|
|
5859
6434
|
normalizedPath,
|
|
5860
6435
|
`${collection?.name}_${folderKey}`,
|
|
@@ -5869,6 +6444,14 @@ var Database = class {
|
|
|
5869
6444
|
SUBLEVEL_OPTIONS
|
|
5870
6445
|
).get(normalizedPath);
|
|
5871
6446
|
delOps = existingItem ? [
|
|
6447
|
+
...makeRefOpsForDocument(
|
|
6448
|
+
normalizedPath,
|
|
6449
|
+
collectionName,
|
|
6450
|
+
collectionReferences,
|
|
6451
|
+
existingItem,
|
|
6452
|
+
"del",
|
|
6453
|
+
level
|
|
6454
|
+
),
|
|
5872
6455
|
...makeIndexOpsForDocument(
|
|
5873
6456
|
normalizedPath,
|
|
5874
6457
|
collectionName,
|
|
@@ -5877,6 +6460,7 @@ var Database = class {
|
|
|
5877
6460
|
"del",
|
|
5878
6461
|
level
|
|
5879
6462
|
),
|
|
6463
|
+
// folder indices
|
|
5880
6464
|
...makeIndexOpsForDocument(
|
|
5881
6465
|
normalizedPath,
|
|
5882
6466
|
`${collection?.name}_${folderKey}`,
|
|
@@ -5954,6 +6538,7 @@ var Database = class {
|
|
|
5954
6538
|
aliasedData,
|
|
5955
6539
|
extension,
|
|
5956
6540
|
writeTemplateKey,
|
|
6541
|
+
//templateInfo.type === 'union',
|
|
5957
6542
|
{
|
|
5958
6543
|
frontmatterFormat: collection?.frontmatterFormat,
|
|
5959
6544
|
frontmatterDelimiters: collection?.frontmatterDelimiters
|
|
@@ -5992,6 +6577,7 @@ var Database = class {
|
|
|
5992
6577
|
SUBLEVEL_OPTIONS
|
|
5993
6578
|
).get(graphqlPath);
|
|
5994
6579
|
};
|
|
6580
|
+
//TODO - is there a reason why the database fetches some config with "bridge.get", and some with "store.get"?
|
|
5995
6581
|
this.getGraphQLSchemaFromBridge = async () => {
|
|
5996
6582
|
if (!this.bridge) {
|
|
5997
6583
|
throw new Error(`No bridge configured`);
|
|
@@ -6028,6 +6614,22 @@ var Database = class {
|
|
|
6028
6614
|
this.tinaSchema = await createSchema({ schema });
|
|
6029
6615
|
return this.tinaSchema;
|
|
6030
6616
|
};
|
|
6617
|
+
this.getCollectionReferences = async (level) => {
|
|
6618
|
+
if (this.collectionReferences) {
|
|
6619
|
+
return this.collectionReferences;
|
|
6620
|
+
}
|
|
6621
|
+
const result = {};
|
|
6622
|
+
const schema = await this.getSchema(level || this.contentLevel);
|
|
6623
|
+
const collections = schema.getCollections();
|
|
6624
|
+
for (const collection of collections) {
|
|
6625
|
+
const collectionReferences = this.tinaSchema.findReferencesFromCollection(
|
|
6626
|
+
collection.name
|
|
6627
|
+
);
|
|
6628
|
+
result[collection.name] = collectionReferences;
|
|
6629
|
+
}
|
|
6630
|
+
this.collectionReferences = result;
|
|
6631
|
+
return result;
|
|
6632
|
+
};
|
|
6031
6633
|
this.getIndexDefinitions = async (level) => {
|
|
6032
6634
|
if (!this.collectionIndexDefinitions) {
|
|
6033
6635
|
await new Promise(async (resolve2, reject) => {
|
|
@@ -6037,10 +6639,53 @@ var Database = class {
|
|
|
6037
6639
|
const collections = schema.getCollections();
|
|
6038
6640
|
for (const collection of collections) {
|
|
6039
6641
|
const indexDefinitions = {
|
|
6040
|
-
[DEFAULT_COLLECTION_SORT_KEY]: { fields: [] }
|
|
6642
|
+
[DEFAULT_COLLECTION_SORT_KEY]: { fields: [] },
|
|
6643
|
+
// provide a default sort key which is the file sort
|
|
6644
|
+
// pseudo-index for the collection's references
|
|
6645
|
+
[REFS_COLLECTIONS_SORT_KEY]: {
|
|
6646
|
+
fields: [
|
|
6647
|
+
{
|
|
6648
|
+
name: REFS_REFERENCE_FIELD,
|
|
6649
|
+
type: "string",
|
|
6650
|
+
list: false
|
|
6651
|
+
},
|
|
6652
|
+
{
|
|
6653
|
+
name: REFS_PATH_FIELD,
|
|
6654
|
+
type: "string",
|
|
6655
|
+
list: false
|
|
6656
|
+
}
|
|
6657
|
+
]
|
|
6658
|
+
}
|
|
6041
6659
|
};
|
|
6042
|
-
|
|
6043
|
-
|
|
6660
|
+
let fields = [];
|
|
6661
|
+
if (collection.templates) {
|
|
6662
|
+
const templateFieldMap = {};
|
|
6663
|
+
const conflictedFields = /* @__PURE__ */ new Set();
|
|
6664
|
+
for (const template of collection.templates) {
|
|
6665
|
+
for (const field of template.fields) {
|
|
6666
|
+
if (!templateFieldMap[field.name]) {
|
|
6667
|
+
templateFieldMap[field.name] = field;
|
|
6668
|
+
} else {
|
|
6669
|
+
if (templateFieldMap[field.name].type !== field.type) {
|
|
6670
|
+
console.warn(
|
|
6671
|
+
`Field ${field.name} has conflicting types in templates - skipping index`
|
|
6672
|
+
);
|
|
6673
|
+
conflictedFields.add(field.name);
|
|
6674
|
+
}
|
|
6675
|
+
}
|
|
6676
|
+
}
|
|
6677
|
+
}
|
|
6678
|
+
for (const conflictedField in conflictedFields) {
|
|
6679
|
+
delete templateFieldMap[conflictedField];
|
|
6680
|
+
}
|
|
6681
|
+
for (const field of Object.values(templateFieldMap)) {
|
|
6682
|
+
fields.push(field);
|
|
6683
|
+
}
|
|
6684
|
+
} else if (collection.fields) {
|
|
6685
|
+
fields = collection.fields;
|
|
6686
|
+
}
|
|
6687
|
+
if (fields) {
|
|
6688
|
+
for (const field of fields) {
|
|
6044
6689
|
if (field.indexed !== void 0 && field.indexed === false || field.type === "object") {
|
|
6045
6690
|
continue;
|
|
6046
6691
|
}
|
|
@@ -6188,29 +6833,36 @@ var Database = class {
|
|
|
6188
6833
|
}
|
|
6189
6834
|
startKey = startKey || key || "";
|
|
6190
6835
|
endKey = key || "";
|
|
6191
|
-
edges = [...edges, { cursor: key, path: filepath }];
|
|
6836
|
+
edges = [...edges, { cursor: key, path: filepath, value: itemRecord }];
|
|
6192
6837
|
}
|
|
6193
6838
|
return {
|
|
6194
|
-
edges: await sequential(
|
|
6195
|
-
|
|
6196
|
-
|
|
6197
|
-
|
|
6198
|
-
|
|
6199
|
-
|
|
6200
|
-
|
|
6201
|
-
|
|
6202
|
-
|
|
6203
|
-
|
|
6204
|
-
|
|
6205
|
-
|
|
6206
|
-
|
|
6207
|
-
|
|
6208
|
-
|
|
6209
|
-
|
|
6839
|
+
edges: await sequential(
|
|
6840
|
+
edges,
|
|
6841
|
+
async ({
|
|
6842
|
+
cursor,
|
|
6843
|
+
path: path7,
|
|
6844
|
+
value
|
|
6845
|
+
}) => {
|
|
6846
|
+
try {
|
|
6847
|
+
const node = await hydrator(path7, value);
|
|
6848
|
+
return {
|
|
6849
|
+
node,
|
|
6850
|
+
cursor: btoa(cursor)
|
|
6851
|
+
};
|
|
6852
|
+
} catch (error) {
|
|
6853
|
+
console.log(error);
|
|
6854
|
+
if (error instanceof Error && (!path7.includes(".tina/__generated__/_graphql.json") || !path7.includes("tina/__generated__/_graphql.json"))) {
|
|
6855
|
+
throw new TinaQueryError({
|
|
6856
|
+
originalError: error,
|
|
6857
|
+
file: path7,
|
|
6858
|
+
collection: collection.name,
|
|
6859
|
+
stack: error.stack
|
|
6860
|
+
});
|
|
6861
|
+
}
|
|
6862
|
+
throw error;
|
|
6210
6863
|
}
|
|
6211
|
-
throw error;
|
|
6212
6864
|
}
|
|
6213
|
-
|
|
6865
|
+
),
|
|
6214
6866
|
pageInfo: {
|
|
6215
6867
|
hasPreviousPage,
|
|
6216
6868
|
hasNextPage,
|
|
@@ -6356,17 +7008,18 @@ var Database = class {
|
|
|
6356
7008
|
throw new Error(`No collection found for path: ${filepath}`);
|
|
6357
7009
|
}
|
|
6358
7010
|
const indexDefinitions = await this.getIndexDefinitions(this.contentLevel);
|
|
7011
|
+
const collectionReferences = (await this.getCollectionReferences())?.[collection.name];
|
|
6359
7012
|
const collectionIndexDefinitions = indexDefinitions?.[collection.name];
|
|
6360
7013
|
let level = this.contentLevel;
|
|
6361
7014
|
if (collection?.isDetached) {
|
|
6362
7015
|
level = this.appLevel.sublevel(collection?.name, SUBLEVEL_OPTIONS);
|
|
6363
7016
|
}
|
|
6364
|
-
const
|
|
7017
|
+
const normalizedPath = normalizePath(filepath);
|
|
6365
7018
|
const rootSublevel = level.sublevel(
|
|
6366
7019
|
CONTENT_ROOT_PREFIX,
|
|
6367
7020
|
SUBLEVEL_OPTIONS
|
|
6368
7021
|
);
|
|
6369
|
-
const item = await rootSublevel.get(
|
|
7022
|
+
const item = await rootSublevel.get(normalizedPath);
|
|
6370
7023
|
if (item) {
|
|
6371
7024
|
const folderTreeBuilder = new FolderTreeBuilder();
|
|
6372
7025
|
const folderKey = folderTreeBuilder.update(
|
|
@@ -6374,16 +7027,25 @@ var Database = class {
|
|
|
6374
7027
|
collection.path || ""
|
|
6375
7028
|
);
|
|
6376
7029
|
await this.contentLevel.batch([
|
|
7030
|
+
...makeRefOpsForDocument(
|
|
7031
|
+
normalizedPath,
|
|
7032
|
+
collection.name,
|
|
7033
|
+
collectionReferences,
|
|
7034
|
+
item,
|
|
7035
|
+
"del",
|
|
7036
|
+
level
|
|
7037
|
+
),
|
|
6377
7038
|
...makeIndexOpsForDocument(
|
|
6378
|
-
|
|
7039
|
+
normalizedPath,
|
|
6379
7040
|
collection.name,
|
|
6380
7041
|
collectionIndexDefinitions,
|
|
6381
7042
|
item,
|
|
6382
7043
|
"del",
|
|
6383
7044
|
level
|
|
6384
7045
|
),
|
|
7046
|
+
// folder indices
|
|
6385
7047
|
...makeIndexOpsForDocument(
|
|
6386
|
-
|
|
7048
|
+
normalizedPath,
|
|
6387
7049
|
`${collection.name}_${folderKey}`,
|
|
6388
7050
|
collectionIndexDefinitions,
|
|
6389
7051
|
item,
|
|
@@ -6392,17 +7054,17 @@ var Database = class {
|
|
|
6392
7054
|
),
|
|
6393
7055
|
{
|
|
6394
7056
|
type: "del",
|
|
6395
|
-
key:
|
|
7057
|
+
key: normalizedPath,
|
|
6396
7058
|
sublevel: rootSublevel
|
|
6397
7059
|
}
|
|
6398
7060
|
]);
|
|
6399
7061
|
}
|
|
6400
7062
|
if (!collection?.isDetached) {
|
|
6401
7063
|
if (this.bridge) {
|
|
6402
|
-
await this.bridge.delete(
|
|
7064
|
+
await this.bridge.delete(normalizedPath);
|
|
6403
7065
|
}
|
|
6404
7066
|
try {
|
|
6405
|
-
await this.onDelete(
|
|
7067
|
+
await this.onDelete(normalizedPath);
|
|
6406
7068
|
} catch (e) {
|
|
6407
7069
|
throw new GraphQLError5(
|
|
6408
7070
|
`Error running onDelete hook for ${filepath}: ${e}`,
|
|
@@ -6450,7 +7112,13 @@ var Database = class {
|
|
|
6450
7112
|
);
|
|
6451
7113
|
}
|
|
6452
7114
|
} else {
|
|
6453
|
-
await _indexContent(
|
|
7115
|
+
await _indexContent(
|
|
7116
|
+
this,
|
|
7117
|
+
level,
|
|
7118
|
+
contentPaths,
|
|
7119
|
+
enqueueOps,
|
|
7120
|
+
collection
|
|
7121
|
+
);
|
|
6454
7122
|
}
|
|
6455
7123
|
}
|
|
6456
7124
|
);
|
|
@@ -6536,6 +7204,9 @@ var Database = class {
|
|
|
6536
7204
|
info: templateInfo
|
|
6537
7205
|
};
|
|
6538
7206
|
}
|
|
7207
|
+
/**
|
|
7208
|
+
* Clears the internal cache of the tinaSchema and the lookup file. This allows the state to be reset
|
|
7209
|
+
*/
|
|
6539
7210
|
clearCache() {
|
|
6540
7211
|
this.tinaSchema = null;
|
|
6541
7212
|
this._lookup = null;
|
|
@@ -6597,6 +7268,7 @@ var _indexContent = async (database, level, documentPaths, enqueueOps, collectio
|
|
|
6597
7268
|
}
|
|
6598
7269
|
collectionPath = collection.path;
|
|
6599
7270
|
}
|
|
7271
|
+
const collectionReferences = (await database.getCollectionReferences())?.[collection?.name];
|
|
6600
7272
|
const tinaSchema = await database.getSchema();
|
|
6601
7273
|
let templateInfo = null;
|
|
6602
7274
|
if (collection) {
|
|
@@ -6618,12 +7290,59 @@ var _indexContent = async (database, level, documentPaths, enqueueOps, collectio
|
|
|
6618
7290
|
await hashPasswordValues(aliasedData, passwordFields);
|
|
6619
7291
|
}
|
|
6620
7292
|
const normalizedPath = normalizePath(filepath);
|
|
7293
|
+
const rootSublevel = level.sublevel(
|
|
7294
|
+
CONTENT_ROOT_PREFIX,
|
|
7295
|
+
SUBLEVEL_OPTIONS
|
|
7296
|
+
);
|
|
6621
7297
|
const folderKey = folderTreeBuilder.update(
|
|
6622
7298
|
normalizedPath,
|
|
6623
7299
|
collectionPath || ""
|
|
6624
7300
|
);
|
|
7301
|
+
const item = await rootSublevel.get(normalizedPath);
|
|
7302
|
+
if (item) {
|
|
7303
|
+
await database.contentLevel.batch([
|
|
7304
|
+
...makeRefOpsForDocument(
|
|
7305
|
+
normalizedPath,
|
|
7306
|
+
collection?.name,
|
|
7307
|
+
collectionReferences,
|
|
7308
|
+
item,
|
|
7309
|
+
"del",
|
|
7310
|
+
level
|
|
7311
|
+
),
|
|
7312
|
+
...makeIndexOpsForDocument(
|
|
7313
|
+
normalizedPath,
|
|
7314
|
+
collection.name,
|
|
7315
|
+
collectionIndexDefinitions,
|
|
7316
|
+
item,
|
|
7317
|
+
"del",
|
|
7318
|
+
level
|
|
7319
|
+
),
|
|
7320
|
+
// folder indices
|
|
7321
|
+
...makeIndexOpsForDocument(
|
|
7322
|
+
normalizedPath,
|
|
7323
|
+
`${collection.name}_${folderKey}`,
|
|
7324
|
+
collectionIndexDefinitions,
|
|
7325
|
+
item,
|
|
7326
|
+
"del",
|
|
7327
|
+
level
|
|
7328
|
+
),
|
|
7329
|
+
{
|
|
7330
|
+
type: "del",
|
|
7331
|
+
key: normalizedPath,
|
|
7332
|
+
sublevel: rootSublevel
|
|
7333
|
+
}
|
|
7334
|
+
]);
|
|
7335
|
+
}
|
|
6625
7336
|
if (!isGitKeep(filepath, collection)) {
|
|
6626
7337
|
await enqueueOps([
|
|
7338
|
+
...makeRefOpsForDocument(
|
|
7339
|
+
normalizedPath,
|
|
7340
|
+
collection?.name,
|
|
7341
|
+
collectionReferences,
|
|
7342
|
+
aliasedData,
|
|
7343
|
+
"put",
|
|
7344
|
+
level
|
|
7345
|
+
),
|
|
6627
7346
|
...makeIndexOpsForDocument(
|
|
6628
7347
|
normalizedPath,
|
|
6629
7348
|
collection?.name,
|
|
@@ -6632,6 +7351,7 @@ var _indexContent = async (database, level, documentPaths, enqueueOps, collectio
|
|
|
6632
7351
|
"put",
|
|
6633
7352
|
level
|
|
6634
7353
|
),
|
|
7354
|
+
// folder indexes
|
|
6635
7355
|
...makeIndexOpsForDocument(
|
|
6636
7356
|
normalizedPath,
|
|
6637
7357
|
`${collection?.name}_${folderKey}`,
|
|
@@ -6686,6 +7406,7 @@ var _deleteIndexContent = async (database, documentPaths, enqueueOps, collection
|
|
|
6686
7406
|
throw new Error(`No indexDefinitions for collection ${collection.name}`);
|
|
6687
7407
|
}
|
|
6688
7408
|
}
|
|
7409
|
+
const collectionReferences = (await database.getCollectionReferences())?.[collection?.name];
|
|
6689
7410
|
const tinaSchema = await database.getSchema();
|
|
6690
7411
|
let templateInfo = null;
|
|
6691
7412
|
if (collection) {
|
|
@@ -6709,6 +7430,14 @@ var _deleteIndexContent = async (database, documentPaths, enqueueOps, collection
|
|
|
6709
7430
|
item
|
|
6710
7431
|
) : item;
|
|
6711
7432
|
await enqueueOps([
|
|
7433
|
+
...makeRefOpsForDocument(
|
|
7434
|
+
itemKey,
|
|
7435
|
+
collection?.name,
|
|
7436
|
+
collectionReferences,
|
|
7437
|
+
aliasedData,
|
|
7438
|
+
"del",
|
|
7439
|
+
database.contentLevel
|
|
7440
|
+
),
|
|
6712
7441
|
...makeIndexOpsForDocument(
|
|
6713
7442
|
itemKey,
|
|
6714
7443
|
collection.name,
|
|
@@ -6717,6 +7446,7 @@ var _deleteIndexContent = async (database, documentPaths, enqueueOps, collection
|
|
|
6717
7446
|
"del",
|
|
6718
7447
|
database.contentLevel
|
|
6719
7448
|
),
|
|
7449
|
+
// folder indexes
|
|
6720
7450
|
...makeIndexOpsForDocument(
|
|
6721
7451
|
itemKey,
|
|
6722
7452
|
`${collection?.name}_${folderKey}`,
|
|
@@ -6932,17 +7662,26 @@ var IsomorphicBridge = class {
|
|
|
6932
7662
|
getAuthor() {
|
|
6933
7663
|
return {
|
|
6934
7664
|
...this.author,
|
|
6935
|
-
timestamp: Math.round(new Date().getTime() / 1e3),
|
|
7665
|
+
timestamp: Math.round((/* @__PURE__ */ new Date()).getTime() / 1e3),
|
|
6936
7666
|
timezoneOffset: 0
|
|
6937
7667
|
};
|
|
6938
7668
|
}
|
|
6939
7669
|
getCommitter() {
|
|
6940
7670
|
return {
|
|
6941
7671
|
...this.committer,
|
|
6942
|
-
timestamp: Math.round(new Date().getTime() / 1e3),
|
|
7672
|
+
timestamp: Math.round((/* @__PURE__ */ new Date()).getTime() / 1e3),
|
|
6943
7673
|
timezoneOffset: 0
|
|
6944
7674
|
};
|
|
6945
7675
|
}
|
|
7676
|
+
/**
|
|
7677
|
+
* Recursively populate paths matching `pattern` for the given `entry`
|
|
7678
|
+
*
|
|
7679
|
+
* @param pattern - pattern to filter paths by
|
|
7680
|
+
* @param entry - TreeEntry to start building list from
|
|
7681
|
+
* @param path - base path
|
|
7682
|
+
* @param results
|
|
7683
|
+
* @private
|
|
7684
|
+
*/
|
|
6946
7685
|
async listEntries({
|
|
6947
7686
|
pattern,
|
|
6948
7687
|
entry,
|
|
@@ -6975,6 +7714,15 @@ var IsomorphicBridge = class {
|
|
|
6975
7714
|
});
|
|
6976
7715
|
}
|
|
6977
7716
|
}
|
|
7717
|
+
/**
|
|
7718
|
+
* For the specified path, returns an object with an array containing the parts of the path (pathParts)
|
|
7719
|
+
* and an array containing the WalkerEntry objects for the path parts (pathEntries). Any null elements in the
|
|
7720
|
+
* pathEntries are placeholders for non-existent entries.
|
|
7721
|
+
*
|
|
7722
|
+
* @param path - path being resolved
|
|
7723
|
+
* @param ref - ref to resolve path entries for
|
|
7724
|
+
* @private
|
|
7725
|
+
*/
|
|
6978
7726
|
async resolvePathEntries(path7, ref) {
|
|
6979
7727
|
let pathParts = path7.split("/");
|
|
6980
7728
|
const result = await git2.walk({
|
|
@@ -7005,6 +7753,17 @@ var IsomorphicBridge = class {
|
|
|
7005
7753
|
}
|
|
7006
7754
|
return { pathParts, pathEntries };
|
|
7007
7755
|
}
|
|
7756
|
+
/**
|
|
7757
|
+
* Updates tree entry and associated parent tree entries
|
|
7758
|
+
*
|
|
7759
|
+
* @param existingOid - the existing OID
|
|
7760
|
+
* @param updatedOid - the updated OID
|
|
7761
|
+
* @param path - the path of the entry being updated
|
|
7762
|
+
* @param type - the type of the entry being updated (blob or tree)
|
|
7763
|
+
* @param pathEntries - parent path entries
|
|
7764
|
+
* @param pathParts - parent path parts
|
|
7765
|
+
* @private
|
|
7766
|
+
*/
|
|
7008
7767
|
async updateTreeHierarchy(existingOid, updatedOid, path7, type, pathEntries, pathParts) {
|
|
7009
7768
|
const lastIdx = pathEntries.length - 1;
|
|
7010
7769
|
const parentEntry = pathEntries[lastIdx];
|
|
@@ -7060,6 +7819,13 @@ var IsomorphicBridge = class {
|
|
|
7060
7819
|
);
|
|
7061
7820
|
}
|
|
7062
7821
|
}
|
|
7822
|
+
/**
|
|
7823
|
+
* Creates a commit for the specified tree and updates the specified ref to point to the commit
|
|
7824
|
+
*
|
|
7825
|
+
* @param treeSha - sha of the new tree
|
|
7826
|
+
* @param ref - the ref that should be updated
|
|
7827
|
+
* @private
|
|
7828
|
+
*/
|
|
7063
7829
|
async commitTree(treeSha, ref) {
|
|
7064
7830
|
const commitSha = await git2.writeCommit({
|
|
7065
7831
|
...this.isomorphicConfig,
|
|
@@ -7072,6 +7838,7 @@ var IsomorphicBridge = class {
|
|
|
7072
7838
|
})
|
|
7073
7839
|
],
|
|
7074
7840
|
message: this.commitMessage,
|
|
7841
|
+
// TODO these should be configurable
|
|
7075
7842
|
author: this.getAuthor(),
|
|
7076
7843
|
committer: this.getCommitter()
|
|
7077
7844
|
}
|
|
@@ -7309,5 +8076,5 @@ export {
|
|
|
7309
8076
|
transformDocument,
|
|
7310
8077
|
transformDocumentIntoPayload
|
|
7311
8078
|
};
|
|
7312
|
-
//! Replaces _.flattenDeep()
|
|
7313
8079
|
//! Replaces _.get()
|
|
8080
|
+
//! Replaces _.flattenDeep()
|