gatsby 4.6.0-next.4 → 4.6.2
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/CHANGELOG.md +13 -0
- package/cache-dir/commonjs/production-app.js +12 -1
- package/cache-dir/production-app.js +11 -0
- package/dist/datastore/lmdb/query/run-query.js +1 -23
- package/dist/datastore/lmdb/query/run-query.js.map +1 -1
- package/dist/schema/graphql-engine/webpack-remove-apis-loader.js +4 -1
- package/dist/schema/graphql-engine/webpack-remove-apis-loader.js.map +1 -1
- package/dist/schema/node-model.js +29 -2
- package/dist/schema/node-model.js.map +1 -1
- package/dist/utils/babel-loader-helpers.js +9 -7
- package/dist/utils/babel-loader-helpers.js.map +1 -1
- package/dist/utils/babel-loader.js +13 -5
- package/dist/utils/babel-loader.js.map +1 -1
- package/dist/utils/node-manifest.js +2 -2
- package/dist/utils/node-manifest.js.map +1 -1
- package/dist/utils/webpack-utils.js +14 -2
- package/dist/utils/webpack-utils.js.map +1 -1
- package/dist/utils/webpack.config.js +8 -2
- package/dist/utils/webpack.config.js.map +1 -1
- package/package.json +20 -16
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,19 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
### [4.5.4](https://github.com/gatsbyjs/gatsby/commits/gatsby@4.5.4/packages/gatsby) (2022-01-19)
|
|
7
|
+
|
|
8
|
+
#### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- handle session storage not being available [#34525](https://github.com/gatsbyjs/gatsby/issues/34525) [#34539](https://github.com/gatsbyjs/gatsby/issues/34539) ([e69270b](https://github.com/gatsbyjs/gatsby/commit/e69270b01aee337993ec4084d354bf5b09becadf))
|
|
11
|
+
|
|
12
|
+
### [4.5.3](https://github.com/gatsbyjs/gatsby/commits/gatsby@4.5.3/packages/gatsby) (2022-01-17)
|
|
13
|
+
|
|
14
|
+
#### Bug Fixes
|
|
15
|
+
|
|
16
|
+
- handle loaded page being potentially undefined [#34488](https://github.com/gatsbyjs/gatsby/issues/34488) [#34509](https://github.com/gatsbyjs/gatsby/issues/34509) ([0d29e95](https://github.com/gatsbyjs/gatsby/commit/0d29e9579baf308521c07336b09944b737664c52))
|
|
17
|
+
- Fix issue with env variables not being passed to getServerData Fix [#34447](https://github.com/gatsbyjs/gatsby/issues/34447) Fix [#34508](https://github.com/gatsbyjs/gatsby/issues/34508) ([2fb74de](https://github.com/gatsbyjs/gatsby/commit/2fb74dec7d757f2d43d61be090475d98f4ca1b21))
|
|
18
|
+
|
|
6
19
|
### [4.5.2](https://github.com/gatsbyjs/gatsby/commits/gatsby@4.5.2/packages/gatsby) (2022-01-12)
|
|
7
20
|
|
|
8
21
|
**Note:** Version bump only for package gatsby
|
|
@@ -133,11 +133,22 @@ const reloadStorageKey = `gatsby-reload-compilation-hash-match`;
|
|
|
133
133
|
(0, _reachRouter.navigate)(__BASE_PATH__ + pagePath + (!pagePath.includes(`?`) ? browserLoc.search : ``) + browserLoc.hash, {
|
|
134
134
|
replace: true
|
|
135
135
|
});
|
|
136
|
-
}
|
|
136
|
+
} // It's possible that sessionStorage can throw an exception if access is not granted, see https://github.com/gatsbyjs/gatsby/issues/34512
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
const getSessionStorage = () => {
|
|
140
|
+
try {
|
|
141
|
+
return sessionStorage;
|
|
142
|
+
} catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
137
146
|
|
|
138
147
|
_loader.publicLoader.loadPage(browserLoc.pathname + browserLoc.search).then(page => {
|
|
139
148
|
var _page$page;
|
|
140
149
|
|
|
150
|
+
const sessionStorage = getSessionStorage();
|
|
151
|
+
|
|
141
152
|
if (page !== null && page !== void 0 && (_page$page = page.page) !== null && _page$page !== void 0 && _page$page.webpackCompilationHash && page.page.webpackCompilationHash !== window.___webpackCompilationHash) {
|
|
142
153
|
// Purge plugin-offline cache
|
|
143
154
|
if (`serviceWorker` in navigator && navigator.serviceWorker.controller !== null && navigator.serviceWorker.controller.state === `activated`) {
|
|
@@ -162,7 +162,18 @@ apiRunnerAsync(`onClientEntry`).then(() => {
|
|
|
162
162
|
)
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
+
// It's possible that sessionStorage can throw an exception if access is not granted, see https://github.com/gatsbyjs/gatsby/issues/34512
|
|
166
|
+
const getSessionStorage = () => {
|
|
167
|
+
try {
|
|
168
|
+
return sessionStorage
|
|
169
|
+
} catch {
|
|
170
|
+
return null
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
165
174
|
publicLoader.loadPage(browserLoc.pathname + browserLoc.search).then(page => {
|
|
175
|
+
const sessionStorage = getSessionStorage()
|
|
176
|
+
|
|
166
177
|
if (
|
|
167
178
|
page?.page?.webpackCompilationHash &&
|
|
168
179
|
page.page.webpackCompilationHash !== window.___webpackCompilationHash
|
|
@@ -20,17 +20,7 @@ var _suggestIndex = require("./suggest-index");
|
|
|
20
20
|
|
|
21
21
|
async function doRunQuery(args) {
|
|
22
22
|
// Note: Keeping doRunQuery method the only async method in chain for perf
|
|
23
|
-
const context = createQueryContext(args);
|
|
24
|
-
|
|
25
|
-
const nodeId = getFilterById(context);
|
|
26
|
-
|
|
27
|
-
if (nodeId) {
|
|
28
|
-
const node = args.datastore.getNode(nodeId);
|
|
29
|
-
return {
|
|
30
|
-
entries: new _iterable.GatsbyIterable(node ? [node] : []),
|
|
31
|
-
totalCount: async () => node ? 1 : 0
|
|
32
|
-
};
|
|
33
|
-
}
|
|
23
|
+
const context = createQueryContext(args);
|
|
34
24
|
|
|
35
25
|
const totalCount = async () => runCountOnce({ ...context,
|
|
36
26
|
limit: undefined,
|
|
@@ -315,18 +305,6 @@ function isFullyFiltered(dbQueries, usedQueries) {
|
|
|
315
305
|
return dbQueries.length === usedQueries.size;
|
|
316
306
|
}
|
|
317
307
|
|
|
318
|
-
function getFilterById(context) {
|
|
319
|
-
for (const q of context.dbQueries) {
|
|
320
|
-
const filter = (0, _query.getFilterStatement)(q);
|
|
321
|
-
|
|
322
|
-
if (filter.comparator === _query.DbComparator.EQ && (0, _query.dbQueryToDottedField)(q) === `id`) {
|
|
323
|
-
return String(filter.value);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
return undefined;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
308
|
function createNodeSortComparator(sortFields) {
|
|
331
309
|
const resolvedNodesCache = _redux.store.getState().resolvedNodesCache;
|
|
332
310
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/datastore/lmdb/query/run-query.ts"],"names":["doRunQuery","args","context","createQueryContext","nodeId","getFilterById","node","datastore","getNode","entries","GatsbyIterable","totalCount","runCountOnce","limit","undefined","skip","canUseIndex","Promise","all","nodeTypeNames","map","typeName","suggestedIndexFields","performIndexScan","performFullTableScan","sortFields","filterContext","length","result","resultOffset","indexMetadata","needsSorting","nodes","usedSkip","filterNodes","concat","canUseIndexForSorting","mergeSorted","createNodeSortComparator","unlimited","sortedNodes","sortNodesInMemory","actualSkip","slice","runCount","count","needsFiltering","countNodes","completeFiltering","iterateNodesByType","_","e","usedQueries","reverse","Array","from","values","value","filter","Boolean","intermediateResult","Set","dbQueries","isFullyFiltered","resolvedNodes","store","getState","resolvedNodesCache","filtersToApply","q","has","resolvedFields","get","internal","type","id","dottedField","tmp","isArray","some","v","arr","sort","queryArgs","firstOnly","databases","Map","fields","field","i","order","size","index","indexKeyFields","keyFields","sortOrder","comparator","DbComparator","EQ","String","nodeComparator","a","b","resolvedAFields","resolvedBFields","direction","valueA","valueB","compareByKeySuffix","prefixLength","aSuffix","key","bSuffix"],"mappings":";;;;;;AAOA;;AACA;;AASA;;AAMA;;AAKA;;AACA;;AACA;;AAsBO,eAAeA,UAAf,CAA0BC,IAA1B,EAAwE;AAC7E;AACA,QAAMC,OAAO,GAAGC,kBAAkB,CAACF,IAAD,CAAlC,CAF6E,CAI7E;;AACA,QAAMG,MAAM,GAAGC,aAAa,CAACH,OAAD,CAA5B;;AACA,MAAIE,MAAJ,EAAY;AACV,UAAME,IAAI,GAAGL,IAAI,CAACM,SAAL,CAAeC,OAAf,CAAuBJ,MAAvB,CAAb;AACA,WAAO;AACLK,MAAAA,OAAO,EAAE,IAAIC,wBAAJ,CAAmBJ,IAAI,GAAG,CAACA,IAAD,CAAH,GAAY,EAAnC,CADJ;AAELK,MAAAA,UAAU,EAAE,YAA8BL,IAAI,GAAG,CAAH,GAAO;AAFhD,KAAP;AAID;;AAED,QAAMK,UAAU,GAAG,YACjBC,YAAY,CAAC,EAAE,GAAGV,OAAL;AAAcW,IAAAA,KAAK,EAAEC,SAArB;AAAgCC,IAAAA,IAAI,EAAE;AAAtC,GAAD,CADd;;AAGA,MAAIC,WAAW,CAACd,OAAD,CAAf,EAA0B;AACxB,UAAMe,OAAO,CAACC,GAAR,CACJhB,OAAO,CAACiB,aAAR,CAAsBC,GAAtB,CAA0BC,QAAQ,IAChC,8BAAYnB,OAAZ,EAAqBmB,QAArB,EAA+BnB,OAAO,CAACoB,oBAAvC,CADF,CADI,CAAN;AAKA,WAAO;AAAEb,MAAAA,OAAO,EAAEc,gBAAgB,CAACrB,OAAD,CAA3B;AAAsCS,MAAAA;AAAtC,KAAP;AACD;;AACD,SAAO;AAAEF,IAAAA,OAAO,EAAEe,oBAAoB,CAACtB,OAAD,CAA/B;AAA0CS,IAAAA;AAA1C,GAAP;AACD;;AAED,SAASY,gBAAT,CAA0BrB,OAA1B,EAA+E;AAC7E,QAAM;AAAEoB,IAAAA,oBAAF;AAAwBG,IAAAA;AAAxB,MAAuCvB,OAA7C;AAEA,QAAMwB,aAAa,GACjBxB,OAAO,CAACiB,aAAR,CAAsBQ,MAAtB,KAAiC,CAAjC,GACIzB,OADJ,GAEI,EACE,GAAGA,OADL;AAEEa,IAAAA,IAAI,EAAE,CAFR;AAGEF,IAAAA,KAAK,EACH,OAAOX,OAAO,CAACW,KAAf,KAA0B,WAA1B,GACIC,SADJ,GAEIZ,OAAO,CAACa,IAAR,GAAeb,OAAO,CAACW;AAN/B,GAHN;AAYA,MAAIe,MAAM,GAAG,IAAIlB,wBAAJ,CAAgC,EAAhC,CAAb;AACA,MAAImB,YAAY,GAAGH,aAAa,CAACX,IAAjC;;AACA,OAAK,MAAMM,QAAX,IAAuBnB,OAAO,CAACiB,aAA/B,EAA8C;AAC5C,UAAMW,aAAa,GAAG,mCACpB5B,OADoB,EAEpBmB,QAFoB,EAGpBC,oBAHoB,CAAtB;;AAKA,QAAI,CAACS,YAAY,CAAC7B,OAAD,CAAjB,EAA4B;AAC1B,YAAM;AAAE8B,QAAAA,KAAF;AAASC,QAAAA;AAAT,UAAsBC,WAAW,CAACR,aAAD,EAAgBI,aAAhB,CAAvC;AACAF,MAAAA,MAAM,GAAGA,MAAM,CAACO,MAAP,CAAcH,KAAd,CAAT;AACAH,MAAAA,YAAY,GAAGI,QAAf;AACA;AACD;;AACD,QAAIG,qBAAqB,CAACN,aAAD,EAAgBL,UAAhB,CAAzB,EAAsD;AACpD,YAAM;AAAEO,QAAAA,KAAF;AAASC,QAAAA;AAAT,UAAsBC,WAAW,CAACR,aAAD,EAAgBI,aAAhB,CAAvC,CADoD,CAEpD;;AACAF,MAAAA,MAAM,GAAGA,MAAM,CAACS,WAAP,CAAmBL,KAAnB,EAA0BM,wBAAwB,CAACb,UAAD,CAAlD,CAAT;AACAI,MAAAA,YAAY,GAAGI,QAAf;AACA;AACD,KAlB2C,CAmB5C;;;AACA,UAAMM,SAAS,GAAG,EAAE,GAAGrC,OAAL;AAAca,MAAAA,IAAI,EAAE,CAApB;AAAuBF,MAAAA,KAAK,EAAEC;AAA9B,KAAlB;AACA,UAAM;AAAEkB,MAAAA,KAAF;AAASC,MAAAA;AAAT,QAAsBC,WAAW,CAACK,SAAD,EAAYT,aAAZ,CAAvC;AACA,UAAMU,WAAW,GAAGC,iBAAiB,CAACvC,OAAD,EAAU8B,KAAV,CAArC;AACAH,IAAAA,YAAY,GAAGI,QAAf;AAEAL,IAAAA,MAAM,GAAGA,MAAM,CAACS,WAAP,CACPG,WADO,EAEPF,wBAAwB,CAACb,UAAD,CAFjB,CAAT;AAID;;AACD,QAAM;AAAEZ,IAAAA,KAAF;AAASE,IAAAA,IAAI,GAAG;AAAhB,MAAsBb,OAA5B;AACA,QAAMwC,UAAU,GAAG3B,IAAI,GAAGc,YAA1B;;AAEA,MAAIhB,KAAK,IAAI6B,UAAb,EAAyB;AACvBd,IAAAA,MAAM,GAAGA,MAAM,CAACe,KAAP,CAAaD,UAAb,EAAyB7B,KAAK,GAAG6B,UAAU,GAAG7B,KAAhB,GAAwBC,SAAtD,CAAT;AACD;;AACD,SAAOc,MAAP;AACD;;AAED,SAAShB,YAAT,CAAsBV,OAAtB,EAAsD;AACpD,MAAI,OAAOA,OAAO,CAACS,UAAf,KAA+B,WAAnC,EAA+C;AAC7CT,IAAAA,OAAO,CAACS,UAAR,GAAqBiC,QAAQ,CAAC1C,OAAD,CAA7B;AACD;;AACD,SAAOA,OAAO,CAACS,UAAf;AACD;;AAED,SAASiC,QAAT,CAAkB1C,OAAlB,EAAkD;AAChD,MAAI2C,KAAK,GAAG,CAAZ;;AAEA,MAAI,CAACC,cAAc,CAAC5C,OAAD,CAAnB,EAA8B;AAC5B,SAAK,MAAMmB,QAAX,IAAuBnB,OAAO,CAACiB,aAA/B,EAA8C;AAC5C0B,MAAAA,KAAK,IAAI3C,OAAO,CAACK,SAAR,CAAkBwC,UAAlB,CAA6B1B,QAA7B,CAAT;AACD;;AACD,WAAOwB,KAAP;AACD;;AAED,MAAI,CAAC7B,WAAW,CAACd,OAAD,CAAhB,EAA2B;AACzB,SAAK,MAAMmB,QAAX,IAAuBnB,OAAO,CAACiB,aAA/B,EAA8C;AAC5C,YAAMa,KAAK,GAAGgB,iBAAiB,CAC7B9C,OAD6B,EAE7B,IAAIQ,wBAAJ,CAAmBR,OAAO,CAACK,SAAR,CAAkB0C,kBAAlB,CAAqC5B,QAArC,CAAnB,CAF6B,CAA/B;;AAIA,WAAK,MAAM6B,CAAX,IAAgBlB,KAAhB,EAAuBa,KAAK;AAC7B;;AACD,WAAOA,KAAP;AACD;;AAED,OAAK,MAAMxB,QAAX,IAAuBnB,OAAO,CAACiB,aAA/B,EAA8C;AAC5C,UAAMW,aAAa,GAAG,mCACpB5B,OADoB,EAEpBmB,QAFoB,EAGpBnB,OAAO,CAACoB,oBAHY,CAAtB;;AAKA,QAAI;AACFuB,MAAAA,KAAK,IAAI,2CAAoB,EAAE,GAAG3C,OAAL;AAAc4B,QAAAA;AAAd,OAApB,CAAT;AACD,KAFD,CAEE,OAAOqB,CAAP,EAAU;AACV;AACA,WAAK,MAAMD,CAAX,IAAgBhB,WAAW,CAAChC,OAAD,EAAU4B,aAAV,CAAX,CAAoCE,KAApD,EAA2Da,KAAK;AACjE;AACF;;AACD,SAAOA,KAAP;AACD;;AAED,SAASrB,oBAAT,CACEtB,OADF,EAE+B;AAC7B;AAEA,QAAM;AAAEK,IAAAA,SAAF;AAAaY,IAAAA;AAAb,MAA+BjB,OAArC;AAEA,MAAI0B,MAAM,GAAG,IAAIlB,wBAAJ,CAAgC,EAAhC,CAAb;;AACA,OAAK,MAAMW,QAAX,IAAuBF,aAAvB,EAAsC;AACpC,QAAIa,KAAK,GAAG,IAAItB,wBAAJ,CAAmBH,SAAS,CAAC0C,kBAAV,CAA6B5B,QAA7B,CAAnB,CAAZ;AACAW,IAAAA,KAAK,GAAGgB,iBAAiB,CAAC9C,OAAD,EAAU8B,KAAV,CAAzB;;AAEA,QAAID,YAAY,CAAC7B,OAAD,CAAhB,EAA2B;AACzB8B,MAAAA,KAAK,GAAGS,iBAAiB,CAACvC,OAAD,EAAU8B,KAAV,CAAzB;AACAJ,MAAAA,MAAM,GAAGA,MAAM,CAACS,WAAP,CACPL,KADO,EAEPM,wBAAwB,CAACpC,OAAO,CAACuB,UAAT,CAFjB,CAAT;AAID,KAND,MAMO;AACLG,MAAAA,MAAM,GAAGA,MAAM,CAACO,MAAP,CAAcH,KAAd,CAAT;AACD;AACF;;AACD,QAAM;AAAEnB,IAAAA,KAAF;AAASE,IAAAA,IAAI,GAAG;AAAhB,MAAsBb,OAA5B;;AAEA,MAAIW,KAAK,IAAIE,IAAb,EAAmB;AACjBa,IAAAA,MAAM,GAAGA,MAAM,CAACe,KAAP,CAAa5B,IAAb,EAAmBF,KAAK,GAAGE,IAAI,GAAGF,KAAV,GAAkBC,SAA1C,CAAT;AACD;;AACD,SAAOc,MAAP;AACD;;AAED,SAASM,WAAT,CACEhC,OADF,EAEE4B,aAFF,EAG4D;AAC1D,QAAM;AAAErB,IAAAA,OAAF;AAAW2C,IAAAA,WAAX;AAAwBnB,IAAAA;AAAxB,MAAqC,wCAAiB,EAC1D,GAAG/B,OADuD;AAE1D4B,IAAAA,aAF0D;AAG1DuB,IAAAA,OAAO,EAAEC,KAAK,CAACC,IAAN,CAAWrD,OAAO,CAACuB,UAAR,CAAmB+B,MAAnB,EAAX,EAAwC,CAAxC,MAA+C,CAAC;AAHC,GAAjB,CAA3C;AAKA,QAAMxB,KAAK,GAAGvB,OAAO,CAClBW,GADW,CACP,CAAC;AAAEqC,IAAAA;AAAF,GAAD,KAAevD,OAAO,CAACK,SAAR,CAAkBC,OAAlB,CAA0BiD,KAA1B,CADR,EAEXC,MAFW,CAEJC,OAFI,CAAd;AAIA,SAAO;AACL3B,IAAAA,KAAK,EAAEgB,iBAAiB,CACtB9C,OADsB,EAEtB8B,KAFsB,EAGtBoB,WAHsB,CADnB;AAMLnB,IAAAA;AANK,GAAP;AAQD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASe,iBAAT,CACE9C,OADF,EAEE0D,kBAFF,EAGER,WAAyB,GAAG,IAAIS,GAAJ,EAH9B,EAI+B;AAC7B,QAAM;AAAEC,IAAAA;AAAF,MAAgB5D,OAAtB;;AACA,MAAI6D,eAAe,CAACD,SAAD,EAAYV,WAAZ,CAAnB,EAA6C;AAC3C,WAAOQ,kBAAP;AACD,GAJ4B,CAK7B;;;AACA,QAAMI,aAAa,GAAGC,aAAMC,QAAN,GAAiBC,kBAAvC;;AAEA,QAAMC,cAAmD,GAAGN,SAAS,CAClEJ,MADyD,CAClDW,CAAC,IAAI,CAACjB,WAAW,CAACkB,GAAZ,CAAgBD,CAAhB,CAD4C,EAEzDjD,GAFyD,CAErDiD,CAAC,IAAI,CAAC,iCAAqBA,CAArB,CAAD,EAA0B,+BAAmBA,CAAnB,CAA1B,CAFgD,CAA5D;AAIA,SAAOT,kBAAkB,CAACF,MAAnB,CAA0BpD,IAAI,IAAI;AAAA;;AACvC,UAAMiE,cAAc,GAAGP,aAAH,aAAGA,aAAH,6CAAGA,aAAa,CAAEQ,GAAf,CAAmBlE,IAAI,CAACmE,QAAL,CAAcC,IAAjC,CAAH,uDAAG,mBAAwCF,GAAxC,CAA4ClE,IAAI,CAACqE,EAAjD,CAAvB;;AAEA,SAAK,MAAM,CAACC,WAAD,EAAclB,MAAd,CAAX,IAAoCU,cAApC,EAAoD;AAClD,YAAMS,GAAG,GAAG,+BAAkBD,WAAlB,EAA+BtE,IAA/B,EAAqCiE,cAArC,CAAZ;AACA,YAAMd,KAAK,GAAGH,KAAK,CAACwB,OAAN,CAAcD,GAAd,IAAqBA,GAArB,GAA2B,CAACA,GAAD,CAAzC;;AACA,UAAIpB,KAAK,CAACsB,IAAN,CAAWC,CAAC,IAAI,CAAC,2BAActB,MAAd,EAAsBsB,CAAtB,CAAjB,CAAJ,EAAgD;AAC9C;AACA,eAAO,KAAP;AACD;AACF;;AACD,WAAO,IAAP;AACD,GAZM,CAAP;AAaD;;AAED,SAASvC,iBAAT,CACEvC,OADF,EAEE8B,KAFF,EAG+B;AAC7B;AACA;AACA,SAAO,IAAItB,wBAAJ,CAAmB,MAAM;AAC9B,UAAMuE,GAAG,GAAG3B,KAAK,CAACC,IAAN,CAAWvB,KAAX,CAAZ;AACAiD,IAAAA,GAAG,CAACC,IAAJ,CAAS5C,wBAAwB,CAACpC,OAAO,CAACuB,UAAT,CAAjC;AACA,WAAOwD,GAAP;AACD,GAJM,CAAP;AAKD;;AAED,SAAS9E,kBAAT,CAA4BF,IAA5B,EAAkE;AAChE,QAAM;AAAEkF,IAAAA,SAAS,EAAE;AAAEzB,MAAAA,MAAF;AAAUwB,MAAAA,IAAV;AAAgBrE,MAAAA,KAAhB;AAAuBE,MAAAA,IAAI,GAAG;AAA9B,QAAoC,EAAjD;AAAqDqE,IAAAA;AAArD,MAAmEnF,IAAzE;AAEA,SAAO;AACLM,IAAAA,SAAS,EAAEN,IAAI,CAACM,SADX;AAEL8E,IAAAA,SAAS,EAAEpF,IAAI,CAACoF,SAFX;AAGLlE,IAAAA,aAAa,EAAElB,IAAI,CAACkB,aAHf;AAIL2C,IAAAA,SAAS,EAAE,sCAA0B,6BAAiBJ,MAAjB,CAA1B,CAJN;AAKLjC,IAAAA,UAAU,EAAE,IAAI6D,GAAJ,CACVJ,IADU,aACVA,IADU,uBACVA,IAAI,CAAEK,MAAN,CAAanE,GAAb,CAAiB,CAACoE,KAAD,EAAQC,CAAR,KAAc,CAACD,KAAD,EAAQ,oBAAON,IAAP,aAAOA,IAAP,uBAAOA,IAAI,CAAEQ,KAAN,CAAYD,CAAZ,CAAP,IAAyB,CAAC,CAA1B,GAA8B,CAAtC,CAA/B,CADU,CALP;AAQLnE,IAAAA,oBAAoB,EAAE,IAAIgE,GAAJ,CAAQ,gCAAa;AAAE5B,MAAAA,MAAF;AAAUwB,MAAAA;AAAV,KAAb,CAAR,CARjB;AASLrE,IAAAA,KAAK,EAAEuE,SAAS,GAAG,CAAH,GAAOvE,KATlB;AAULE,IAAAA;AAVK,GAAP;AAYD;;AAED,SAASC,WAAT,CAAqBd,OAArB,EAAsD;AACpD,SAAOA,OAAO,CAACoB,oBAAR,CAA6BqE,IAA7B,GAAoC,CAA3C;AACD;;AAED,SAAS7C,cAAT,CAAwB5C,OAAxB,EAAyD;AACvD,SAAOA,OAAO,CAAC4D,SAAR,CAAkBnC,MAAlB,GAA2B,CAAlC;AACD;;AAED,SAASI,YAAT,CAAsB7B,OAAtB,EAAuD;AACrD,SAAOA,OAAO,CAACuB,UAAR,CAAmBkE,IAAnB,GAA0B,CAAjC;AACD;AAED;AACA;AACA;AACA;;;AACA,SAASvD,qBAAT,CACEwD,KADF,EAEEnE,UAFF,EAGW;AACT,QAAMoE,cAAc,GAAG,IAAIP,GAAJ,CAAQM,KAAK,CAACE,SAAd,CAAvB;;AACA,OAAK,MAAM,CAACN,KAAD,EAAQO,SAAR,CAAX,IAAiCtE,UAAjC,EAA6C;AAC3C,QAAIoE,cAAc,CAACrB,GAAf,CAAmBgB,KAAnB,MAA8BO,SAAlC,EAA6C;AAC3C,aAAO,KAAP;AACD;AACF;;AACD,SAAO,IAAP;AACD;;AAED,SAAShC,eAAT,CACED,SADF,EAEEV,WAFF,EAGW;AACT,SAAOU,SAAS,CAACnC,MAAV,KAAqByB,WAAW,CAACuC,IAAxC;AACD;;AAED,SAAStF,aAAT,CAAuBH,OAAvB,EAAmE;AACjE,OAAK,MAAMmE,CAAX,IAAgBnE,OAAO,CAAC4D,SAAxB,EAAmC;AACjC,UAAMJ,MAAM,GAAG,+BAAmBW,CAAnB,CAAf;;AACA,QACEX,MAAM,CAACsC,UAAP,KAAsBC,oBAAaC,EAAnC,IACA,iCAAqB7B,CAArB,MAA6B,IAF/B,EAGE;AACA,aAAO8B,MAAM,CAACzC,MAAM,CAACD,KAAR,CAAb;AACD;AACF;;AACD,SAAO3C,SAAP;AACD;;AAED,SAASwB,wBAAT,CAAkCb,UAAlC,EAA4E;AAC1E,QAAM0C,kBAAkB,GAAGF,aAAMC,QAAN,GAAiBC,kBAA5C;;AAEA,SAAO,SAASiC,cAAT,CAAwBC,CAAxB,EAAwCC,CAAxC,EAAgE;AAAA;;AACrE,UAAMC,eAAe,GAAGpC,kBAAH,aAAGA,kBAAH,gDAAGA,kBAAkB,CAAEK,GAApB,CAAwB6B,CAAC,CAAC5B,QAAF,CAAWC,IAAnC,CAAH,0DAAG,sBAA0CF,GAA1C,CAA8C6B,CAAC,CAAC1B,EAAhD,CAAxB;AACA,UAAM6B,eAAe,GAAGrC,kBAAH,aAAGA,kBAAH,iDAAGA,kBAAkB,CAAEK,GAApB,CAAwB8B,CAAC,CAAC7B,QAAF,CAAWC,IAAnC,CAAH,2DAAG,uBAA0CF,GAA1C,CAA8C8B,CAAC,CAAC3B,EAAhD,CAAxB;;AAEA,SAAK,MAAM,CAACa,KAAD,EAAQiB,SAAR,CAAX,IAAiChF,UAAjC,EAA6C;AAC3C,YAAMiF,MAAW,GAAG,+BAAkBlB,KAAlB,EAAyBa,CAAzB,EAA4BE,eAA5B,CAApB;AACA,YAAMI,MAAW,GAAG,+BAAkBnB,KAAlB,EAAyBc,CAAzB,EAA4BE,eAA5B,CAApB;;AAEA,UAAIE,MAAM,GAAGC,MAAb,EAAqB;AACnB,eAAOF,SAAS,KAAK,CAAd,GAAkB,CAAlB,GAAsB,CAAC,CAA9B;AACD,OAFD,MAEO,IAAIC,MAAM,GAAGC,MAAb,EAAqB;AAC1B,eAAOF,SAAS,KAAK,CAAd,GAAkB,CAAC,CAAnB,GAAuB,CAA9B;AACD;AACF;;AACD,WAAO,CAAP;AACD,GAfD;AAgBD;;AAEM,SAASG,kBAAT,CAA4BC,YAA5B,EAAkD;AACvD,SAAO,UAAUR,CAAV,EAA0BC,CAA1B,EAAkD;AACvD,UAAMQ,OAAO,GAAGT,CAAC,CAACU,GAAF,CAAMpE,KAAN,CAAYkE,YAAZ,CAAhB;AACA,UAAMG,OAAO,GAAGV,CAAC,CAACS,GAAF,CAAMpE,KAAN,CAAYkE,YAAZ,CAAhB,CAFuD,CAGvD;;AACA,WAAO,wBAAWC,OAAX,EAAoBE,OAApB,CAAP;AACD,GALD;AAMD","sourcesContent":["import {\n IDataStore,\n ILmdbDatabases,\n IQueryResult,\n IRunQueryArgs,\n} from \"../../types\"\nimport { IGatsbyNode } from \"../../../redux/types\"\nimport { GatsbyIterable } from \"../../common/iterable\"\nimport {\n createDbQueriesFromObject,\n DbComparator,\n DbQuery,\n dbQueryToDottedField,\n getFilterStatement,\n IDbFilterStatement,\n prepareQueryArgs,\n} from \"../../common/query\"\nimport {\n createIndex,\n getIndexMetadata,\n IIndexMetadata,\n IndexFields,\n} from \"./create-index\"\nimport {\n countUsingIndexOnly,\n filterUsingIndex,\n IIndexEntry,\n} from \"./filter-using-index\"\nimport { store } from \"../../../redux\"\nimport { isDesc, resolveFieldValue, matchesFilter, compareKey } from \"./common\"\nimport { suggestIndex } from \"./suggest-index\"\n\ninterface IDoRunQueryArgs extends IRunQueryArgs {\n databases: ILmdbDatabases\n datastore: IDataStore\n}\n\ntype SortFields = Map<string, number>\n\ninterface IQueryContext {\n datastore: IDataStore\n databases: ILmdbDatabases\n dbQueries: Array<DbQuery>\n sortFields: SortFields\n nodeTypeNames: Array<string>\n suggestedIndexFields: IndexFields\n indexMetadata?: IIndexMetadata\n limit?: number\n skip: number\n totalCount?: number\n}\n\nexport async function doRunQuery(args: IDoRunQueryArgs): Promise<IQueryResult> {\n // Note: Keeping doRunQuery method the only async method in chain for perf\n const context = createQueryContext(args)\n\n // Fast-path: filter by node id\n const nodeId = getFilterById(context)\n if (nodeId) {\n const node = args.datastore.getNode(nodeId)\n return {\n entries: new GatsbyIterable(node ? [node] : []),\n totalCount: async (): Promise<number> => (node ? 1 : 0),\n }\n }\n\n const totalCount = async (): Promise<number> =>\n runCountOnce({ ...context, limit: undefined, skip: 0 })\n\n if (canUseIndex(context)) {\n await Promise.all(\n context.nodeTypeNames.map(typeName =>\n createIndex(context, typeName, context.suggestedIndexFields)\n )\n )\n return { entries: performIndexScan(context), totalCount }\n }\n return { entries: performFullTableScan(context), totalCount }\n}\n\nfunction performIndexScan(context: IQueryContext): GatsbyIterable<IGatsbyNode> {\n const { suggestedIndexFields, sortFields } = context\n\n const filterContext =\n context.nodeTypeNames.length === 1\n ? context\n : {\n ...context,\n skip: 0,\n limit:\n typeof context.limit === `undefined`\n ? undefined\n : context.skip + context.limit,\n }\n\n let result = new GatsbyIterable<IGatsbyNode>([])\n let resultOffset = filterContext.skip\n for (const typeName of context.nodeTypeNames) {\n const indexMetadata = getIndexMetadata(\n context,\n typeName,\n suggestedIndexFields\n )\n if (!needsSorting(context)) {\n const { nodes, usedSkip } = filterNodes(filterContext, indexMetadata)\n result = result.concat(nodes)\n resultOffset = usedSkip\n continue\n }\n if (canUseIndexForSorting(indexMetadata, sortFields)) {\n const { nodes, usedSkip } = filterNodes(filterContext, indexMetadata)\n // Interleave nodes of different types (not expensive for already sorted chunks)\n result = result.mergeSorted(nodes, createNodeSortComparator(sortFields))\n resultOffset = usedSkip\n continue\n }\n // The sad part - unlimited filter + in-memory sort\n const unlimited = { ...context, skip: 0, limit: undefined }\n const { nodes, usedSkip } = filterNodes(unlimited, indexMetadata)\n const sortedNodes = sortNodesInMemory(context, nodes)\n resultOffset = usedSkip\n\n result = result.mergeSorted(\n sortedNodes,\n createNodeSortComparator(sortFields)\n )\n }\n const { limit, skip = 0 } = context\n const actualSkip = skip - resultOffset\n\n if (limit || actualSkip) {\n result = result.slice(actualSkip, limit ? actualSkip + limit : undefined)\n }\n return result\n}\n\nfunction runCountOnce(context: IQueryContext): number {\n if (typeof context.totalCount === `undefined`) {\n context.totalCount = runCount(context)\n }\n return context.totalCount\n}\n\nfunction runCount(context: IQueryContext): number {\n let count = 0\n\n if (!needsFiltering(context)) {\n for (const typeName of context.nodeTypeNames) {\n count += context.datastore.countNodes(typeName)\n }\n return count\n }\n\n if (!canUseIndex(context)) {\n for (const typeName of context.nodeTypeNames) {\n const nodes = completeFiltering(\n context,\n new GatsbyIterable(context.datastore.iterateNodesByType(typeName))\n )\n for (const _ of nodes) count++\n }\n return count\n }\n\n for (const typeName of context.nodeTypeNames) {\n const indexMetadata = getIndexMetadata(\n context,\n typeName,\n context.suggestedIndexFields\n )\n try {\n count += countUsingIndexOnly({ ...context, indexMetadata })\n } catch (e) {\n // We cannot reliably count using index - fallback to full iteration :/\n for (const _ of filterNodes(context, indexMetadata).nodes) count++\n }\n }\n return count\n}\n\nfunction performFullTableScan(\n context: IQueryContext\n): GatsbyIterable<IGatsbyNode> {\n // console.warn(`Fallback to full table scan :/`)\n\n const { datastore, nodeTypeNames } = context\n\n let result = new GatsbyIterable<IGatsbyNode>([])\n for (const typeName of nodeTypeNames) {\n let nodes = new GatsbyIterable(datastore.iterateNodesByType(typeName))\n nodes = completeFiltering(context, nodes)\n\n if (needsSorting(context)) {\n nodes = sortNodesInMemory(context, nodes)\n result = result.mergeSorted(\n nodes,\n createNodeSortComparator(context.sortFields)\n )\n } else {\n result = result.concat(nodes)\n }\n }\n const { limit, skip = 0 } = context\n\n if (limit || skip) {\n result = result.slice(skip, limit ? skip + limit : undefined)\n }\n return result\n}\n\nfunction filterNodes(\n context: IQueryContext,\n indexMetadata: IIndexMetadata\n): { nodes: GatsbyIterable<IGatsbyNode>; usedSkip: number } {\n const { entries, usedQueries, usedSkip } = filterUsingIndex({\n ...context,\n indexMetadata,\n reverse: Array.from(context.sortFields.values())[0] === -1,\n })\n const nodes = entries\n .map(({ value }) => context.datastore.getNode(value))\n .filter(Boolean)\n\n return {\n nodes: completeFiltering(\n context,\n nodes as GatsbyIterable<IGatsbyNode>,\n usedQueries\n ),\n usedSkip,\n }\n}\n\n/**\n * Takes intermediate result and applies any remaining filterQueries.\n *\n * If result is already fully filtered - simply returns.\n */\nfunction completeFiltering(\n context: IQueryContext,\n intermediateResult: GatsbyIterable<IGatsbyNode>,\n usedQueries: Set<DbQuery> = new Set()\n): GatsbyIterable<IGatsbyNode> {\n const { dbQueries } = context\n if (isFullyFiltered(dbQueries, usedQueries)) {\n return intermediateResult\n }\n // Apply remaining filter operations directly (last resort: slow)\n const resolvedNodes = store.getState().resolvedNodesCache\n\n const filtersToApply: Array<[string, IDbFilterStatement]> = dbQueries\n .filter(q => !usedQueries.has(q))\n .map(q => [dbQueryToDottedField(q), getFilterStatement(q)])\n\n return intermediateResult.filter(node => {\n const resolvedFields = resolvedNodes?.get(node.internal.type)?.get(node.id)\n\n for (const [dottedField, filter] of filtersToApply) {\n const tmp = resolveFieldValue(dottedField, node, resolvedFields)\n const value = Array.isArray(tmp) ? tmp : [tmp]\n if (value.some(v => !matchesFilter(filter, v))) {\n // Mimic AND semantics\n return false\n }\n }\n return true\n })\n}\n\nfunction sortNodesInMemory(\n context: IQueryContext,\n nodes: GatsbyIterable<IGatsbyNode>\n): GatsbyIterable<IGatsbyNode> {\n // TODO: Sort using index data whenever possible (maybe store data needed for sorting in index values)\n // TODO: Nodes can be partially sorted by index prefix - we can (and should) exploit this\n return new GatsbyIterable(() => {\n const arr = Array.from(nodes)\n arr.sort(createNodeSortComparator(context.sortFields))\n return arr\n })\n}\n\nfunction createQueryContext(args: IDoRunQueryArgs): IQueryContext {\n const { queryArgs: { filter, sort, limit, skip = 0 } = {}, firstOnly } = args\n\n return {\n datastore: args.datastore,\n databases: args.databases,\n nodeTypeNames: args.nodeTypeNames,\n dbQueries: createDbQueriesFromObject(prepareQueryArgs(filter)),\n sortFields: new Map<string, number>(\n sort?.fields.map((field, i) => [field, isDesc(sort?.order[i]) ? -1 : 1])\n ),\n suggestedIndexFields: new Map(suggestIndex({ filter, sort })),\n limit: firstOnly ? 1 : limit,\n skip,\n }\n}\n\nfunction canUseIndex(context: IQueryContext): boolean {\n return context.suggestedIndexFields.size > 0\n}\n\nfunction needsFiltering(context: IQueryContext): boolean {\n return context.dbQueries.length > 0\n}\n\nfunction needsSorting(context: IQueryContext): boolean {\n return context.sortFields.size > 0\n}\n\n/**\n * Based on assumption that if all sort fields exist in index\n * then any result received from this index is fully sorted\n */\nfunction canUseIndexForSorting(\n index: IIndexMetadata,\n sortFields: SortFields\n): boolean {\n const indexKeyFields = new Map(index.keyFields)\n for (const [field, sortOrder] of sortFields) {\n if (indexKeyFields.get(field) !== sortOrder) {\n return false\n }\n }\n return true\n}\n\nfunction isFullyFiltered(\n dbQueries: Array<DbQuery>,\n usedQueries: Set<DbQuery>\n): boolean {\n return dbQueries.length === usedQueries.size\n}\n\nfunction getFilterById(context: IQueryContext): string | undefined {\n for (const q of context.dbQueries) {\n const filter = getFilterStatement(q)\n if (\n filter.comparator === DbComparator.EQ &&\n dbQueryToDottedField(q) === `id`\n ) {\n return String(filter.value)\n }\n }\n return undefined\n}\n\nfunction createNodeSortComparator(sortFields: SortFields): (a, b) => number {\n const resolvedNodesCache = store.getState().resolvedNodesCache\n\n return function nodeComparator(a: IGatsbyNode, b: IGatsbyNode): number {\n const resolvedAFields = resolvedNodesCache?.get(a.internal.type)?.get(a.id)\n const resolvedBFields = resolvedNodesCache?.get(b.internal.type)?.get(b.id)\n\n for (const [field, direction] of sortFields) {\n const valueA: any = resolveFieldValue(field, a, resolvedAFields)\n const valueB: any = resolveFieldValue(field, b, resolvedBFields)\n\n if (valueA > valueB) {\n return direction === 1 ? 1 : -1\n } else if (valueA < valueB) {\n return direction === 1 ? -1 : 1\n }\n }\n return 0\n }\n}\n\nexport function compareByKeySuffix(prefixLength: number) {\n return function (a: IIndexEntry, b: IIndexEntry): number {\n const aSuffix = a.key.slice(prefixLength)\n const bSuffix = b.key.slice(prefixLength)\n // @ts-ignore\n return compareKey(aSuffix, bSuffix)\n }\n}\n"],"file":"run-query.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/datastore/lmdb/query/run-query.ts"],"names":["doRunQuery","args","context","createQueryContext","totalCount","runCountOnce","limit","undefined","skip","canUseIndex","Promise","all","nodeTypeNames","map","typeName","suggestedIndexFields","entries","performIndexScan","performFullTableScan","sortFields","filterContext","length","result","GatsbyIterable","resultOffset","indexMetadata","needsSorting","nodes","usedSkip","filterNodes","concat","canUseIndexForSorting","mergeSorted","createNodeSortComparator","unlimited","sortedNodes","sortNodesInMemory","actualSkip","slice","runCount","count","needsFiltering","datastore","countNodes","completeFiltering","iterateNodesByType","_","e","usedQueries","reverse","Array","from","values","value","getNode","filter","Boolean","intermediateResult","Set","dbQueries","isFullyFiltered","resolvedNodes","store","getState","resolvedNodesCache","filtersToApply","q","has","node","resolvedFields","get","internal","type","id","dottedField","tmp","isArray","some","v","arr","sort","queryArgs","firstOnly","databases","Map","fields","field","i","order","size","index","indexKeyFields","keyFields","sortOrder","nodeComparator","a","b","resolvedAFields","resolvedBFields","direction","valueA","valueB","compareByKeySuffix","prefixLength","aSuffix","key","bSuffix"],"mappings":"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","sourcesContent":["import {\n IDataStore,\n ILmdbDatabases,\n IQueryResult,\n IRunQueryArgs,\n} from \"../../types\"\nimport { IGatsbyNode } from \"../../../redux/types\"\nimport { GatsbyIterable } from \"../../common/iterable\"\nimport {\n createDbQueriesFromObject,\n DbQuery,\n dbQueryToDottedField,\n getFilterStatement,\n IDbFilterStatement,\n prepareQueryArgs,\n} from \"../../common/query\"\nimport {\n createIndex,\n getIndexMetadata,\n IIndexMetadata,\n IndexFields,\n} from \"./create-index\"\nimport {\n countUsingIndexOnly,\n filterUsingIndex,\n IIndexEntry,\n} from \"./filter-using-index\"\nimport { store } from \"../../../redux\"\nimport { isDesc, resolveFieldValue, matchesFilter, compareKey } from \"./common\"\nimport { suggestIndex } from \"./suggest-index\"\n\ninterface IDoRunQueryArgs extends IRunQueryArgs {\n databases: ILmdbDatabases\n datastore: IDataStore\n}\n\ntype SortFields = Map<string, number>\n\ninterface IQueryContext {\n datastore: IDataStore\n databases: ILmdbDatabases\n dbQueries: Array<DbQuery>\n sortFields: SortFields\n nodeTypeNames: Array<string>\n suggestedIndexFields: IndexFields\n indexMetadata?: IIndexMetadata\n limit?: number\n skip: number\n totalCount?: number\n}\n\nexport async function doRunQuery(args: IDoRunQueryArgs): Promise<IQueryResult> {\n // Note: Keeping doRunQuery method the only async method in chain for perf\n const context = createQueryContext(args)\n\n const totalCount = async (): Promise<number> =>\n runCountOnce({ ...context, limit: undefined, skip: 0 })\n\n if (canUseIndex(context)) {\n await Promise.all(\n context.nodeTypeNames.map(typeName =>\n createIndex(context, typeName, context.suggestedIndexFields)\n )\n )\n return { entries: performIndexScan(context), totalCount }\n }\n return { entries: performFullTableScan(context), totalCount }\n}\n\nfunction performIndexScan(context: IQueryContext): GatsbyIterable<IGatsbyNode> {\n const { suggestedIndexFields, sortFields } = context\n\n const filterContext =\n context.nodeTypeNames.length === 1\n ? context\n : {\n ...context,\n skip: 0,\n limit:\n typeof context.limit === `undefined`\n ? undefined\n : context.skip + context.limit,\n }\n\n let result = new GatsbyIterable<IGatsbyNode>([])\n let resultOffset = filterContext.skip\n for (const typeName of context.nodeTypeNames) {\n const indexMetadata = getIndexMetadata(\n context,\n typeName,\n suggestedIndexFields\n )\n if (!needsSorting(context)) {\n const { nodes, usedSkip } = filterNodes(filterContext, indexMetadata)\n result = result.concat(nodes)\n resultOffset = usedSkip\n continue\n }\n if (canUseIndexForSorting(indexMetadata, sortFields)) {\n const { nodes, usedSkip } = filterNodes(filterContext, indexMetadata)\n // Interleave nodes of different types (not expensive for already sorted chunks)\n result = result.mergeSorted(nodes, createNodeSortComparator(sortFields))\n resultOffset = usedSkip\n continue\n }\n // The sad part - unlimited filter + in-memory sort\n const unlimited = { ...context, skip: 0, limit: undefined }\n const { nodes, usedSkip } = filterNodes(unlimited, indexMetadata)\n const sortedNodes = sortNodesInMemory(context, nodes)\n resultOffset = usedSkip\n\n result = result.mergeSorted(\n sortedNodes,\n createNodeSortComparator(sortFields)\n )\n }\n const { limit, skip = 0 } = context\n const actualSkip = skip - resultOffset\n\n if (limit || actualSkip) {\n result = result.slice(actualSkip, limit ? actualSkip + limit : undefined)\n }\n return result\n}\n\nfunction runCountOnce(context: IQueryContext): number {\n if (typeof context.totalCount === `undefined`) {\n context.totalCount = runCount(context)\n }\n return context.totalCount\n}\n\nfunction runCount(context: IQueryContext): number {\n let count = 0\n\n if (!needsFiltering(context)) {\n for (const typeName of context.nodeTypeNames) {\n count += context.datastore.countNodes(typeName)\n }\n return count\n }\n\n if (!canUseIndex(context)) {\n for (const typeName of context.nodeTypeNames) {\n const nodes = completeFiltering(\n context,\n new GatsbyIterable(context.datastore.iterateNodesByType(typeName))\n )\n for (const _ of nodes) count++\n }\n return count\n }\n\n for (const typeName of context.nodeTypeNames) {\n const indexMetadata = getIndexMetadata(\n context,\n typeName,\n context.suggestedIndexFields\n )\n try {\n count += countUsingIndexOnly({ ...context, indexMetadata })\n } catch (e) {\n // We cannot reliably count using index - fallback to full iteration :/\n for (const _ of filterNodes(context, indexMetadata).nodes) count++\n }\n }\n return count\n}\n\nfunction performFullTableScan(\n context: IQueryContext\n): GatsbyIterable<IGatsbyNode> {\n // console.warn(`Fallback to full table scan :/`)\n\n const { datastore, nodeTypeNames } = context\n\n let result = new GatsbyIterable<IGatsbyNode>([])\n for (const typeName of nodeTypeNames) {\n let nodes = new GatsbyIterable(datastore.iterateNodesByType(typeName))\n nodes = completeFiltering(context, nodes)\n\n if (needsSorting(context)) {\n nodes = sortNodesInMemory(context, nodes)\n result = result.mergeSorted(\n nodes,\n createNodeSortComparator(context.sortFields)\n )\n } else {\n result = result.concat(nodes)\n }\n }\n const { limit, skip = 0 } = context\n\n if (limit || skip) {\n result = result.slice(skip, limit ? skip + limit : undefined)\n }\n return result\n}\n\nfunction filterNodes(\n context: IQueryContext,\n indexMetadata: IIndexMetadata\n): { nodes: GatsbyIterable<IGatsbyNode>; usedSkip: number } {\n const { entries, usedQueries, usedSkip } = filterUsingIndex({\n ...context,\n indexMetadata,\n reverse: Array.from(context.sortFields.values())[0] === -1,\n })\n const nodes = entries\n .map(({ value }) => context.datastore.getNode(value))\n .filter(Boolean)\n\n return {\n nodes: completeFiltering(\n context,\n nodes as GatsbyIterable<IGatsbyNode>,\n usedQueries\n ),\n usedSkip,\n }\n}\n\n/**\n * Takes intermediate result and applies any remaining filterQueries.\n *\n * If result is already fully filtered - simply returns.\n */\nfunction completeFiltering(\n context: IQueryContext,\n intermediateResult: GatsbyIterable<IGatsbyNode>,\n usedQueries: Set<DbQuery> = new Set()\n): GatsbyIterable<IGatsbyNode> {\n const { dbQueries } = context\n if (isFullyFiltered(dbQueries, usedQueries)) {\n return intermediateResult\n }\n // Apply remaining filter operations directly (last resort: slow)\n const resolvedNodes = store.getState().resolvedNodesCache\n\n const filtersToApply: Array<[string, IDbFilterStatement]> = dbQueries\n .filter(q => !usedQueries.has(q))\n .map(q => [dbQueryToDottedField(q), getFilterStatement(q)])\n\n return intermediateResult.filter(node => {\n const resolvedFields = resolvedNodes?.get(node.internal.type)?.get(node.id)\n\n for (const [dottedField, filter] of filtersToApply) {\n const tmp = resolveFieldValue(dottedField, node, resolvedFields)\n const value = Array.isArray(tmp) ? tmp : [tmp]\n if (value.some(v => !matchesFilter(filter, v))) {\n // Mimic AND semantics\n return false\n }\n }\n return true\n })\n}\n\nfunction sortNodesInMemory(\n context: IQueryContext,\n nodes: GatsbyIterable<IGatsbyNode>\n): GatsbyIterable<IGatsbyNode> {\n // TODO: Sort using index data whenever possible (maybe store data needed for sorting in index values)\n // TODO: Nodes can be partially sorted by index prefix - we can (and should) exploit this\n return new GatsbyIterable(() => {\n const arr = Array.from(nodes)\n arr.sort(createNodeSortComparator(context.sortFields))\n return arr\n })\n}\n\nfunction createQueryContext(args: IDoRunQueryArgs): IQueryContext {\n const { queryArgs: { filter, sort, limit, skip = 0 } = {}, firstOnly } = args\n\n return {\n datastore: args.datastore,\n databases: args.databases,\n nodeTypeNames: args.nodeTypeNames,\n dbQueries: createDbQueriesFromObject(prepareQueryArgs(filter)),\n sortFields: new Map<string, number>(\n sort?.fields.map((field, i) => [field, isDesc(sort?.order[i]) ? -1 : 1])\n ),\n suggestedIndexFields: new Map(suggestIndex({ filter, sort })),\n limit: firstOnly ? 1 : limit,\n skip,\n }\n}\n\nfunction canUseIndex(context: IQueryContext): boolean {\n return context.suggestedIndexFields.size > 0\n}\n\nfunction needsFiltering(context: IQueryContext): boolean {\n return context.dbQueries.length > 0\n}\n\nfunction needsSorting(context: IQueryContext): boolean {\n return context.sortFields.size > 0\n}\n\n/**\n * Based on assumption that if all sort fields exist in index\n * then any result received from this index is fully sorted\n */\nfunction canUseIndexForSorting(\n index: IIndexMetadata,\n sortFields: SortFields\n): boolean {\n const indexKeyFields = new Map(index.keyFields)\n for (const [field, sortOrder] of sortFields) {\n if (indexKeyFields.get(field) !== sortOrder) {\n return false\n }\n }\n return true\n}\n\nfunction isFullyFiltered(\n dbQueries: Array<DbQuery>,\n usedQueries: Set<DbQuery>\n): boolean {\n return dbQueries.length === usedQueries.size\n}\n\nfunction createNodeSortComparator(sortFields: SortFields): (a, b) => number {\n const resolvedNodesCache = store.getState().resolvedNodesCache\n\n return function nodeComparator(a: IGatsbyNode, b: IGatsbyNode): number {\n const resolvedAFields = resolvedNodesCache?.get(a.internal.type)?.get(a.id)\n const resolvedBFields = resolvedNodesCache?.get(b.internal.type)?.get(b.id)\n\n for (const [field, direction] of sortFields) {\n const valueA: any = resolveFieldValue(field, a, resolvedAFields)\n const valueB: any = resolveFieldValue(field, b, resolvedBFields)\n\n if (valueA > valueB) {\n return direction === 1 ? 1 : -1\n } else if (valueA < valueB) {\n return direction === 1 ? -1 : 1\n }\n }\n return 0\n }\n}\n\nexport function compareByKeySuffix(prefixLength: number) {\n return function (a: IIndexEntry, b: IIndexEntry): number {\n const aSuffix = a.key.slice(prefixLength)\n const bSuffix = b.key.slice(prefixLength)\n // @ts-ignore\n return compareKey(aSuffix, bSuffix)\n }\n}\n"],"file":"run-query.js"}
|
|
@@ -10,12 +10,15 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
|
10
10
|
|
|
11
11
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
12
12
|
|
|
13
|
+
const apisToKeep = new Set(_printPlugins.schemaCustomizationAPIs);
|
|
14
|
+
apisToKeep.add(`onPluginInit`);
|
|
15
|
+
|
|
13
16
|
module.exports = function loader(source) {
|
|
14
17
|
const result = (0, _core.transformSync)(source, {
|
|
15
18
|
babelrc: false,
|
|
16
19
|
configFile: false,
|
|
17
20
|
plugins: [[require.resolve(`../../utils/babel/babel-plugin-remove-api`), {
|
|
18
|
-
apis: Object.keys(nodeApis).filter(api => !
|
|
21
|
+
apis: Object.keys(nodeApis).filter(api => !apisToKeep.has(api))
|
|
19
22
|
}]]
|
|
20
23
|
});
|
|
21
24
|
return result === null || result === void 0 ? void 0 : result.code;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/schema/graphql-engine/webpack-remove-apis-loader.ts"],"names":["module","exports","loader","source","result","babelrc","configFile","plugins","require","resolve","apis","Object","keys","nodeApis","filter","api","
|
|
1
|
+
{"version":3,"sources":["../../../src/schema/graphql-engine/webpack-remove-apis-loader.ts"],"names":["apisToKeep","Set","schemaCustomizationAPIs","add","module","exports","loader","source","result","babelrc","configFile","plugins","require","resolve","apis","Object","keys","nodeApis","filter","api","has","code"],"mappings":";;AAAA;;AAEA;;AACA;;;;;;AAEA,MAAMA,UAAU,GAAG,IAAIC,GAAJ,CAAQC,qCAAR,CAAnB;AACAF,UAAU,CAACG,GAAX,CAAgB,cAAhB;;AAEAC,MAAM,CAACC,OAAP,GAAiB,SAASC,MAAT,CAAgBC,MAAhB,EAA2D;AAC1E,QAAMC,MAAM,GAAG,yBAAcD,MAAd,EAAsB;AACnCE,IAAAA,OAAO,EAAE,KAD0B;AAEnCC,IAAAA,UAAU,EAAE,KAFuB;AAGnCC,IAAAA,OAAO,EAAE,CACP,CACEC,OAAO,CAACC,OAAR,CAAiB,2CAAjB,CADF,EAEE;AACEC,MAAAA,IAAI,EAAGC,MAAM,CAACC,IAAP,CAAYC,QAAZ,CAAD,CAAgDC,MAAhD,CACJC,GAAG,IAAI,CAACnB,UAAU,CAACoB,GAAX,CAAeD,GAAf,CADJ;AADR,KAFF,CADO;AAH0B,GAAtB,CAAf;AAeA,SAAOX,MAAP,aAAOA,MAAP,uBAAOA,MAAM,CAAEa,IAAf;AACD,CAjBD","sourcesContent":["import { transformSync } from \"@babel/core\"\nimport { GatsbyNodeAPI } from \"../../redux/types\"\nimport * as nodeApis from \"../../utils/api-node-docs\"\nimport { schemaCustomizationAPIs } from \"./print-plugins\"\n\nconst apisToKeep = new Set(schemaCustomizationAPIs)\napisToKeep.add(`onPluginInit`)\n\nmodule.exports = function loader(source: string): string | null | undefined {\n const result = transformSync(source, {\n babelrc: false,\n configFile: false,\n plugins: [\n [\n require.resolve(`../../utils/babel/babel-plugin-remove-api`),\n {\n apis: (Object.keys(nodeApis) as Array<GatsbyNodeAPI>).filter(\n api => !apisToKeep.has(api)\n ),\n },\n ],\n ],\n })\n\n return result?.code\n}\n"],"file":"webpack-remove-apis-loader.js"}
|
|
@@ -218,6 +218,8 @@ class LocalNodeModel {
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
async _query(args) {
|
|
221
|
+
var _query$filter, _query$filter$id;
|
|
222
|
+
|
|
221
223
|
const {
|
|
222
224
|
query = {},
|
|
223
225
|
type,
|
|
@@ -229,6 +231,33 @@ class LocalNodeModel {
|
|
|
229
231
|
const gqlType = typeof type === `string` ? this.schema.getType(type) : type;
|
|
230
232
|
invariant(!(gqlType instanceof GraphQLUnionType), `Querying GraphQLUnion types is not supported.`);
|
|
231
233
|
const nodeTypeNames = toNodeTypeNames(this.schema, gqlType);
|
|
234
|
+
let runQueryActivity; // check if we can get node by id and skip
|
|
235
|
+
// more expensive query pipeline
|
|
236
|
+
|
|
237
|
+
if (typeof (query === null || query === void 0 ? void 0 : (_query$filter = query.filter) === null || _query$filter === void 0 ? void 0 : (_query$filter$id = _query$filter.id) === null || _query$filter$id === void 0 ? void 0 : _query$filter$id.eq) !== `undefined` && Object.keys(query.filter).length === 1 && Object.keys(query.filter.id).length === 1) {
|
|
238
|
+
if (tracer) {
|
|
239
|
+
runQueryActivity = reporter.phantomActivity(`runQuerySimpleIdEq`, {
|
|
240
|
+
parentSpan: tracer.getParentActivity().span
|
|
241
|
+
});
|
|
242
|
+
runQueryActivity.start();
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const nodeFoundById = this.getNodeById({
|
|
246
|
+
id: query.filter.id.eq,
|
|
247
|
+
type: gqlType
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
if (runQueryActivity) {
|
|
251
|
+
runQueryActivity.end();
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return {
|
|
255
|
+
gqlType,
|
|
256
|
+
entries: new _iterable.GatsbyIterable(nodeFoundById ? [nodeFoundById] : []),
|
|
257
|
+
totalCount: async () => nodeFoundById ? 1 : 0
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
232
261
|
let materializationActivity;
|
|
233
262
|
|
|
234
263
|
if (tracer) {
|
|
@@ -258,8 +287,6 @@ class LocalNodeModel {
|
|
|
258
287
|
materializationActivity.end();
|
|
259
288
|
}
|
|
260
289
|
|
|
261
|
-
let runQueryActivity;
|
|
262
|
-
|
|
263
290
|
if (tracer) {
|
|
264
291
|
runQueryActivity = reporter.phantomActivity(`runQuery`, {
|
|
265
292
|
parentSpan: tracer.getParentActivity().span
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/schema/node-model.js"],"names":["_","require","isAbstractType","GraphQLOutputType","GraphQLUnionType","GraphQLList","getNamedType","getNullableType","isCompositeType","invariant","reporter","LocalNodeModel","constructor","schema","schemaComposer","createPageDependency","_rootNodeMap","_trackedRootNodes","createPageDependencyActionCreator","WeakMap","WeakSet","_prepareNodesQueues","_prepareNodesPromises","_preparedNodesCache","Map","replaceFiltersCache","createPageDependencyArgs","connection","nodeTypeNames","toNodeTypeNames","forEach","typeName","map","_filtersCache","withContext","context","ContextualNodeModel","getNodeById","args","pageDependencies","id","type","node","result","includes","internal","trackInlineObjectsInRootNode","trackPageDependencies","getNodesByIds","ids","nodes","Array","isArray","filter","Boolean","length","getAllNodes","nodesByType","concat","connectionType","name","runQuery","firstOnly","findOne","skip","limit","query","findAll","from","entries","_query","stats","tracer","gqlType","getType","materializationActivity","phantomActivity","parentSpan","getParentActivity","span","start","fields","getQueryFields","sort","group","distinct","max","min","sum","fieldsToResolve","determineResolvableFields","nodeTypeName","gqlNodeType","prepareNodes","end","runQueryActivity","totalCount","queryArgs","gqlSchema","gqlComposer","resolvedFields","filtersCache","Error","undefined","first","queryFields","push","Promise","resolve","process","nextTick","_doResolvePrepareNodesQueue","queue","reduce","nextQueryFields","nextFieldsToResolve","merge","actualFieldsToResolve","deepObjectDifference","get","isEmpty","resolvedNodes","iterateNodesByType","resolveRecursive","__gatsby_resolved","set","size","saveResolvedNodes","getTypes","has","addRootNodeToInlineObject","Set","add","findRootNodeAncestor","obj","predicate","iterations","parent","trackedParent","isMatchingRoot","error","path","track","nodeId","rootNodeModel","nodeModel","_getFullDependencies","gqlTypeName","possibleTypes","getPossibleTypes","getInterfaces","some","iface","filterFields","dropQueryOperators","sortFields","pathToObject","split","reduceRight","acc","key","Object","keys","value","k","v","isPlainObject","getFields","concreteType","resolveType","gqlFields","fieldName","fieldToResolve","queryField","gqlField","gqlNonNullType","gqlFieldType","innerValue","resolveField","isObject","GatsbyIterable","all","item","pickBy","withResolverContext","arg","defaultValue","returnType","isNestedType","field","typeComposer","getAnyTC","possibleTCs","needsResolve","tc","getFieldExtension","innerResolved","rootNodeMap","data","isNode","each","o","store","dispatch","payload","to","toValue","deepResult","module","exports"],"mappings":"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","sourcesContent":["// @flow\n\nconst _ = require(`lodash`)\nconst {\n isAbstractType,\n GraphQLOutputType,\n GraphQLUnionType,\n GraphQLList,\n getNamedType,\n getNullableType,\n isCompositeType,\n} = require(`graphql`)\nconst invariant = require(`invariant`)\nconst reporter = require(`gatsby-cli/lib/reporter`)\nimport { store } from \"../redux\"\nimport {\n getDataStore,\n getNode,\n getNodes,\n getNodesByType,\n getTypes,\n} from \"../datastore\"\nimport { GatsbyIterable, isIterable } from \"../datastore/common/iterable\"\nimport { reportOnce } from \"../utils/report-once\"\nimport { wrapNode, wrapNodes } from \"../utils/detect-node-mutations\"\n\ntype TypeOrTypeName = string | GraphQLOutputType\n\n/**\n * Optional page dependency information.\n *\n * @typedef {Object} PageDependencies\n * @property {string} path The path of the page that depends on the retrieved nodes' data\n * @property {string} [connectionType] Mark this dependency as a connection\n */\ninterface PageDependencies {\n path: string;\n connectionType?: string;\n}\n\ninterface QueryArguments {\n type: TypeOrTypeName;\n query: { filter: Object, sort?: Object };\n firstOnly?: boolean;\n}\n\nexport interface NodeModel {\n getNodeById(\n { id: string, type?: TypeOrTypeName },\n pageDependencies?: PageDependencies\n ): any | null;\n getNodesByIds(\n { ids: Array<string>, type?: TypeOrTypeName },\n pageDependencies?: PageDependencies\n ): Array<any>;\n getAllNodes(\n { type?: TypeOrTypeName },\n pageDependencies?: PageDependencies\n ): Array<any>;\n runQuery(\n args: QueryArguments,\n pageDependencies?: PageDependencies\n ): Promise<any>;\n getTypes(): Array<string>;\n trackPageDependencies<nodeOrNodes: Node | Node[]>(\n result: nodeOrNodes,\n pageDependencies?: PageDependencies\n ): nodesOrNodes;\n findRootNodeAncestor(obj: any, predicate: () => boolean): Node | null;\n trackInlineObjectsInRootNode(node: Node, sanitize: boolean): Node;\n}\n\nclass LocalNodeModel {\n constructor({\n schema,\n schemaComposer,\n createPageDependency,\n _rootNodeMap,\n _trackedRootNodes,\n }) {\n this.schema = schema\n this.schemaComposer = schemaComposer\n this.createPageDependencyActionCreator = createPageDependency\n this._rootNodeMap = _rootNodeMap || new WeakMap()\n this._trackedRootNodes = _trackedRootNodes || new WeakSet()\n this._prepareNodesQueues = {}\n this._prepareNodesPromises = {}\n this._preparedNodesCache = new Map()\n this.replaceFiltersCache()\n }\n\n createPageDependency(createPageDependencyArgs) {\n if (createPageDependencyArgs.connection) {\n const nodeTypeNames = toNodeTypeNames(\n this.schema,\n createPageDependencyArgs.connection\n )\n if (nodeTypeNames) {\n nodeTypeNames.forEach(typeName => {\n this.createPageDependencyActionCreator({\n ...createPageDependencyArgs,\n connection: typeName,\n })\n })\n return\n }\n }\n\n this.createPageDependencyActionCreator(createPageDependencyArgs)\n }\n\n /**\n * Replace the cache either with the value passed on (mainly for tests) or\n * an empty new Map.\n *\n * @param {undefined | null | FiltersCache} map\n * (This cached is used in redux/nodes.js and caches a set of buckets (Sets)\n * of Nodes based on filter and tracks this for each set of types which are\n * actually queried. If the filter targets `id` directly, only one Node is\n * cached instead of a Set of Nodes. If null, don't create or use a cache.\n */\n replaceFiltersCache(map = new Map()) {\n this._filtersCache = map // See redux/nodes.js for usage\n }\n\n withContext(context) {\n return new ContextualNodeModel(this, context)\n }\n\n /**\n * Get a node from the store by ID and optional type.\n *\n * @param {Object} args\n * @param {string} args.id ID of the requested node\n * @param {(string|GraphQLOutputType)} [args.type] Optional type of the node\n * @param {PageDependencies} [pageDependencies]\n * @returns {(Node|null)}\n */\n getNodeById(args, pageDependencies) {\n const { id, type } = args || {}\n\n const node = getNodeById(id)\n\n let result\n if (!node) {\n result = null\n } else if (!type) {\n result = node\n } else {\n const nodeTypeNames = toNodeTypeNames(this.schema, type)\n result = nodeTypeNames.includes(node.internal.type) ? node : null\n }\n\n if (result) {\n this.trackInlineObjectsInRootNode(node)\n }\n\n return wrapNode(this.trackPageDependencies(result, pageDependencies))\n }\n\n /**\n * Get nodes from the store by IDs and optional type.\n *\n * @param {Object} args\n * @param {string[]} args.ids IDs of the requested nodes\n * @param {(string|GraphQLOutputType)} [args.type] Optional type of the nodes\n * @param {PageDependencies} [pageDependencies]\n * @returns {Node[]}\n */\n getNodesByIds(args, pageDependencies) {\n const { ids, type } = args || {}\n\n const nodes = Array.isArray(ids)\n ? ids.map(id => getNodeById(id)).filter(Boolean)\n : []\n\n let result\n if (!nodes.length || !type) {\n result = nodes\n } else {\n const nodeTypeNames = toNodeTypeNames(this.schema, type)\n result = nodes.filter(node => nodeTypeNames.includes(node.internal.type))\n }\n\n if (result) {\n result.forEach(node => this.trackInlineObjectsInRootNode(node))\n }\n\n return wrapNodes(this.trackPageDependencies(result, pageDependencies))\n }\n\n /**\n * Get all nodes in the store, or all nodes of a specified type. Note that\n * this adds connectionType tracking by default if type is passed.\n *\n * @deprecated Since version 4.0 - Use nodeModel.findAll() instead\n * @param {Object} args\n * @param {(string|GraphQLOutputType)} [args.type] Optional type of the nodes\n * @param {PageDependencies} [pageDependencies]\n * @returns {Node[]}\n */\n getAllNodes(args, pageDependencies = {}) {\n // TODO(v5): Remove API\n reportOnce(\n `nodeModel.getAllNodes() is deprecated. Use nodeModel.findAll() with an empty query instead.`\n )\n const { type = `Node` } = args || {}\n\n let result\n if (type === `Node`) {\n result = getNodes()\n } else {\n const nodeTypeNames = toNodeTypeNames(this.schema, type)\n const nodesByType = nodeTypeNames.map(typeName =>\n getNodesByType(typeName)\n )\n const nodes = [].concat(...nodesByType)\n result = nodes.filter(Boolean)\n }\n\n if (result) {\n result.forEach(node => this.trackInlineObjectsInRootNode(node))\n }\n\n if (typeof pageDependencies.connectionType === `undefined`) {\n pageDependencies.connectionType =\n typeof type === `string` ? type : type.name\n }\n\n return wrapNodes(this.trackPageDependencies(result, pageDependencies))\n }\n\n /**\n * Get nodes of a type matching the specified query.\n *\n * @deprecated Since version 4.0 - Use nodeModel.findAll() or nodeModel.findOne() instead\n * @param {Object} args\n * @param {Object} args.query Query arguments (`filter` and `sort`)\n * @param {(string|GraphQLOutputType)} args.type Type\n * @param {boolean} [args.firstOnly] If true, return only first match\n * @param {PageDependencies} [pageDependencies]\n * @returns {Promise<Node[]>}\n */\n async runQuery(args, pageDependencies = {}) {\n // TODO(v5): Remove API\n reportOnce(\n `nodeModel.runQuery() is deprecated. Use nodeModel.findAll() or nodeModel.findOne() instead.`\n )\n if (args.firstOnly) {\n return this.findOne(args, pageDependencies)\n }\n const { skip, limit, ...query } = args.query\n const result = await this.findAll({ ...args, query }, pageDependencies)\n return Array.from(result.entries)\n }\n\n async _query(args) {\n const { query = {}, type, stats, tracer } = args || {}\n\n // We don't support querying union types (yet?), because the combined types\n // need not have any fields in common.\n const gqlType = typeof type === `string` ? this.schema.getType(type) : type\n invariant(\n !(gqlType instanceof GraphQLUnionType),\n `Querying GraphQLUnion types is not supported.`\n )\n\n const nodeTypeNames = toNodeTypeNames(this.schema, gqlType)\n\n let materializationActivity\n if (tracer) {\n materializationActivity = reporter.phantomActivity(`Materialization`, {\n parentSpan: tracer.getParentActivity().span,\n })\n materializationActivity.start()\n }\n const fields = getQueryFields({\n filter: query.filter,\n sort: query.sort,\n group: query.group,\n distinct: query.distinct,\n max: query.max,\n min: query.min,\n sum: query.sum,\n })\n const fieldsToResolve = determineResolvableFields(\n this.schemaComposer,\n this.schema,\n gqlType,\n fields,\n nodeTypeNames\n )\n\n for (const nodeTypeName of nodeTypeNames) {\n const gqlNodeType = this.schema.getType(nodeTypeName)\n await this.prepareNodes(gqlNodeType, fields, fieldsToResolve)\n }\n\n if (materializationActivity) {\n materializationActivity.end()\n }\n\n let runQueryActivity\n if (tracer) {\n runQueryActivity = reporter.phantomActivity(`runQuery`, {\n parentSpan: tracer.getParentActivity().span,\n })\n runQueryActivity.start()\n }\n\n const { entries, totalCount } = await getDataStore().runQuery({\n queryArgs: query,\n gqlSchema: this.schema,\n gqlComposer: this.schemaComposer,\n gqlType,\n resolvedFields: fieldsToResolve,\n nodeTypeNames,\n filtersCache: this._filtersCache,\n stats,\n })\n\n if (runQueryActivity) {\n runQueryActivity.end()\n }\n\n return {\n gqlType,\n entries: entries.map(node => {\n // With GatsbyIterable it happens lazily as we iterate\n this.trackInlineObjectsInRootNode(node)\n return node\n }),\n totalCount,\n }\n }\n\n /**\n * Get all nodes in the store, or all nodes of a specified type (optionally with limit/skip).\n * Returns slice of result as iterable and total count of nodes.\n *\n * @param {*} args\n * @param {Object} args.query Query arguments (e.g. `limit` and `skip`)\n * @param {(string|GraphQLOutputType)} args.type Type\n * @param {PageDependencies} [pageDependencies]\n * @return {Promise<Object>} Object containing `{ entries: GatsbyIterable, totalCount: () => Promise<number> }`\n */\n async findAll(args, pageDependencies = {}) {\n const { gqlType, ...result } = await this._query(args, pageDependencies)\n\n // Tracking connections by default:\n if (typeof pageDependencies.connectionType === `undefined`) {\n pageDependencies.connectionType = gqlType.name\n }\n this.trackPageDependencies(result.entries, pageDependencies)\n return {\n entries: wrapNodes(result.entries),\n totalCount: result.totalCount,\n }\n }\n\n /**\n * Get one node in the store. Only returns the first result.\n *\n * @param {*} args\n * @param {Object} args.query Query arguments (e.g. `filter`). Doesn't support `sort`, `limit`, `skip`.\n * @param {(string|GraphQLOutputType)} args.type Type\n * @param {PageDependencies} [pageDependencies]\n * @returns {Promise<Node>}\n */\n async findOne(args, pageDependencies = {}) {\n const { query = {} } = args\n if (query.sort?.fields?.length > 0) {\n // If we support sorting and return the first node based on sorting\n // we'll have to always track connection not an individual node\n throw new Error(\n `nodeModel.findOne() does not support sorting. Use nodeModel.findAll({ query: { limit: 1 } }) instead.`\n )\n }\n const { gqlType, entries } = await this._query({\n ...args,\n query: { ...query, skip: 0, limit: 1, sort: undefined },\n })\n const result = Array.from(entries)\n const first = result[0] ?? null\n\n if (!first) {\n // Couldn't find matching node.\n // This leads to a state where data tracking for this query gets empty.\n // It means we will NEVER re-run this query on any data updates\n // (even if a new node matching this query is added at some point).\n // To workaround this, we have to add a connection tracking to re-run\n // the query whenever any node of this type changes.\n pageDependencies.connectionType = gqlType.name\n }\n return wrapNode(this.trackPageDependencies(first, pageDependencies))\n }\n\n prepareNodes(type, queryFields, fieldsToResolve) {\n const typeName = type.name\n if (!this._prepareNodesQueues[typeName]) {\n this._prepareNodesQueues[typeName] = []\n }\n\n this._prepareNodesQueues[typeName].push({\n queryFields,\n fieldsToResolve,\n })\n\n if (!this._prepareNodesPromises[typeName]) {\n this._prepareNodesPromises[typeName] = new Promise(resolve => {\n process.nextTick(async () => {\n await this._doResolvePrepareNodesQueue(type)\n resolve()\n })\n })\n }\n\n return this._prepareNodesPromises[typeName]\n }\n\n async _doResolvePrepareNodesQueue(type) {\n const typeName = type.name\n const queue = this._prepareNodesQueues[typeName]\n this._prepareNodesQueues[typeName] = []\n this._prepareNodesPromises[typeName] = null\n\n const { queryFields, fieldsToResolve } = queue.reduce(\n (\n { queryFields, fieldsToResolve },\n { queryFields: nextQueryFields, fieldsToResolve: nextFieldsToResolve }\n ) => {\n return {\n queryFields: _.merge(queryFields, nextQueryFields),\n fieldsToResolve: _.merge(fieldsToResolve, nextFieldsToResolve),\n }\n },\n {\n queryFields: {},\n fieldsToResolve: {},\n }\n )\n\n const actualFieldsToResolve = deepObjectDifference(\n fieldsToResolve,\n this._preparedNodesCache.get(typeName) || {}\n )\n\n if (!_.isEmpty(actualFieldsToResolve)) {\n const resolvedNodes = new Map()\n for (const node of getDataStore().iterateNodesByType(typeName)) {\n this.trackInlineObjectsInRootNode(node)\n const resolvedFields = await resolveRecursive(\n this,\n this.schemaComposer,\n this.schema,\n node,\n type,\n queryFields,\n actualFieldsToResolve\n )\n if (!node.__gatsby_resolved) {\n node.__gatsby_resolved = {}\n }\n resolvedNodes.set(\n node.id,\n _.merge(node.__gatsby_resolved, resolvedFields)\n )\n }\n if (resolvedNodes.size) {\n await saveResolvedNodes(typeName, resolvedNodes)\n }\n this._preparedNodesCache.set(\n typeName,\n _.merge(\n {},\n this._preparedNodesCache.get(typeName) || {},\n actualFieldsToResolve\n )\n )\n }\n }\n\n /**\n * Get the names of all node types in the store.\n *\n * @returns {string[]}\n */\n getTypes() {\n return getTypes()\n }\n\n /**\n * Adds link between inline objects/arrays contained in Node object\n * and that Node object.\n * @param {Node} node Root Node\n */\n trackInlineObjectsInRootNode(node) {\n if (!this._trackedRootNodes.has(node)) {\n addRootNodeToInlineObject(\n this._rootNodeMap,\n node,\n node.id,\n true,\n new Set()\n )\n this._trackedRootNodes.add(node)\n }\n }\n\n /**\n * Finds top most ancestor of node that contains passed Object or Array\n * @param {(Object|Array)} obj Object/Array belonging to Node object or Node object\n * @param {nodePredicate} [predicate] Optional callback to check if ancestor meets defined conditions\n * @returns {Node} Top most ancestor if predicate is not specified\n * or first node that meet predicate conditions if predicate is specified\n */\n findRootNodeAncestor(obj, predicate = null) {\n let iterations = 0\n let node = obj\n\n while (iterations++ < 100) {\n if (predicate && predicate(node)) return node\n\n const parent = getNodeById(node.parent)\n const id = this._rootNodeMap.get(node)\n const trackedParent = getNodeById(id)\n\n if (!parent && !trackedParent) {\n const isMatchingRoot = !predicate || predicate(node)\n return isMatchingRoot ? node : null\n }\n\n node = parent || trackedParent\n }\n\n reporter.error(\n `It looks like you have a node that's set its parent as itself:\\n\\n` +\n node\n )\n return null\n }\n\n /**\n * Given a result, that's either a single node or an array of them, track them\n * using pageDependencies. Defaults to tracking according to current resolver\n * path. Returns the result back.\n *\n * @param {Node | Node[]} result\n * @param {PageDependencies} [pageDependencies]\n * @returns {Node | Node[]}\n */\n trackPageDependencies(result, pageDependencies = {}) {\n const { path, connectionType, track = true } = pageDependencies\n if (path && track) {\n if (connectionType) {\n this.createPageDependency({ path, connection: connectionType })\n } else {\n const nodes = isIterable(result) ? result : [result]\n for (const node of nodes) {\n if (node) {\n this.createPageDependency({ path, nodeId: node.id })\n }\n }\n }\n }\n\n return result\n }\n}\n\nclass ContextualNodeModel {\n constructor(rootNodeModel, context) {\n this.nodeModel = rootNodeModel\n this.context = context\n }\n\n withContext(context) {\n return new ContextualNodeModel(this.nodeModel, {\n ...this.context,\n ...context,\n })\n }\n\n _getFullDependencies(pageDependencies) {\n return {\n path: this.context.path,\n ...(pageDependencies || {}),\n }\n }\n\n getNodeById(args, pageDependencies) {\n return this.nodeModel.getNodeById(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n getNodesByIds(args, pageDependencies) {\n return this.nodeModel.getNodesByIds(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n getAllNodes(args, pageDependencies) {\n return this.nodeModel.getAllNodes(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n runQuery(args, pageDependencies) {\n return this.nodeModel.runQuery(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n findOne(args, pageDependencies) {\n return this.nodeModel.findOne(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n findAll(args, pageDependencies) {\n return this.nodeModel.findAll(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n prepareNodes(...args) {\n return this.nodeModel.prepareNodes(...args)\n }\n\n getTypes(...args) {\n return this.nodeModel.getTypes(...args)\n }\n\n trackInlineObjectsInRootNode(...args) {\n return this.nodeModel.trackInlineObjectsInRootNode(...args)\n }\n\n findRootNodeAncestor(...args) {\n return this.nodeModel.findRootNodeAncestor(...args)\n }\n\n createPageDependency(...args) {\n return this.nodeModel.createPageDependency(...args)\n }\n\n trackPageDependencies(result, pageDependencies) {\n return this.nodeModel.trackPageDependencies(\n result,\n this._getFullDependencies(pageDependencies)\n )\n }\n}\n\nconst getNodeById = id => (id != null ? getNode(id) : null)\n\nconst toNodeTypeNames = (schema, gqlTypeName) => {\n const gqlType =\n typeof gqlTypeName === `string` ? schema.getType(gqlTypeName) : gqlTypeName\n\n if (!gqlType) return []\n\n const possibleTypes = isAbstractType(gqlType)\n ? schema.getPossibleTypes(gqlType)\n : [gqlType]\n\n return possibleTypes\n .filter(type => type.getInterfaces().some(iface => iface.name === `Node`))\n .map(type => type.name)\n}\n\nconst getQueryFields = ({ filter, sort, group, distinct, max, min, sum }) => {\n const filterFields = filter ? dropQueryOperators(filter) : {}\n const sortFields = (sort && sort.fields) || []\n\n if (group && !Array.isArray(group)) {\n group = [group]\n } else if (group == null) {\n group = []\n }\n\n if (distinct && !Array.isArray(distinct)) {\n distinct = [distinct]\n } else if (distinct == null) {\n distinct = []\n }\n\n if (max && !Array.isArray(max)) {\n max = [max]\n } else if (max == null) {\n max = []\n }\n\n if (min && !Array.isArray(min)) {\n min = [min]\n } else if (min == null) {\n min = []\n }\n\n if (sum && !Array.isArray(sum)) {\n sum = [sum]\n } else if (sum == null) {\n sum = []\n }\n\n return _.merge(\n filterFields,\n ...sortFields.map(pathToObject),\n ...group.map(pathToObject),\n ...distinct.map(pathToObject),\n ...max.map(pathToObject),\n ...min.map(pathToObject),\n ...sum.map(pathToObject)\n )\n}\n\nconst pathToObject = path => {\n if (path && typeof path === `string`) {\n return path.split(`.`).reduceRight((acc, key) => {\n return { [key]: acc }\n }, true)\n }\n return {}\n}\n\nconst dropQueryOperators = filter =>\n Object.keys(filter).reduce((acc, key) => {\n const value = filter[key]\n const k = Object.keys(value)[0]\n const v = value[k]\n if (_.isPlainObject(value) && _.isPlainObject(v)) {\n acc[key] =\n k === `elemMatch` ? dropQueryOperators(v) : dropQueryOperators(value)\n } else {\n acc[key] = true\n }\n return acc\n }, {})\n\nconst getFields = (schema, type, node) => {\n if (!isAbstractType(type)) {\n return type.getFields()\n }\n\n const concreteType = type.resolveType(node)\n return schema.getType(concreteType).getFields()\n}\n\nasync function resolveRecursive(\n nodeModel,\n schemaComposer,\n schema,\n node,\n type,\n queryFields,\n fieldsToResolve\n) {\n const gqlFields = getFields(schema, type, node)\n const resolvedFields = {}\n for (const fieldName of Object.keys(fieldsToResolve)) {\n const fieldToResolve = fieldsToResolve[fieldName]\n const queryField = queryFields[fieldName]\n const gqlField = gqlFields[fieldName]\n const gqlNonNullType = getNullableType(gqlField.type)\n const gqlFieldType = getNamedType(gqlField.type)\n let innerValue = await resolveField(\n nodeModel,\n schemaComposer,\n schema,\n node,\n gqlField,\n fieldName\n )\n if (gqlField && innerValue != null) {\n if (\n isCompositeType(gqlFieldType) &&\n !(gqlNonNullType instanceof GraphQLList)\n ) {\n innerValue = await resolveRecursive(\n nodeModel,\n schemaComposer,\n schema,\n innerValue,\n gqlFieldType,\n queryField,\n _.isObject(fieldToResolve) ? fieldToResolve : queryField\n )\n } else if (\n isCompositeType(gqlFieldType) &&\n (_.isArray(innerValue) || innerValue instanceof GatsbyIterable) &&\n gqlNonNullType instanceof GraphQLList\n ) {\n innerValue = await Promise.all(\n innerValue.map(item =>\n item == null\n ? item\n : resolveRecursive(\n nodeModel,\n schemaComposer,\n schema,\n item,\n gqlFieldType,\n queryField,\n _.isObject(fieldToResolve) ? fieldToResolve : queryField\n )\n )\n )\n }\n }\n if (innerValue != null) {\n resolvedFields[fieldName] = innerValue\n }\n }\n\n for (const fieldName of Object.keys(queryFields)) {\n if (!fieldsToResolve[fieldName] && node[fieldName]) {\n // It is possible that this field still has a custom resolver\n // See https://github.com/gatsbyjs/gatsby/issues/27368\n resolvedFields[fieldName] = await resolveField(\n nodeModel,\n schemaComposer,\n schema,\n node,\n gqlFields[fieldName],\n fieldName\n )\n }\n }\n\n return _.pickBy(resolvedFields, (value, key) => queryFields[key])\n}\n\nfunction resolveField(\n nodeModel,\n schemaComposer,\n schema,\n node,\n gqlField,\n fieldName\n) {\n if (!gqlField?.resolve) {\n return node[fieldName]\n }\n const withResolverContext = require(`./context`)\n return gqlField.resolve(\n node,\n gqlField.args.reduce((acc, arg) => {\n acc[arg.name] = arg.defaultValue\n return acc\n }, {}),\n withResolverContext({\n schema,\n schemaComposer,\n nodeModel,\n }),\n {\n fieldName,\n schema,\n returnType: gqlField.type,\n }\n )\n}\n\nconst determineResolvableFields = (\n schemaComposer,\n schema,\n type,\n fields,\n nodeTypeNames,\n isNestedType = false\n) => {\n const fieldsToResolve = {}\n const gqlFields = type.getFields()\n Object.keys(fields).forEach(fieldName => {\n const field = fields[fieldName]\n const gqlField = gqlFields[fieldName]\n const gqlFieldType = getNamedType(gqlField.type)\n const typeComposer = schemaComposer.getAnyTC(type.name)\n const possibleTCs = [\n typeComposer,\n ...nodeTypeNames.map(name => schemaComposer.getAnyTC(name)),\n ]\n let needsResolve = false\n for (const tc of possibleTCs) {\n needsResolve = tc.getFieldExtension(fieldName, `needsResolve`) || false\n if (needsResolve) {\n break\n }\n }\n\n if (_.isObject(field) && gqlField) {\n const innerResolved = determineResolvableFields(\n schemaComposer,\n schema,\n gqlFieldType,\n field,\n toNodeTypeNames(schema, gqlFieldType),\n true\n )\n if (!_.isEmpty(innerResolved)) {\n fieldsToResolve[fieldName] = innerResolved\n }\n }\n\n if (!fieldsToResolve[fieldName] && needsResolve) {\n fieldsToResolve[fieldName] = true\n }\n if (!fieldsToResolve[fieldName] && isNestedType) {\n // If parent field needs to be resolved - all nested fields should be added as well\n // See https://github.com/gatsbyjs/gatsby/issues/26056\n fieldsToResolve[fieldName] = true\n }\n })\n return fieldsToResolve\n}\n\nconst addRootNodeToInlineObject = (\n rootNodeMap,\n data,\n nodeId,\n isNode /* : boolean */,\n path /* : Set<mixed> */\n) /* : void */ => {\n const isPlainObject = _.isPlainObject(data)\n\n if (isPlainObject || _.isArray(data)) {\n if (path.has(data)) return\n path.add(data)\n\n _.each(data, (o, key) => {\n if (!isNode || key !== `internal`) {\n addRootNodeToInlineObject(rootNodeMap, o, nodeId, false, path)\n }\n })\n\n // don't need to track node itself\n if (!isNode) {\n rootNodeMap.set(data, nodeId)\n }\n }\n}\n\nconst saveResolvedNodes = async (typeName, resolvedNodes) => {\n store.dispatch({\n type: `SET_RESOLVED_NODES`,\n payload: {\n key: typeName,\n nodes: resolvedNodes,\n },\n })\n}\n\nconst deepObjectDifference = (from, to) => {\n const result = {}\n Object.keys(from).forEach(key => {\n const toValue = to[key]\n if (toValue) {\n if (_.isPlainObject(toValue)) {\n const deepResult = deepObjectDifference(from[key], toValue)\n if (!_.isEmpty(deepResult)) {\n result[key] = deepResult\n }\n }\n } else {\n result[key] = from[key]\n }\n })\n return result\n}\n\nmodule.exports = {\n LocalNodeModel,\n}\n"],"file":"node-model.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/schema/node-model.js"],"names":["_","require","isAbstractType","GraphQLOutputType","GraphQLUnionType","GraphQLList","getNamedType","getNullableType","isCompositeType","invariant","reporter","LocalNodeModel","constructor","schema","schemaComposer","createPageDependency","_rootNodeMap","_trackedRootNodes","createPageDependencyActionCreator","WeakMap","WeakSet","_prepareNodesQueues","_prepareNodesPromises","_preparedNodesCache","Map","replaceFiltersCache","createPageDependencyArgs","connection","nodeTypeNames","toNodeTypeNames","forEach","typeName","map","_filtersCache","withContext","context","ContextualNodeModel","getNodeById","args","pageDependencies","id","type","node","result","includes","internal","trackInlineObjectsInRootNode","trackPageDependencies","getNodesByIds","ids","nodes","Array","isArray","filter","Boolean","length","getAllNodes","nodesByType","concat","connectionType","name","runQuery","firstOnly","findOne","skip","limit","query","findAll","from","entries","_query","stats","tracer","gqlType","getType","runQueryActivity","eq","Object","keys","phantomActivity","parentSpan","getParentActivity","span","start","nodeFoundById","end","GatsbyIterable","totalCount","materializationActivity","fields","getQueryFields","sort","group","distinct","max","min","sum","fieldsToResolve","determineResolvableFields","nodeTypeName","gqlNodeType","prepareNodes","queryArgs","gqlSchema","gqlComposer","resolvedFields","filtersCache","Error","undefined","first","queryFields","push","Promise","resolve","process","nextTick","_doResolvePrepareNodesQueue","queue","reduce","nextQueryFields","nextFieldsToResolve","merge","actualFieldsToResolve","deepObjectDifference","get","isEmpty","resolvedNodes","iterateNodesByType","resolveRecursive","__gatsby_resolved","set","size","saveResolvedNodes","getTypes","has","addRootNodeToInlineObject","Set","add","findRootNodeAncestor","obj","predicate","iterations","parent","trackedParent","isMatchingRoot","error","path","track","nodeId","rootNodeModel","nodeModel","_getFullDependencies","gqlTypeName","possibleTypes","getPossibleTypes","getInterfaces","some","iface","filterFields","dropQueryOperators","sortFields","pathToObject","split","reduceRight","acc","key","value","k","v","isPlainObject","getFields","concreteType","resolveType","gqlFields","fieldName","fieldToResolve","queryField","gqlField","gqlNonNullType","gqlFieldType","innerValue","resolveField","isObject","all","item","pickBy","withResolverContext","arg","defaultValue","returnType","isNestedType","field","typeComposer","getAnyTC","possibleTCs","needsResolve","tc","getFieldExtension","innerResolved","rootNodeMap","data","isNode","each","o","store","dispatch","payload","to","toValue","deepResult","module","exports"],"mappings":"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","sourcesContent":["// @flow\n\nconst _ = require(`lodash`)\nconst {\n isAbstractType,\n GraphQLOutputType,\n GraphQLUnionType,\n GraphQLList,\n getNamedType,\n getNullableType,\n isCompositeType,\n} = require(`graphql`)\nconst invariant = require(`invariant`)\nconst reporter = require(`gatsby-cli/lib/reporter`)\nimport { store } from \"../redux\"\nimport {\n getDataStore,\n getNode,\n getNodes,\n getNodesByType,\n getTypes,\n} from \"../datastore\"\nimport { GatsbyIterable, isIterable } from \"../datastore/common/iterable\"\nimport { reportOnce } from \"../utils/report-once\"\nimport { wrapNode, wrapNodes } from \"../utils/detect-node-mutations\"\n\ntype TypeOrTypeName = string | GraphQLOutputType\n\n/**\n * Optional page dependency information.\n *\n * @typedef {Object} PageDependencies\n * @property {string} path The path of the page that depends on the retrieved nodes' data\n * @property {string} [connectionType] Mark this dependency as a connection\n */\ninterface PageDependencies {\n path: string;\n connectionType?: string;\n}\n\ninterface QueryArguments {\n type: TypeOrTypeName;\n query: { filter: Object, sort?: Object };\n firstOnly?: boolean;\n}\n\nexport interface NodeModel {\n getNodeById(\n { id: string, type?: TypeOrTypeName },\n pageDependencies?: PageDependencies\n ): any | null;\n getNodesByIds(\n { ids: Array<string>, type?: TypeOrTypeName },\n pageDependencies?: PageDependencies\n ): Array<any>;\n getAllNodes(\n { type?: TypeOrTypeName },\n pageDependencies?: PageDependencies\n ): Array<any>;\n runQuery(\n args: QueryArguments,\n pageDependencies?: PageDependencies\n ): Promise<any>;\n getTypes(): Array<string>;\n trackPageDependencies<nodeOrNodes: Node | Node[]>(\n result: nodeOrNodes,\n pageDependencies?: PageDependencies\n ): nodesOrNodes;\n findRootNodeAncestor(obj: any, predicate: () => boolean): Node | null;\n trackInlineObjectsInRootNode(node: Node, sanitize: boolean): Node;\n}\n\nclass LocalNodeModel {\n constructor({\n schema,\n schemaComposer,\n createPageDependency,\n _rootNodeMap,\n _trackedRootNodes,\n }) {\n this.schema = schema\n this.schemaComposer = schemaComposer\n this.createPageDependencyActionCreator = createPageDependency\n this._rootNodeMap = _rootNodeMap || new WeakMap()\n this._trackedRootNodes = _trackedRootNodes || new WeakSet()\n this._prepareNodesQueues = {}\n this._prepareNodesPromises = {}\n this._preparedNodesCache = new Map()\n this.replaceFiltersCache()\n }\n\n createPageDependency(createPageDependencyArgs) {\n if (createPageDependencyArgs.connection) {\n const nodeTypeNames = toNodeTypeNames(\n this.schema,\n createPageDependencyArgs.connection\n )\n if (nodeTypeNames) {\n nodeTypeNames.forEach(typeName => {\n this.createPageDependencyActionCreator({\n ...createPageDependencyArgs,\n connection: typeName,\n })\n })\n return\n }\n }\n\n this.createPageDependencyActionCreator(createPageDependencyArgs)\n }\n\n /**\n * Replace the cache either with the value passed on (mainly for tests) or\n * an empty new Map.\n *\n * @param {undefined | null | FiltersCache} map\n * (This cached is used in redux/nodes.js and caches a set of buckets (Sets)\n * of Nodes based on filter and tracks this for each set of types which are\n * actually queried. If the filter targets `id` directly, only one Node is\n * cached instead of a Set of Nodes. If null, don't create or use a cache.\n */\n replaceFiltersCache(map = new Map()) {\n this._filtersCache = map // See redux/nodes.js for usage\n }\n\n withContext(context) {\n return new ContextualNodeModel(this, context)\n }\n\n /**\n * Get a node from the store by ID and optional type.\n *\n * @param {Object} args\n * @param {string} args.id ID of the requested node\n * @param {(string|GraphQLOutputType)} [args.type] Optional type of the node\n * @param {PageDependencies} [pageDependencies]\n * @returns {(Node|null)}\n */\n getNodeById(args, pageDependencies) {\n const { id, type } = args || {}\n\n const node = getNodeById(id)\n\n let result\n if (!node) {\n result = null\n } else if (!type) {\n result = node\n } else {\n const nodeTypeNames = toNodeTypeNames(this.schema, type)\n result = nodeTypeNames.includes(node.internal.type) ? node : null\n }\n\n if (result) {\n this.trackInlineObjectsInRootNode(node)\n }\n\n return wrapNode(this.trackPageDependencies(result, pageDependencies))\n }\n\n /**\n * Get nodes from the store by IDs and optional type.\n *\n * @param {Object} args\n * @param {string[]} args.ids IDs of the requested nodes\n * @param {(string|GraphQLOutputType)} [args.type] Optional type of the nodes\n * @param {PageDependencies} [pageDependencies]\n * @returns {Node[]}\n */\n getNodesByIds(args, pageDependencies) {\n const { ids, type } = args || {}\n\n const nodes = Array.isArray(ids)\n ? ids.map(id => getNodeById(id)).filter(Boolean)\n : []\n\n let result\n if (!nodes.length || !type) {\n result = nodes\n } else {\n const nodeTypeNames = toNodeTypeNames(this.schema, type)\n result = nodes.filter(node => nodeTypeNames.includes(node.internal.type))\n }\n\n if (result) {\n result.forEach(node => this.trackInlineObjectsInRootNode(node))\n }\n\n return wrapNodes(this.trackPageDependencies(result, pageDependencies))\n }\n\n /**\n * Get all nodes in the store, or all nodes of a specified type. Note that\n * this adds connectionType tracking by default if type is passed.\n *\n * @deprecated Since version 4.0 - Use nodeModel.findAll() instead\n * @param {Object} args\n * @param {(string|GraphQLOutputType)} [args.type] Optional type of the nodes\n * @param {PageDependencies} [pageDependencies]\n * @returns {Node[]}\n */\n getAllNodes(args, pageDependencies = {}) {\n // TODO(v5): Remove API\n reportOnce(\n `nodeModel.getAllNodes() is deprecated. Use nodeModel.findAll() with an empty query instead.`\n )\n const { type = `Node` } = args || {}\n\n let result\n if (type === `Node`) {\n result = getNodes()\n } else {\n const nodeTypeNames = toNodeTypeNames(this.schema, type)\n const nodesByType = nodeTypeNames.map(typeName =>\n getNodesByType(typeName)\n )\n const nodes = [].concat(...nodesByType)\n result = nodes.filter(Boolean)\n }\n\n if (result) {\n result.forEach(node => this.trackInlineObjectsInRootNode(node))\n }\n\n if (typeof pageDependencies.connectionType === `undefined`) {\n pageDependencies.connectionType =\n typeof type === `string` ? type : type.name\n }\n\n return wrapNodes(this.trackPageDependencies(result, pageDependencies))\n }\n\n /**\n * Get nodes of a type matching the specified query.\n *\n * @deprecated Since version 4.0 - Use nodeModel.findAll() or nodeModel.findOne() instead\n * @param {Object} args\n * @param {Object} args.query Query arguments (`filter` and `sort`)\n * @param {(string|GraphQLOutputType)} args.type Type\n * @param {boolean} [args.firstOnly] If true, return only first match\n * @param {PageDependencies} [pageDependencies]\n * @returns {Promise<Node[]>}\n */\n async runQuery(args, pageDependencies = {}) {\n // TODO(v5): Remove API\n reportOnce(\n `nodeModel.runQuery() is deprecated. Use nodeModel.findAll() or nodeModel.findOne() instead.`\n )\n if (args.firstOnly) {\n return this.findOne(args, pageDependencies)\n }\n const { skip, limit, ...query } = args.query\n const result = await this.findAll({ ...args, query }, pageDependencies)\n return Array.from(result.entries)\n }\n\n async _query(args) {\n const { query = {}, type, stats, tracer } = args || {}\n\n // We don't support querying union types (yet?), because the combined types\n // need not have any fields in common.\n const gqlType = typeof type === `string` ? this.schema.getType(type) : type\n invariant(\n !(gqlType instanceof GraphQLUnionType),\n `Querying GraphQLUnion types is not supported.`\n )\n\n const nodeTypeNames = toNodeTypeNames(this.schema, gqlType)\n\n let runQueryActivity\n\n // check if we can get node by id and skip\n // more expensive query pipeline\n if (\n typeof query?.filter?.id?.eq !== `undefined` &&\n Object.keys(query.filter).length === 1 &&\n Object.keys(query.filter.id).length === 1\n ) {\n if (tracer) {\n runQueryActivity = reporter.phantomActivity(`runQuerySimpleIdEq`, {\n parentSpan: tracer.getParentActivity().span,\n })\n runQueryActivity.start()\n }\n const nodeFoundById = this.getNodeById({\n id: query.filter.id.eq,\n type: gqlType,\n })\n\n if (runQueryActivity) {\n runQueryActivity.end()\n }\n\n return {\n gqlType,\n entries: new GatsbyIterable(nodeFoundById ? [nodeFoundById] : []),\n totalCount: async () => (nodeFoundById ? 1 : 0),\n }\n }\n\n let materializationActivity\n if (tracer) {\n materializationActivity = reporter.phantomActivity(`Materialization`, {\n parentSpan: tracer.getParentActivity().span,\n })\n materializationActivity.start()\n }\n const fields = getQueryFields({\n filter: query.filter,\n sort: query.sort,\n group: query.group,\n distinct: query.distinct,\n max: query.max,\n min: query.min,\n sum: query.sum,\n })\n\n const fieldsToResolve = determineResolvableFields(\n this.schemaComposer,\n this.schema,\n gqlType,\n fields,\n nodeTypeNames\n )\n\n for (const nodeTypeName of nodeTypeNames) {\n const gqlNodeType = this.schema.getType(nodeTypeName)\n await this.prepareNodes(gqlNodeType, fields, fieldsToResolve)\n }\n\n if (materializationActivity) {\n materializationActivity.end()\n }\n\n if (tracer) {\n runQueryActivity = reporter.phantomActivity(`runQuery`, {\n parentSpan: tracer.getParentActivity().span,\n })\n runQueryActivity.start()\n }\n\n const { entries, totalCount } = await getDataStore().runQuery({\n queryArgs: query,\n gqlSchema: this.schema,\n gqlComposer: this.schemaComposer,\n gqlType,\n resolvedFields: fieldsToResolve,\n nodeTypeNames,\n filtersCache: this._filtersCache,\n stats,\n })\n\n if (runQueryActivity) {\n runQueryActivity.end()\n }\n\n return {\n gqlType,\n entries: entries.map(node => {\n // With GatsbyIterable it happens lazily as we iterate\n this.trackInlineObjectsInRootNode(node)\n return node\n }),\n totalCount,\n }\n }\n\n /**\n * Get all nodes in the store, or all nodes of a specified type (optionally with limit/skip).\n * Returns slice of result as iterable and total count of nodes.\n *\n * @param {*} args\n * @param {Object} args.query Query arguments (e.g. `limit` and `skip`)\n * @param {(string|GraphQLOutputType)} args.type Type\n * @param {PageDependencies} [pageDependencies]\n * @return {Promise<Object>} Object containing `{ entries: GatsbyIterable, totalCount: () => Promise<number> }`\n */\n async findAll(args, pageDependencies = {}) {\n const { gqlType, ...result } = await this._query(args, pageDependencies)\n\n // Tracking connections by default:\n if (typeof pageDependencies.connectionType === `undefined`) {\n pageDependencies.connectionType = gqlType.name\n }\n this.trackPageDependencies(result.entries, pageDependencies)\n return {\n entries: wrapNodes(result.entries),\n totalCount: result.totalCount,\n }\n }\n\n /**\n * Get one node in the store. Only returns the first result.\n *\n * @param {*} args\n * @param {Object} args.query Query arguments (e.g. `filter`). Doesn't support `sort`, `limit`, `skip`.\n * @param {(string|GraphQLOutputType)} args.type Type\n * @param {PageDependencies} [pageDependencies]\n * @returns {Promise<Node>}\n */\n async findOne(args, pageDependencies = {}) {\n const { query = {} } = args\n if (query.sort?.fields?.length > 0) {\n // If we support sorting and return the first node based on sorting\n // we'll have to always track connection not an individual node\n throw new Error(\n `nodeModel.findOne() does not support sorting. Use nodeModel.findAll({ query: { limit: 1 } }) instead.`\n )\n }\n const { gqlType, entries } = await this._query({\n ...args,\n query: { ...query, skip: 0, limit: 1, sort: undefined },\n })\n const result = Array.from(entries)\n const first = result[0] ?? null\n\n if (!first) {\n // Couldn't find matching node.\n // This leads to a state where data tracking for this query gets empty.\n // It means we will NEVER re-run this query on any data updates\n // (even if a new node matching this query is added at some point).\n // To workaround this, we have to add a connection tracking to re-run\n // the query whenever any node of this type changes.\n pageDependencies.connectionType = gqlType.name\n }\n return wrapNode(this.trackPageDependencies(first, pageDependencies))\n }\n\n prepareNodes(type, queryFields, fieldsToResolve) {\n const typeName = type.name\n if (!this._prepareNodesQueues[typeName]) {\n this._prepareNodesQueues[typeName] = []\n }\n\n this._prepareNodesQueues[typeName].push({\n queryFields,\n fieldsToResolve,\n })\n\n if (!this._prepareNodesPromises[typeName]) {\n this._prepareNodesPromises[typeName] = new Promise(resolve => {\n process.nextTick(async () => {\n await this._doResolvePrepareNodesQueue(type)\n resolve()\n })\n })\n }\n\n return this._prepareNodesPromises[typeName]\n }\n\n async _doResolvePrepareNodesQueue(type) {\n const typeName = type.name\n const queue = this._prepareNodesQueues[typeName]\n this._prepareNodesQueues[typeName] = []\n this._prepareNodesPromises[typeName] = null\n\n const { queryFields, fieldsToResolve } = queue.reduce(\n (\n { queryFields, fieldsToResolve },\n { queryFields: nextQueryFields, fieldsToResolve: nextFieldsToResolve }\n ) => {\n return {\n queryFields: _.merge(queryFields, nextQueryFields),\n fieldsToResolve: _.merge(fieldsToResolve, nextFieldsToResolve),\n }\n },\n {\n queryFields: {},\n fieldsToResolve: {},\n }\n )\n\n const actualFieldsToResolve = deepObjectDifference(\n fieldsToResolve,\n this._preparedNodesCache.get(typeName) || {}\n )\n\n if (!_.isEmpty(actualFieldsToResolve)) {\n const resolvedNodes = new Map()\n for (const node of getDataStore().iterateNodesByType(typeName)) {\n this.trackInlineObjectsInRootNode(node)\n const resolvedFields = await resolveRecursive(\n this,\n this.schemaComposer,\n this.schema,\n node,\n type,\n queryFields,\n actualFieldsToResolve\n )\n if (!node.__gatsby_resolved) {\n node.__gatsby_resolved = {}\n }\n resolvedNodes.set(\n node.id,\n _.merge(node.__gatsby_resolved, resolvedFields)\n )\n }\n if (resolvedNodes.size) {\n await saveResolvedNodes(typeName, resolvedNodes)\n }\n this._preparedNodesCache.set(\n typeName,\n _.merge(\n {},\n this._preparedNodesCache.get(typeName) || {},\n actualFieldsToResolve\n )\n )\n }\n }\n\n /**\n * Get the names of all node types in the store.\n *\n * @returns {string[]}\n */\n getTypes() {\n return getTypes()\n }\n\n /**\n * Adds link between inline objects/arrays contained in Node object\n * and that Node object.\n * @param {Node} node Root Node\n */\n trackInlineObjectsInRootNode(node) {\n if (!this._trackedRootNodes.has(node)) {\n addRootNodeToInlineObject(\n this._rootNodeMap,\n node,\n node.id,\n true,\n new Set()\n )\n this._trackedRootNodes.add(node)\n }\n }\n\n /**\n * Finds top most ancestor of node that contains passed Object or Array\n * @param {(Object|Array)} obj Object/Array belonging to Node object or Node object\n * @param {nodePredicate} [predicate] Optional callback to check if ancestor meets defined conditions\n * @returns {Node} Top most ancestor if predicate is not specified\n * or first node that meet predicate conditions if predicate is specified\n */\n findRootNodeAncestor(obj, predicate = null) {\n let iterations = 0\n let node = obj\n\n while (iterations++ < 100) {\n if (predicate && predicate(node)) return node\n\n const parent = getNodeById(node.parent)\n const id = this._rootNodeMap.get(node)\n const trackedParent = getNodeById(id)\n\n if (!parent && !trackedParent) {\n const isMatchingRoot = !predicate || predicate(node)\n return isMatchingRoot ? node : null\n }\n\n node = parent || trackedParent\n }\n\n reporter.error(\n `It looks like you have a node that's set its parent as itself:\\n\\n` +\n node\n )\n return null\n }\n\n /**\n * Given a result, that's either a single node or an array of them, track them\n * using pageDependencies. Defaults to tracking according to current resolver\n * path. Returns the result back.\n *\n * @param {Node | Node[]} result\n * @param {PageDependencies} [pageDependencies]\n * @returns {Node | Node[]}\n */\n trackPageDependencies(result, pageDependencies = {}) {\n const { path, connectionType, track = true } = pageDependencies\n if (path && track) {\n if (connectionType) {\n this.createPageDependency({ path, connection: connectionType })\n } else {\n const nodes = isIterable(result) ? result : [result]\n for (const node of nodes) {\n if (node) {\n this.createPageDependency({ path, nodeId: node.id })\n }\n }\n }\n }\n\n return result\n }\n}\n\nclass ContextualNodeModel {\n constructor(rootNodeModel, context) {\n this.nodeModel = rootNodeModel\n this.context = context\n }\n\n withContext(context) {\n return new ContextualNodeModel(this.nodeModel, {\n ...this.context,\n ...context,\n })\n }\n\n _getFullDependencies(pageDependencies) {\n return {\n path: this.context.path,\n ...(pageDependencies || {}),\n }\n }\n\n getNodeById(args, pageDependencies) {\n return this.nodeModel.getNodeById(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n getNodesByIds(args, pageDependencies) {\n return this.nodeModel.getNodesByIds(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n getAllNodes(args, pageDependencies) {\n return this.nodeModel.getAllNodes(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n runQuery(args, pageDependencies) {\n return this.nodeModel.runQuery(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n findOne(args, pageDependencies) {\n return this.nodeModel.findOne(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n findAll(args, pageDependencies) {\n return this.nodeModel.findAll(\n args,\n this._getFullDependencies(pageDependencies)\n )\n }\n\n prepareNodes(...args) {\n return this.nodeModel.prepareNodes(...args)\n }\n\n getTypes(...args) {\n return this.nodeModel.getTypes(...args)\n }\n\n trackInlineObjectsInRootNode(...args) {\n return this.nodeModel.trackInlineObjectsInRootNode(...args)\n }\n\n findRootNodeAncestor(...args) {\n return this.nodeModel.findRootNodeAncestor(...args)\n }\n\n createPageDependency(...args) {\n return this.nodeModel.createPageDependency(...args)\n }\n\n trackPageDependencies(result, pageDependencies) {\n return this.nodeModel.trackPageDependencies(\n result,\n this._getFullDependencies(pageDependencies)\n )\n }\n}\n\nconst getNodeById = id => (id != null ? getNode(id) : null)\n\nconst toNodeTypeNames = (schema, gqlTypeName) => {\n const gqlType =\n typeof gqlTypeName === `string` ? schema.getType(gqlTypeName) : gqlTypeName\n\n if (!gqlType) return []\n\n const possibleTypes = isAbstractType(gqlType)\n ? schema.getPossibleTypes(gqlType)\n : [gqlType]\n\n return possibleTypes\n .filter(type => type.getInterfaces().some(iface => iface.name === `Node`))\n .map(type => type.name)\n}\n\nconst getQueryFields = ({ filter, sort, group, distinct, max, min, sum }) => {\n const filterFields = filter ? dropQueryOperators(filter) : {}\n const sortFields = (sort && sort.fields) || []\n\n if (group && !Array.isArray(group)) {\n group = [group]\n } else if (group == null) {\n group = []\n }\n\n if (distinct && !Array.isArray(distinct)) {\n distinct = [distinct]\n } else if (distinct == null) {\n distinct = []\n }\n\n if (max && !Array.isArray(max)) {\n max = [max]\n } else if (max == null) {\n max = []\n }\n\n if (min && !Array.isArray(min)) {\n min = [min]\n } else if (min == null) {\n min = []\n }\n\n if (sum && !Array.isArray(sum)) {\n sum = [sum]\n } else if (sum == null) {\n sum = []\n }\n\n return _.merge(\n filterFields,\n ...sortFields.map(pathToObject),\n ...group.map(pathToObject),\n ...distinct.map(pathToObject),\n ...max.map(pathToObject),\n ...min.map(pathToObject),\n ...sum.map(pathToObject)\n )\n}\n\nconst pathToObject = path => {\n if (path && typeof path === `string`) {\n return path.split(`.`).reduceRight((acc, key) => {\n return { [key]: acc }\n }, true)\n }\n return {}\n}\n\nconst dropQueryOperators = filter =>\n Object.keys(filter).reduce((acc, key) => {\n const value = filter[key]\n const k = Object.keys(value)[0]\n const v = value[k]\n if (_.isPlainObject(value) && _.isPlainObject(v)) {\n acc[key] =\n k === `elemMatch` ? dropQueryOperators(v) : dropQueryOperators(value)\n } else {\n acc[key] = true\n }\n return acc\n }, {})\n\nconst getFields = (schema, type, node) => {\n if (!isAbstractType(type)) {\n return type.getFields()\n }\n\n const concreteType = type.resolveType(node)\n return schema.getType(concreteType).getFields()\n}\n\nasync function resolveRecursive(\n nodeModel,\n schemaComposer,\n schema,\n node,\n type,\n queryFields,\n fieldsToResolve\n) {\n const gqlFields = getFields(schema, type, node)\n const resolvedFields = {}\n for (const fieldName of Object.keys(fieldsToResolve)) {\n const fieldToResolve = fieldsToResolve[fieldName]\n const queryField = queryFields[fieldName]\n const gqlField = gqlFields[fieldName]\n const gqlNonNullType = getNullableType(gqlField.type)\n const gqlFieldType = getNamedType(gqlField.type)\n let innerValue = await resolveField(\n nodeModel,\n schemaComposer,\n schema,\n node,\n gqlField,\n fieldName\n )\n if (gqlField && innerValue != null) {\n if (\n isCompositeType(gqlFieldType) &&\n !(gqlNonNullType instanceof GraphQLList)\n ) {\n innerValue = await resolveRecursive(\n nodeModel,\n schemaComposer,\n schema,\n innerValue,\n gqlFieldType,\n queryField,\n _.isObject(fieldToResolve) ? fieldToResolve : queryField\n )\n } else if (\n isCompositeType(gqlFieldType) &&\n (_.isArray(innerValue) || innerValue instanceof GatsbyIterable) &&\n gqlNonNullType instanceof GraphQLList\n ) {\n innerValue = await Promise.all(\n innerValue.map(item =>\n item == null\n ? item\n : resolveRecursive(\n nodeModel,\n schemaComposer,\n schema,\n item,\n gqlFieldType,\n queryField,\n _.isObject(fieldToResolve) ? fieldToResolve : queryField\n )\n )\n )\n }\n }\n if (innerValue != null) {\n resolvedFields[fieldName] = innerValue\n }\n }\n\n for (const fieldName of Object.keys(queryFields)) {\n if (!fieldsToResolve[fieldName] && node[fieldName]) {\n // It is possible that this field still has a custom resolver\n // See https://github.com/gatsbyjs/gatsby/issues/27368\n resolvedFields[fieldName] = await resolveField(\n nodeModel,\n schemaComposer,\n schema,\n node,\n gqlFields[fieldName],\n fieldName\n )\n }\n }\n\n return _.pickBy(resolvedFields, (value, key) => queryFields[key])\n}\n\nfunction resolveField(\n nodeModel,\n schemaComposer,\n schema,\n node,\n gqlField,\n fieldName\n) {\n if (!gqlField?.resolve) {\n return node[fieldName]\n }\n const withResolverContext = require(`./context`)\n return gqlField.resolve(\n node,\n gqlField.args.reduce((acc, arg) => {\n acc[arg.name] = arg.defaultValue\n return acc\n }, {}),\n withResolverContext({\n schema,\n schemaComposer,\n nodeModel,\n }),\n {\n fieldName,\n schema,\n returnType: gqlField.type,\n }\n )\n}\n\nconst determineResolvableFields = (\n schemaComposer,\n schema,\n type,\n fields,\n nodeTypeNames,\n isNestedType = false\n) => {\n const fieldsToResolve = {}\n const gqlFields = type.getFields()\n Object.keys(fields).forEach(fieldName => {\n const field = fields[fieldName]\n const gqlField = gqlFields[fieldName]\n const gqlFieldType = getNamedType(gqlField.type)\n const typeComposer = schemaComposer.getAnyTC(type.name)\n const possibleTCs = [\n typeComposer,\n ...nodeTypeNames.map(name => schemaComposer.getAnyTC(name)),\n ]\n let needsResolve = false\n for (const tc of possibleTCs) {\n needsResolve = tc.getFieldExtension(fieldName, `needsResolve`) || false\n if (needsResolve) {\n break\n }\n }\n\n if (_.isObject(field) && gqlField) {\n const innerResolved = determineResolvableFields(\n schemaComposer,\n schema,\n gqlFieldType,\n field,\n toNodeTypeNames(schema, gqlFieldType),\n true\n )\n if (!_.isEmpty(innerResolved)) {\n fieldsToResolve[fieldName] = innerResolved\n }\n }\n\n if (!fieldsToResolve[fieldName] && needsResolve) {\n fieldsToResolve[fieldName] = true\n }\n if (!fieldsToResolve[fieldName] && isNestedType) {\n // If parent field needs to be resolved - all nested fields should be added as well\n // See https://github.com/gatsbyjs/gatsby/issues/26056\n fieldsToResolve[fieldName] = true\n }\n })\n return fieldsToResolve\n}\n\nconst addRootNodeToInlineObject = (\n rootNodeMap,\n data,\n nodeId,\n isNode /* : boolean */,\n path /* : Set<mixed> */\n) /* : void */ => {\n const isPlainObject = _.isPlainObject(data)\n\n if (isPlainObject || _.isArray(data)) {\n if (path.has(data)) return\n path.add(data)\n\n _.each(data, (o, key) => {\n if (!isNode || key !== `internal`) {\n addRootNodeToInlineObject(rootNodeMap, o, nodeId, false, path)\n }\n })\n\n // don't need to track node itself\n if (!isNode) {\n rootNodeMap.set(data, nodeId)\n }\n }\n}\n\nconst saveResolvedNodes = async (typeName, resolvedNodes) => {\n store.dispatch({\n type: `SET_RESOLVED_NODES`,\n payload: {\n key: typeName,\n nodes: resolvedNodes,\n },\n })\n}\n\nconst deepObjectDifference = (from, to) => {\n const result = {}\n Object.keys(from).forEach(key => {\n const toValue = to[key]\n if (toValue) {\n if (_.isPlainObject(toValue)) {\n const deepResult = deepObjectDifference(from[key], toValue)\n if (!_.isEmpty(deepResult)) {\n result[key] = deepResult\n }\n }\n } else {\n result[key] = from[key]\n }\n })\n return result\n}\n\nmodule.exports = {\n LocalNodeModel,\n}\n"],"file":"node-model.js"}
|
|
@@ -36,15 +36,17 @@ const getCustomOptions = stage => {
|
|
|
36
36
|
|
|
37
37
|
const configItemsMemoCache = new Map();
|
|
38
38
|
|
|
39
|
-
const prepareOptions = (babel,
|
|
39
|
+
const prepareOptions = (babel, customOptions = {}, resolve = require.resolve) => {
|
|
40
40
|
const {
|
|
41
41
|
stage,
|
|
42
42
|
reactRuntime,
|
|
43
|
-
reactImportSource
|
|
44
|
-
|
|
43
|
+
reactImportSource,
|
|
44
|
+
isPageTemplate
|
|
45
|
+
} = customOptions;
|
|
46
|
+
const configItemsMemoCacheKey = `${stage}-${isPageTemplate}`;
|
|
45
47
|
|
|
46
|
-
if (configItemsMemoCache.has(
|
|
47
|
-
return configItemsMemoCache.get(
|
|
48
|
+
if (configItemsMemoCache.has(configItemsMemoCacheKey)) {
|
|
49
|
+
return configItemsMemoCache.get(configItemsMemoCacheKey);
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
const pluginBabelConfig = loadCachedConfig(); // Required plugins/presets
|
|
@@ -56,7 +58,7 @@ const prepareOptions = (babel, options = {}, resolve = require.resolve) => {
|
|
|
56
58
|
type: `plugin`
|
|
57
59
|
})];
|
|
58
60
|
|
|
59
|
-
if ("4" === `4` && (stage === `develop` || stage === `build-javascript`)) {
|
|
61
|
+
if ("4" === `4` && (stage === `develop` || stage === `build-javascript`) && isPageTemplate) {
|
|
60
62
|
requiredPlugins.push(babel.createConfigItem([resolve(`./babel/babel-plugin-remove-api`), {
|
|
61
63
|
apis: [`getServerData`, `config`]
|
|
62
64
|
}], {
|
|
@@ -103,7 +105,7 @@ const prepareOptions = (babel, options = {}, resolve = require.resolve) => {
|
|
|
103
105
|
}));
|
|
104
106
|
});
|
|
105
107
|
const toReturn = [reduxPresets, reduxPlugins, requiredPresets, requiredPlugins, fallbackPresets];
|
|
106
|
-
configItemsMemoCache.set(
|
|
108
|
+
configItemsMemoCache.set(configItemsMemoCacheKey, toReturn);
|
|
107
109
|
return toReturn;
|
|
108
110
|
};
|
|
109
111
|
|