@tinacms/cli 0.0.0-a318f2f-20241010063440 → 0.0.0-a4e58da-20250221000426
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cmds/forestry-migrate/util/index.d.ts +1 -1
- package/dist/index.js +440 -160
- package/dist/next/commands/build-command/index.d.ts +11 -1
- package/dist/next/commands/dev-command/index.d.ts +4 -2
- package/dist/next/commands/dev-command/server/index.d.ts +1 -1
- package/dist/next/config-manager.d.ts +6 -1
- package/dist/next/vite/index.d.ts +1 -1
- package/dist/next/vite/plugins.d.ts +2 -1
- package/dist/server/server.d.ts +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/package.json +24 -24
package/dist/index.js
CHANGED
|
@@ -17,23 +17,28 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
19
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
24
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
25
|
mod
|
|
22
26
|
));
|
|
23
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
24
28
|
|
|
25
29
|
// src/index.ts
|
|
26
|
-
var
|
|
27
|
-
__export(
|
|
28
|
-
default: () =>
|
|
30
|
+
var index_exports = {};
|
|
31
|
+
__export(index_exports, {
|
|
32
|
+
default: () => index_default
|
|
29
33
|
});
|
|
30
|
-
module.exports = __toCommonJS(
|
|
34
|
+
module.exports = __toCommonJS(index_exports);
|
|
31
35
|
var import_clipanion8 = require("clipanion");
|
|
32
36
|
|
|
33
37
|
// package.json
|
|
34
|
-
var version = "1.
|
|
38
|
+
var version = "1.9.0";
|
|
35
39
|
|
|
36
40
|
// src/next/commands/dev-command/index.ts
|
|
41
|
+
var import_async_lock = __toESM(require("async-lock"));
|
|
37
42
|
var import_clipanion2 = require("clipanion");
|
|
38
43
|
var import_fs_extra6 = __toESM(require("fs-extra"));
|
|
39
44
|
var import_path5 = __toESM(require("path"));
|
|
@@ -57,7 +62,10 @@ function isUnicodeSupported() {
|
|
|
57
62
|
if (process.platform !== "win32") {
|
|
58
63
|
return process.env.TERM !== "linux";
|
|
59
64
|
}
|
|
60
|
-
return Boolean(process.env.CI) || Boolean(process.env.WT_SESSION) ||
|
|
65
|
+
return Boolean(process.env.CI) || Boolean(process.env.WT_SESSION) || // Windows Terminal
|
|
66
|
+
Boolean(process.env.TERMINUS_SUBLIME) || // Terminus (<0.2.27)
|
|
67
|
+
process.env.ConEmuTask === "{cmd::Cmder}" || // ConEmu and cmder
|
|
68
|
+
process.env.TERM_PROGRAM === "Terminus-Sublime" || process.env.TERM_PROGRAM === "vscode" || process.env.TERM === "xterm-256color" || process.env.TERM === "alacritty" || process.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
|
|
61
69
|
}
|
|
62
70
|
|
|
63
71
|
// src/logger/index.ts
|
|
@@ -212,7 +220,7 @@ var ConfigManager = class {
|
|
|
212
220
|
this.generatedCachePath = import_path.default.join(
|
|
213
221
|
this.generatedFolderPath,
|
|
214
222
|
".cache",
|
|
215
|
-
String(new Date().getTime())
|
|
223
|
+
String((/* @__PURE__ */ new Date()).getTime())
|
|
216
224
|
);
|
|
217
225
|
this.generatedGraphQLGQLPath = import_path.default.join(
|
|
218
226
|
this.generatedFolderPath,
|
|
@@ -355,17 +363,22 @@ var ConfigManager = class {
|
|
|
355
363
|
);
|
|
356
364
|
}
|
|
357
365
|
getTinaGraphQLVersion() {
|
|
358
|
-
var _a, _b;
|
|
359
366
|
if (this.tinaGraphQLVersionFromCLI) {
|
|
360
|
-
|
|
367
|
+
const version2 = this.tinaGraphQLVersionFromCLI.split(".");
|
|
368
|
+
return {
|
|
369
|
+
fullVersion: this.tinaGraphQLVersionFromCLI,
|
|
370
|
+
major: version2[0] || "x",
|
|
371
|
+
minor: version2[1] || "x",
|
|
372
|
+
patch: version2[2] || "x"
|
|
373
|
+
};
|
|
361
374
|
}
|
|
362
375
|
const generatedSchema = import_fs_extra.default.readJSONSync(this.generatedSchemaJSONPath);
|
|
363
|
-
if (!generatedSchema || !(typeof (generatedSchema == null ? void 0 : generatedSchema.version) !== "undefined")
|
|
376
|
+
if (!generatedSchema || !(typeof (generatedSchema == null ? void 0 : generatedSchema.version) !== "undefined")) {
|
|
364
377
|
throw new Error(
|
|
365
378
|
`Can not find Tina GraphQL version in ${this.generatedSchemaJSONPath}`
|
|
366
379
|
);
|
|
367
380
|
}
|
|
368
|
-
return
|
|
381
|
+
return generatedSchema.version;
|
|
369
382
|
}
|
|
370
383
|
printGeneratedClientFilePath() {
|
|
371
384
|
if (this.isUsingTs()) {
|
|
@@ -394,6 +407,9 @@ var ConfigManager = class {
|
|
|
394
407
|
}
|
|
395
408
|
throw `No path provided to print`;
|
|
396
409
|
}
|
|
410
|
+
/**
|
|
411
|
+
* Given a filepath without an extension, find the first match (eg. tsx, ts, jsx, js)
|
|
412
|
+
*/
|
|
397
413
|
async getPathWithExtension(filepath) {
|
|
398
414
|
const extensions = ["tsx", "ts", "jsx", "js"];
|
|
399
415
|
let result;
|
|
@@ -427,7 +443,10 @@ var ConfigManager = class {
|
|
|
427
443
|
}
|
|
428
444
|
async loadConfigFile(generatedFolderPath, configFilePath) {
|
|
429
445
|
const tmpdir = import_path.default.join(import_os.default.tmpdir(), Date.now().toString());
|
|
430
|
-
const
|
|
446
|
+
const preBuildConfigPath = import_path.default.join(
|
|
447
|
+
this.generatedFolderPath,
|
|
448
|
+
"config.prebuild.jsx"
|
|
449
|
+
);
|
|
431
450
|
const outfile = import_path.default.join(tmpdir, "config.build.jsx");
|
|
432
451
|
const outfile2 = import_path.default.join(tmpdir, "config.build.js");
|
|
433
452
|
const tempTSConfigFile = import_path.default.join(tmpdir, "tsconfig.json");
|
|
@@ -441,7 +460,7 @@ var ConfigManager = class {
|
|
|
441
460
|
logLevel: "silent",
|
|
442
461
|
packages: "external",
|
|
443
462
|
ignoreAnnotations: true,
|
|
444
|
-
outfile:
|
|
463
|
+
outfile: preBuildConfigPath,
|
|
445
464
|
loader: loaders,
|
|
446
465
|
metafile: true
|
|
447
466
|
});
|
|
@@ -464,6 +483,7 @@ var ConfigManager = class {
|
|
|
464
483
|
await esbuild.build({
|
|
465
484
|
entryPoints: [outfile],
|
|
466
485
|
bundle: true,
|
|
486
|
+
// Suppress warning about comparison with -0 from client module
|
|
467
487
|
logLevel: "silent",
|
|
468
488
|
platform: "node",
|
|
469
489
|
outfile: outfile2,
|
|
@@ -481,7 +501,7 @@ var ConfigManager = class {
|
|
|
481
501
|
import_fs_extra.default.removeSync(outfile2);
|
|
482
502
|
return {
|
|
483
503
|
config: result.default,
|
|
484
|
-
prebuildPath:
|
|
504
|
+
prebuildPath: preBuildConfigPath,
|
|
485
505
|
watchList: flattenedList
|
|
486
506
|
};
|
|
487
507
|
}
|
|
@@ -570,19 +590,19 @@ var devHTML = (port) => `<!DOCTYPE html>
|
|
|
570
590
|
window.$RefreshReg$ = () => {}
|
|
571
591
|
window.$RefreshSig$ = () => (type) => type
|
|
572
592
|
window.__vite_plugin_react_preamble_installed__ = true
|
|
573
|
-
|
|
574
|
-
<script type="module" src="http://localhost:${port}/@vite/client"
|
|
593
|
+
</script>
|
|
594
|
+
<script type="module" src="http://localhost:${port}/@vite/client"></script>
|
|
575
595
|
<script>
|
|
576
596
|
function handleLoadError() {
|
|
577
597
|
// Assets have failed to load
|
|
578
598
|
document.getElementById('root').innerHTML = '${errorHTML}';
|
|
579
599
|
}
|
|
580
|
-
|
|
600
|
+
</script>
|
|
581
601
|
<script
|
|
582
602
|
type="module"
|
|
583
603
|
src="http://localhost:${port}/src/main.tsx"
|
|
584
604
|
onerror="handleLoadError()"
|
|
585
|
-
|
|
605
|
+
></script>
|
|
586
606
|
<body class="tina-tailwind">
|
|
587
607
|
<div id="root"></div>
|
|
588
608
|
</body>
|
|
@@ -628,6 +648,7 @@ var import_defaultTheme = __toESM(require("tailwindcss/defaultTheme.js"));
|
|
|
628
648
|
var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
629
649
|
return {
|
|
630
650
|
name: "vite-plugin-tina",
|
|
651
|
+
// @ts-ignore
|
|
631
652
|
config: (viteConfig) => {
|
|
632
653
|
const plugins = [];
|
|
633
654
|
const content = [
|
|
@@ -939,7 +960,6 @@ async function listFilesRecursively({
|
|
|
939
960
|
}
|
|
940
961
|
var createConfig = async ({
|
|
941
962
|
configManager,
|
|
942
|
-
database,
|
|
943
963
|
apiURL,
|
|
944
964
|
plugins = [],
|
|
945
965
|
noWatch,
|
|
@@ -999,6 +1019,8 @@ var createConfig = async ({
|
|
|
999
1019
|
if (configManager.config.build.basePath) {
|
|
1000
1020
|
basePath = configManager.config.build.basePath;
|
|
1001
1021
|
}
|
|
1022
|
+
const fullVersion = configManager.getTinaGraphQLVersion();
|
|
1023
|
+
const version2 = `${fullVersion.major}.${fullVersion.minor}`;
|
|
1002
1024
|
const config2 = {
|
|
1003
1025
|
root: configManager.spaRootPath,
|
|
1004
1026
|
base: `/${basePath ? `${(0, import_normalize_path2.default)(basePath)}/` : ""}${(0, import_normalize_path2.default)(
|
|
@@ -1010,15 +1032,33 @@ var createConfig = async ({
|
|
|
1010
1032
|
dedupe: ["graphql", "tinacms", "react", "react-dom", "react-router-dom"]
|
|
1011
1033
|
},
|
|
1012
1034
|
define: {
|
|
1035
|
+
/**
|
|
1036
|
+
* Since we prebuild the config.ts, it's possible for modules to be loaded which make
|
|
1037
|
+
* use of `process`. The main scenario where this is an issue is when co-locating schema
|
|
1038
|
+
* definitions with source files, and specifically source files which impor from NextJS.
|
|
1039
|
+
*
|
|
1040
|
+
* Some examples of what NextJS uses for `process.env` are:
|
|
1041
|
+
* - `process.env.__NEXT_TRAILING_SLASH`
|
|
1042
|
+
* - `process.env.__NEXT_CROSS_ORIGIN`
|
|
1043
|
+
* - `process.env.__NEXT_I18N_SUPPORT`
|
|
1044
|
+
*
|
|
1045
|
+
* Also, interestingly some of the advice for handling this doesn't work, references to replacing
|
|
1046
|
+
* `process.env` with `{}` are problematic, because browsers don't understand the `{}.` syntax,
|
|
1047
|
+
* but node does. This was a surprise, but using `new Object()` seems to do the trick.
|
|
1048
|
+
*/
|
|
1013
1049
|
"process.env": `new Object(${JSON.stringify(publicEnv)})`,
|
|
1050
|
+
// Used by picomatch https://github.com/micromatch/picomatch/blob/master/lib/utils.js#L4
|
|
1014
1051
|
"process.platform": `"${process.platform}"`,
|
|
1015
1052
|
__API_URL__: `"${apiURL}"`,
|
|
1016
1053
|
__BASE_PATH__: `"${((_e = (_d = configManager.config) == null ? void 0 : _d.build) == null ? void 0 : _e.basePath) || ""}"`,
|
|
1017
|
-
__TINA_GRAPHQL_VERSION__:
|
|
1054
|
+
__TINA_GRAPHQL_VERSION__: version2
|
|
1018
1055
|
},
|
|
1019
1056
|
logLevel: "error",
|
|
1057
|
+
// Vite import warnings are noisy
|
|
1020
1058
|
optimizeDeps: {
|
|
1021
1059
|
force: true,
|
|
1060
|
+
// Not 100% sure why this isn't being picked up automatically, this works from within the monorepo
|
|
1061
|
+
// but breaks externally
|
|
1022
1062
|
include: ["react/jsx-runtime", "react/jsx-dev-runtime"]
|
|
1023
1063
|
},
|
|
1024
1064
|
server: {
|
|
@@ -1026,6 +1066,7 @@ var createConfig = async ({
|
|
|
1026
1066
|
watch: noWatch ? {
|
|
1027
1067
|
ignored: ["**/*"]
|
|
1028
1068
|
} : {
|
|
1069
|
+
// Ignore everything except for the alias fields we specified above
|
|
1029
1070
|
ignored: [
|
|
1030
1071
|
`${configManager.tinaFolderPath}/**/!(config.prebuild.jsx|_graphql.json)`
|
|
1031
1072
|
]
|
|
@@ -1041,8 +1082,13 @@ var createConfig = async ({
|
|
|
1041
1082
|
rollupOptions
|
|
1042
1083
|
},
|
|
1043
1084
|
plugins: [
|
|
1085
|
+
/**
|
|
1086
|
+
* `splitVendorChunkPlugin` is needed because `tinacms` is quite large,
|
|
1087
|
+
* Vite's chunking strategy chokes on memory issues for smaller machines (ie. on CI).
|
|
1088
|
+
*/
|
|
1044
1089
|
(0, import_plugin_react.default)({
|
|
1045
1090
|
babel: {
|
|
1091
|
+
// Supresses the warning [NOTE] babel The code generator has deoptimised the styling of
|
|
1046
1092
|
compact: true
|
|
1047
1093
|
}
|
|
1048
1094
|
}),
|
|
@@ -1119,8 +1165,7 @@ var createMediaRouter = (config2) => {
|
|
|
1119
1165
|
};
|
|
1120
1166
|
var parseMediaFolder = (str) => {
|
|
1121
1167
|
let returnString = str;
|
|
1122
|
-
if (returnString.startsWith("/"))
|
|
1123
|
-
returnString = returnString.substr(1);
|
|
1168
|
+
if (returnString.startsWith("/")) returnString = returnString.substr(1);
|
|
1124
1169
|
if (returnString.endsWith("/"))
|
|
1125
1170
|
returnString = returnString.substr(0, returnString.length - 1);
|
|
1126
1171
|
return returnString;
|
|
@@ -1285,7 +1330,8 @@ var devServerEndPointsPlugin = ({
|
|
|
1285
1330
|
configManager,
|
|
1286
1331
|
apiURL,
|
|
1287
1332
|
database,
|
|
1288
|
-
searchIndex
|
|
1333
|
+
searchIndex,
|
|
1334
|
+
databaseLock
|
|
1289
1335
|
}) => {
|
|
1290
1336
|
const plug = {
|
|
1291
1337
|
name: "graphql-endpoints",
|
|
@@ -1329,14 +1375,17 @@ var devServerEndPointsPlugin = ({
|
|
|
1329
1375
|
}
|
|
1330
1376
|
if (req.url === "/graphql") {
|
|
1331
1377
|
const { query, variables } = req.body;
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1378
|
+
let result;
|
|
1379
|
+
await databaseLock(async () => {
|
|
1380
|
+
result = await (0, import_graphql.resolve)({
|
|
1381
|
+
config: {
|
|
1382
|
+
useRelativeMedia: true
|
|
1383
|
+
},
|
|
1384
|
+
database,
|
|
1385
|
+
query,
|
|
1386
|
+
variables,
|
|
1387
|
+
verbose: false
|
|
1388
|
+
});
|
|
1340
1389
|
});
|
|
1341
1390
|
res.end(JSON.stringify(result));
|
|
1342
1391
|
return;
|
|
@@ -1387,6 +1436,7 @@ function viteTransformExtension({
|
|
|
1387
1436
|
return {
|
|
1388
1437
|
code: res.code,
|
|
1389
1438
|
map: null
|
|
1439
|
+
// TODO:
|
|
1390
1440
|
};
|
|
1391
1441
|
}
|
|
1392
1442
|
}
|
|
@@ -1394,10 +1444,16 @@ function viteTransformExtension({
|
|
|
1394
1444
|
}
|
|
1395
1445
|
|
|
1396
1446
|
// src/next/commands/dev-command/server/index.ts
|
|
1397
|
-
var createDevServer = async (configManager, database, searchIndex, apiURL, noWatch) => {
|
|
1447
|
+
var createDevServer = async (configManager, database, searchIndex, apiURL, noWatch, databaseLock) => {
|
|
1398
1448
|
const plugins = [
|
|
1399
1449
|
transformTsxPlugin({ configManager }),
|
|
1400
|
-
devServerEndPointsPlugin({
|
|
1450
|
+
devServerEndPointsPlugin({
|
|
1451
|
+
apiURL,
|
|
1452
|
+
configManager,
|
|
1453
|
+
database,
|
|
1454
|
+
searchIndex,
|
|
1455
|
+
databaseLock
|
|
1456
|
+
}),
|
|
1401
1457
|
viteTransformExtension()
|
|
1402
1458
|
];
|
|
1403
1459
|
return (0, import_vite3.createServer)(
|
|
@@ -1407,6 +1463,14 @@ var createDevServer = async (configManager, database, searchIndex, apiURL, noWat
|
|
|
1407
1463
|
apiURL,
|
|
1408
1464
|
plugins,
|
|
1409
1465
|
noWatch,
|
|
1466
|
+
/**
|
|
1467
|
+
* Ensure Vite's import scan uses the spaMainPath as the input
|
|
1468
|
+
* so it properly finds everything. This is for dev only, and when
|
|
1469
|
+
* running the server outside of this monorepo vite fails to find
|
|
1470
|
+
* and optimize the imports, so you get errors about it not being
|
|
1471
|
+
* able to find an export from a module, and it's always a CJS
|
|
1472
|
+
* module that Vite would usually transform to an ES module.
|
|
1473
|
+
*/
|
|
1410
1474
|
rollupOptions: {
|
|
1411
1475
|
input: configManager.spaMainPath,
|
|
1412
1476
|
onwarn(warning, warn) {
|
|
@@ -1532,6 +1596,7 @@ var GenericSdkVisitor = class extends import_visitor_plugin_common.ClientSideBas
|
|
|
1532
1596
|
node,
|
|
1533
1597
|
documentVariableName,
|
|
1534
1598
|
operationType,
|
|
1599
|
+
// This is the only line that is different
|
|
1535
1600
|
operationResultType: `{data: ${operationResultType}, errors?: { message: string, locations: { line: number, column: number }[], path: string[] }[], variables: ${operationVariablesTypes}, query: string}`,
|
|
1536
1601
|
operationVariablesTypes
|
|
1537
1602
|
});
|
|
@@ -1580,6 +1645,8 @@ var plugin = (schema, documents, config2) => {
|
|
|
1580
1645
|
const visitor = new GenericSdkVisitor(schema, allFragments, config2);
|
|
1581
1646
|
const visitorResult = (0, import_graphql3.visit)(allAst, { leave: visitor });
|
|
1582
1647
|
return {
|
|
1648
|
+
// We will take care of imports
|
|
1649
|
+
// prepend: visitor.getImports(),
|
|
1583
1650
|
content: [
|
|
1584
1651
|
visitor.fragments,
|
|
1585
1652
|
...visitorResult.definitions.filter((t) => typeof t === "string"),
|
|
@@ -1595,6 +1662,7 @@ var generateTypes = async (schema, queryPathGlob = process.cwd(), fragDocPath =
|
|
|
1595
1662
|
docs = await loadGraphQLDocuments(queryPathGlob);
|
|
1596
1663
|
fragDocs = await loadGraphQLDocuments(fragDocPath);
|
|
1597
1664
|
const res = await (0, import_core.codegen)({
|
|
1665
|
+
// Filename is not used. This is because the typescript plugin returns a string instead of writing to a file.
|
|
1598
1666
|
filename: process.cwd(),
|
|
1599
1667
|
schema: (0, import_graphql5.parse)((0, import_graphql5.printSchema)(schema)),
|
|
1600
1668
|
documents: [...docs, ...fragDocs],
|
|
@@ -1629,9 +1697,12 @@ var loadGraphQLDocuments = async (globPath) => {
|
|
|
1629
1697
|
loaders: [new import_graphql_file_loader.GraphQLFileLoader()]
|
|
1630
1698
|
});
|
|
1631
1699
|
} catch (e) {
|
|
1632
|
-
if (
|
|
1633
|
-
|
|
1634
|
-
|
|
1700
|
+
if (
|
|
1701
|
+
// https://www.graphql-tools.com/docs/documents-loading#no-files-found
|
|
1702
|
+
(e.message || "").includes(
|
|
1703
|
+
"Unable to find any GraphQL type definitions for the following pointers:"
|
|
1704
|
+
)
|
|
1705
|
+
) {
|
|
1635
1706
|
} else {
|
|
1636
1707
|
throw e;
|
|
1637
1708
|
}
|
|
@@ -1788,16 +1859,14 @@ var Codegen = class {
|
|
|
1788
1859
|
const branch = (_a = this.configManager.config) == null ? void 0 : _a.branch;
|
|
1789
1860
|
const clientId = (_b = this.configManager.config) == null ? void 0 : _b.clientId;
|
|
1790
1861
|
const token = (_c = this.configManager.config) == null ? void 0 : _c.token;
|
|
1791
|
-
const
|
|
1862
|
+
const fullVersion = this.configManager.getTinaGraphQLVersion();
|
|
1863
|
+
const version2 = `${fullVersion.major}.${fullVersion.minor}`;
|
|
1792
1864
|
const baseUrl = ((_d = this.configManager.config.tinaioConfig) == null ? void 0 : _d.contentApiUrlOverride) || `https://${TINA_HOST}`;
|
|
1793
1865
|
if ((!branch || !clientId || !token) && !this.port && !this.configManager.config.contentApiUrlOverride) {
|
|
1794
1866
|
const missing = [];
|
|
1795
|
-
if (!branch)
|
|
1796
|
-
|
|
1797
|
-
if (!
|
|
1798
|
-
missing.push("clientId");
|
|
1799
|
-
if (!token)
|
|
1800
|
-
missing.push("token");
|
|
1867
|
+
if (!branch) missing.push("branch");
|
|
1868
|
+
if (!clientId) missing.push("clientId");
|
|
1869
|
+
if (!token) missing.push("token");
|
|
1801
1870
|
throw new Error(
|
|
1802
1871
|
`Client not configured properly. Missing ${missing.join(
|
|
1803
1872
|
", "
|
|
@@ -1951,7 +2020,11 @@ schema {
|
|
|
1951
2020
|
}
|
|
1952
2021
|
};
|
|
1953
2022
|
var maybeWarnFragmentSize = async (filepath) => {
|
|
1954
|
-
if (
|
|
2023
|
+
if (
|
|
2024
|
+
// is the file bigger than 100kb?
|
|
2025
|
+
(await import_fs_extra4.default.stat(filepath)).size > // convert to 100 kb to bytes
|
|
2026
|
+
100 * 1024
|
|
2027
|
+
) {
|
|
1955
2028
|
console.warn(
|
|
1956
2029
|
"Warning: frags.gql is very large (>100kb). Consider setting the reference depth to 1 or 0. See code snippet below."
|
|
1957
2030
|
);
|
|
@@ -1979,6 +2052,7 @@ var import_many_level = require("many-level");
|
|
|
1979
2052
|
var import_memory_level = require("memory-level");
|
|
1980
2053
|
var createDBServer = (port) => {
|
|
1981
2054
|
const levelHost = new import_many_level.ManyLevelHost(
|
|
2055
|
+
// @ts-ignore
|
|
1982
2056
|
new import_memory_level.MemoryLevel({
|
|
1983
2057
|
valueEncoding: "json"
|
|
1984
2058
|
})
|
|
@@ -2129,7 +2203,9 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
2129
2203
|
let subProc;
|
|
2130
2204
|
if (this.subCommand) {
|
|
2131
2205
|
subProc = await startSubprocess2({ command: this.subCommand });
|
|
2132
|
-
logger.info(
|
|
2206
|
+
logger.info(
|
|
2207
|
+
`Running web application with command: ${import_chalk4.default.cyan(this.subCommand)}`
|
|
2208
|
+
);
|
|
2133
2209
|
}
|
|
2134
2210
|
function exitHandler(options, exitCode) {
|
|
2135
2211
|
if (subProc) {
|
|
@@ -2209,7 +2285,7 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
2209
2285
|
pathFilter
|
|
2210
2286
|
});
|
|
2211
2287
|
const tinaPathUpdates = modified.filter(
|
|
2212
|
-
(
|
|
2288
|
+
(path14) => path14.startsWith(".tina/__generated__/_schema.json") || path14.startsWith("tina/tina-lock.json")
|
|
2213
2289
|
);
|
|
2214
2290
|
if (tinaPathUpdates.length > 0) {
|
|
2215
2291
|
res = await database.indexContent({
|
|
@@ -2253,6 +2329,7 @@ var import_search = require("@tinacms/search");
|
|
|
2253
2329
|
var DevCommand = class extends BaseCommand {
|
|
2254
2330
|
constructor() {
|
|
2255
2331
|
super(...arguments);
|
|
2332
|
+
// NOTE: camelCase commands for string options don't work if there's an `=` used https://github.com/arcanis/clipanion/issues/141
|
|
2256
2333
|
this.watchFolders = import_clipanion2.Option.String("-w,--watchFolders", {
|
|
2257
2334
|
description: "DEPRECATED - a list of folders (relative to where this is being run) that the cli will watch for changes"
|
|
2258
2335
|
});
|
|
@@ -2262,6 +2339,7 @@ var DevCommand = class extends BaseCommand {
|
|
|
2262
2339
|
this.outputSearchIndexPath = import_clipanion2.Option.String("--outputSearchIndexPath", {
|
|
2263
2340
|
description: "Path to write the search index to"
|
|
2264
2341
|
});
|
|
2342
|
+
this.indexingLock = new import_async_lock.default();
|
|
2265
2343
|
}
|
|
2266
2344
|
async catch(error) {
|
|
2267
2345
|
logger.error("Error occured during tinacms dev");
|
|
@@ -2282,10 +2360,13 @@ var DevCommand = class extends BaseCommand {
|
|
|
2282
2360
|
rootPath: this.rootPath,
|
|
2283
2361
|
legacyNoSDK: this.noSDK
|
|
2284
2362
|
});
|
|
2285
|
-
logger.info("
|
|
2363
|
+
logger.info("\u{1F999} TinaCMS Dev Server is initializing...");
|
|
2286
2364
|
this.logDeprecationWarnings();
|
|
2287
2365
|
createDBServer(Number(this.datalayerPort));
|
|
2288
2366
|
let database = null;
|
|
2367
|
+
const dbLock = async (fn) => {
|
|
2368
|
+
return this.indexingLock.acquire("Key", fn);
|
|
2369
|
+
};
|
|
2289
2370
|
const setup = async ({ firstTime }) => {
|
|
2290
2371
|
try {
|
|
2291
2372
|
await configManager.processConfig();
|
|
@@ -2336,9 +2417,6 @@ var DevCommand = class extends BaseCommand {
|
|
|
2336
2417
|
await import_fs_extra6.default.outputFile(filePath, tinaLockContent);
|
|
2337
2418
|
}
|
|
2338
2419
|
}
|
|
2339
|
-
if (!this.noWatch) {
|
|
2340
|
-
this.watchQueries(configManager, async () => await codegen2.execute());
|
|
2341
|
-
}
|
|
2342
2420
|
await this.indexContentWithSpinner({
|
|
2343
2421
|
database,
|
|
2344
2422
|
graphQLSchema: graphQLSchema2,
|
|
@@ -2348,6 +2426,13 @@ var DevCommand = class extends BaseCommand {
|
|
|
2348
2426
|
if (!firstTime) {
|
|
2349
2427
|
logger.error("Re-index complete");
|
|
2350
2428
|
}
|
|
2429
|
+
if (!this.noWatch) {
|
|
2430
|
+
this.watchQueries(
|
|
2431
|
+
configManager,
|
|
2432
|
+
dbLock,
|
|
2433
|
+
async () => await codegen2.execute()
|
|
2434
|
+
);
|
|
2435
|
+
}
|
|
2351
2436
|
return { apiURL: apiURL2, database, graphQLSchema: graphQLSchema2, tinaSchema: tinaSchema2 };
|
|
2352
2437
|
} catch (e) {
|
|
2353
2438
|
logger.error(`
|
|
@@ -2382,14 +2467,6 @@ ${dangerText(e.message)}
|
|
|
2382
2467
|
tokenSplitRegex: (_d = (_c = configManager.config.search) == null ? void 0 : _c.tina) == null ? void 0 : _d.tokenSplitRegex
|
|
2383
2468
|
});
|
|
2384
2469
|
await searchIndexClient.onStartIndexing();
|
|
2385
|
-
const server = await createDevServer(
|
|
2386
|
-
configManager,
|
|
2387
|
-
database,
|
|
2388
|
-
searchIndexClient.searchIndex,
|
|
2389
|
-
apiURL,
|
|
2390
|
-
this.noWatch
|
|
2391
|
-
);
|
|
2392
|
-
await server.listen(Number(this.port));
|
|
2393
2470
|
const searchIndexer = new import_search.SearchIndexer({
|
|
2394
2471
|
batchSize: ((_e = configManager.config.search) == null ? void 0 : _e.indexBatchSize) || 100,
|
|
2395
2472
|
bridge: new import_graphql10.FilesystemBridge(
|
|
@@ -2415,12 +2492,26 @@ ${dangerText(e.message)}
|
|
|
2415
2492
|
this.watchContentFiles(
|
|
2416
2493
|
configManager,
|
|
2417
2494
|
database,
|
|
2495
|
+
dbLock,
|
|
2418
2496
|
configManager.config.search && searchIndexer
|
|
2419
2497
|
);
|
|
2498
|
+
}
|
|
2499
|
+
const server = await createDevServer(
|
|
2500
|
+
configManager,
|
|
2501
|
+
database,
|
|
2502
|
+
searchIndexClient.searchIndex,
|
|
2503
|
+
apiURL,
|
|
2504
|
+
this.noWatch,
|
|
2505
|
+
dbLock
|
|
2506
|
+
);
|
|
2507
|
+
await server.listen(Number(this.port));
|
|
2508
|
+
if (!this.noWatch) {
|
|
2420
2509
|
import_chokidar.default.watch(configManager.watchList).on("change", async () => {
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2510
|
+
await dbLock(async () => {
|
|
2511
|
+
logger.info(`Tina config change detected, rebuilding`);
|
|
2512
|
+
await setup({ firstTime: false });
|
|
2513
|
+
server.ws.send({ type: "full-reload", path: "*" });
|
|
2514
|
+
});
|
|
2424
2515
|
});
|
|
2425
2516
|
}
|
|
2426
2517
|
const subItems = [];
|
|
@@ -2433,7 +2524,7 @@ ${dangerText(e.message)}
|
|
|
2433
2524
|
const summaryItems = [
|
|
2434
2525
|
{
|
|
2435
2526
|
emoji: "\u{1F999}",
|
|
2436
|
-
heading: "
|
|
2527
|
+
heading: "TinaCMS URLs",
|
|
2437
2528
|
subItems: [
|
|
2438
2529
|
{
|
|
2439
2530
|
key: "CMS",
|
|
@@ -2468,14 +2559,28 @@ ${dangerText(e.message)}
|
|
|
2468
2559
|
});
|
|
2469
2560
|
}
|
|
2470
2561
|
summary({
|
|
2471
|
-
heading: "
|
|
2562
|
+
heading: "\u2705 \u{1F999} TinaCMS Dev Server is active:",
|
|
2472
2563
|
items: [
|
|
2473
2564
|
...summaryItems
|
|
2565
|
+
// {
|
|
2566
|
+
// emoji: '📚',
|
|
2567
|
+
// heading: 'Useful links',
|
|
2568
|
+
// subItems: [
|
|
2569
|
+
// {
|
|
2570
|
+
// key: 'Custom queries',
|
|
2571
|
+
// value: 'https://tina.io/querying',
|
|
2572
|
+
// },
|
|
2573
|
+
// {
|
|
2574
|
+
// key: 'Visual editing',
|
|
2575
|
+
// value: 'https://tina.io/visual-editing',
|
|
2576
|
+
// },
|
|
2577
|
+
// ],
|
|
2578
|
+
// },
|
|
2474
2579
|
]
|
|
2475
2580
|
});
|
|
2476
2581
|
await this.startSubCommand();
|
|
2477
2582
|
}
|
|
2478
|
-
watchContentFiles(configManager, database, searchIndexer) {
|
|
2583
|
+
watchContentFiles(configManager, database, databaseLock, searchIndexer) {
|
|
2479
2584
|
const collectionContentFiles = [];
|
|
2480
2585
|
configManager.config.schema.collections.forEach((collection) => {
|
|
2481
2586
|
const collectionGlob = `${import_path5.default.join(
|
|
@@ -2491,39 +2596,42 @@ ${dangerText(e.message)}
|
|
|
2491
2596
|
if (!ready) {
|
|
2492
2597
|
return;
|
|
2493
2598
|
}
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2599
|
+
await databaseLock(async () => {
|
|
2600
|
+
const pathFromRoot = configManager.printContentRelativePath(addedFile);
|
|
2601
|
+
await database.indexContentByPaths([pathFromRoot]).catch(console.error);
|
|
2602
|
+
if (searchIndexer) {
|
|
2603
|
+
await searchIndexer.indexContentByPaths([pathFromRoot]).catch(console.error);
|
|
2604
|
+
}
|
|
2605
|
+
});
|
|
2499
2606
|
}).on("change", async (changedFile) => {
|
|
2500
2607
|
const pathFromRoot = configManager.printContentRelativePath(changedFile);
|
|
2501
|
-
await
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2608
|
+
await databaseLock(async () => {
|
|
2609
|
+
await database.indexContentByPaths([pathFromRoot]).catch(console.error);
|
|
2610
|
+
if (searchIndexer) {
|
|
2611
|
+
await searchIndexer.indexContentByPaths([pathFromRoot]).catch(console.error);
|
|
2612
|
+
}
|
|
2613
|
+
});
|
|
2505
2614
|
}).on("unlink", async (removedFile) => {
|
|
2506
2615
|
const pathFromRoot = configManager.printContentRelativePath(removedFile);
|
|
2507
|
-
await
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2616
|
+
await databaseLock(async () => {
|
|
2617
|
+
await database.deleteContentByPaths([pathFromRoot]).catch(console.error);
|
|
2618
|
+
if (searchIndexer) {
|
|
2619
|
+
await searchIndexer.deleteIndexContent([pathFromRoot]).catch(console.error);
|
|
2620
|
+
}
|
|
2621
|
+
});
|
|
2511
2622
|
});
|
|
2512
2623
|
}
|
|
2513
|
-
watchQueries(configManager, callback) {
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
await callback();
|
|
2521
|
-
}).on("unlink", async (removedFile) => {
|
|
2522
|
-
await callback();
|
|
2523
|
-
});
|
|
2624
|
+
watchQueries(configManager, databaseLock, callback) {
|
|
2625
|
+
const executeCallback = async (_) => {
|
|
2626
|
+
await databaseLock(async () => {
|
|
2627
|
+
await callback();
|
|
2628
|
+
});
|
|
2629
|
+
};
|
|
2630
|
+
import_chokidar.default.watch(configManager.userQueriesAndFragmentsGlob).on("add", executeCallback).on("change", executeCallback).on("unlink", executeCallback);
|
|
2524
2631
|
}
|
|
2525
2632
|
};
|
|
2526
2633
|
DevCommand.paths = [["dev"], ["server:start"]];
|
|
2634
|
+
// Prevent indexes and reads occurring at once
|
|
2527
2635
|
DevCommand.usage = import_clipanion2.Command.Usage({
|
|
2528
2636
|
category: `Commands`,
|
|
2529
2637
|
description: `Builds Tina and starts the dev server`,
|
|
@@ -2537,6 +2645,8 @@ DevCommand.usage = import_clipanion2.Command.Usage({
|
|
|
2537
2645
|
var import_clipanion3 = require("clipanion");
|
|
2538
2646
|
var import_progress2 = __toESM(require("progress"));
|
|
2539
2647
|
var import_fs_extra7 = __toESM(require("fs-extra"));
|
|
2648
|
+
var import_crypto = __toESM(require("crypto"));
|
|
2649
|
+
var import_path6 = __toESM(require("path"));
|
|
2540
2650
|
var import_graphql11 = require("@tinacms/graphql");
|
|
2541
2651
|
|
|
2542
2652
|
// src/next/commands/build-command/server.ts
|
|
@@ -2580,7 +2690,7 @@ var buildProductionSpa = async (configManager, database, apiURL) => {
|
|
|
2580
2690
|
// src/next/commands/build-command/index.ts
|
|
2581
2691
|
var import_schema_tools2 = require("@tinacms/schema-tools");
|
|
2582
2692
|
var import_graphql12 = require("graphql");
|
|
2583
|
-
var
|
|
2693
|
+
var import_core3 = require("@graphql-inspector/core");
|
|
2584
2694
|
|
|
2585
2695
|
// src/next/commands/build-command/waitForDB.ts
|
|
2586
2696
|
var import_progress = __toESM(require("progress"));
|
|
@@ -2682,6 +2792,20 @@ var waitForDB = async (config2, apiUrl, previewName, verbose) => {
|
|
|
2682
2792
|
|
|
2683
2793
|
// src/next/commands/build-command/index.ts
|
|
2684
2794
|
var import_search2 = require("@tinacms/search");
|
|
2795
|
+
|
|
2796
|
+
// src/utils/index.ts
|
|
2797
|
+
var import_core2 = require("@graphql-inspector/core");
|
|
2798
|
+
var getFaqLink = (type) => {
|
|
2799
|
+
switch (type) {
|
|
2800
|
+
case import_core2.ChangeType.FieldRemoved: {
|
|
2801
|
+
return "https://tina.io/docs/introduction/faq#how-do-i-resolve-the-local-graphql-schema-doesnt-match-the-remote-graphql-schema-errors";
|
|
2802
|
+
}
|
|
2803
|
+
default:
|
|
2804
|
+
return null;
|
|
2805
|
+
}
|
|
2806
|
+
};
|
|
2807
|
+
|
|
2808
|
+
// src/next/commands/build-command/index.ts
|
|
2685
2809
|
var BuildCommand = class extends BaseCommand {
|
|
2686
2810
|
constructor() {
|
|
2687
2811
|
super(...arguments);
|
|
@@ -2697,6 +2821,9 @@ var BuildCommand = class extends BaseCommand {
|
|
|
2697
2821
|
this.tinaGraphQLVersion = import_clipanion3.Option.String("--tina-graphql-version", {
|
|
2698
2822
|
description: "Specify the version of @tinacms/graphql to use (defaults to latest)"
|
|
2699
2823
|
});
|
|
2824
|
+
/**
|
|
2825
|
+
* This option allows the user to skip the tina cloud checks if they want to. This could be useful for mismatched GraphQL versions or if they want to build only using the local client and never connect to Tina Cloud
|
|
2826
|
+
*/
|
|
2700
2827
|
this.skipCloudChecks = import_clipanion3.Option.Boolean("--skip-cloud-checks", false, {
|
|
2701
2828
|
description: "Skips checking the provided cloud config."
|
|
2702
2829
|
});
|
|
@@ -2802,14 +2929,15 @@ ${dangerText(e.message)}
|
|
|
2802
2929
|
database,
|
|
2803
2930
|
null,
|
|
2804
2931
|
apiURL,
|
|
2805
|
-
true
|
|
2932
|
+
true,
|
|
2933
|
+
(lockedFn) => lockedFn()
|
|
2806
2934
|
);
|
|
2807
2935
|
await server.listen(Number(this.port));
|
|
2808
2936
|
console.log("server listening on port", this.port);
|
|
2809
2937
|
}
|
|
2810
2938
|
const skipCloudChecks = this.skipCloudChecks || configManager.hasSelfHostedConfig();
|
|
2811
2939
|
if (!skipCloudChecks) {
|
|
2812
|
-
const { hasUpstream } = await this.checkClientInfo(
|
|
2940
|
+
const { hasUpstream, timestamp } = await this.checkClientInfo(
|
|
2813
2941
|
configManager,
|
|
2814
2942
|
codegen2.productionUrl,
|
|
2815
2943
|
this.previewBaseBranch
|
|
@@ -2837,7 +2965,16 @@ ${dangerText(e.message)}
|
|
|
2837
2965
|
await this.checkGraphqlSchema(
|
|
2838
2966
|
configManager,
|
|
2839
2967
|
database,
|
|
2840
|
-
codegen2.productionUrl
|
|
2968
|
+
codegen2.productionUrl,
|
|
2969
|
+
timestamp
|
|
2970
|
+
);
|
|
2971
|
+
await this.checkTinaSchema(
|
|
2972
|
+
configManager,
|
|
2973
|
+
database,
|
|
2974
|
+
codegen2.productionUrl,
|
|
2975
|
+
this.previewName,
|
|
2976
|
+
this.verbose,
|
|
2977
|
+
timestamp
|
|
2841
2978
|
);
|
|
2842
2979
|
}
|
|
2843
2980
|
await buildProductionSpa(configManager, database, codegen2.productionUrl);
|
|
@@ -2956,11 +3093,13 @@ ${dangerText(e.message)}
|
|
|
2956
3093
|
const bar2 = new import_progress2.default("Checking clientId and token. :prog", 1);
|
|
2957
3094
|
let branchKnown = false;
|
|
2958
3095
|
let hasUpstream = false;
|
|
3096
|
+
let timestamp;
|
|
2959
3097
|
try {
|
|
2960
3098
|
const res = await request({
|
|
2961
3099
|
token,
|
|
2962
3100
|
url
|
|
2963
3101
|
});
|
|
3102
|
+
timestamp = res.timestamp || 0;
|
|
2964
3103
|
bar2.tick({
|
|
2965
3104
|
prog: "\u2705"
|
|
2966
3105
|
});
|
|
@@ -3002,7 +3141,8 @@ ${dangerText(e.message)}
|
|
|
3002
3141
|
prog: "\u2705"
|
|
3003
3142
|
});
|
|
3004
3143
|
return {
|
|
3005
|
-
hasUpstream
|
|
3144
|
+
hasUpstream,
|
|
3145
|
+
timestamp
|
|
3006
3146
|
};
|
|
3007
3147
|
}
|
|
3008
3148
|
for (let i = 0; i <= 5; i++) {
|
|
@@ -3092,14 +3232,14 @@ ${dangerText(e.message)}
|
|
|
3092
3232
|
throw e;
|
|
3093
3233
|
}
|
|
3094
3234
|
}
|
|
3095
|
-
async checkGraphqlSchema(configManager, database, apiURL) {
|
|
3235
|
+
async checkGraphqlSchema(configManager, database, apiURL, timestamp) {
|
|
3096
3236
|
const bar2 = new import_progress2.default(
|
|
3097
3237
|
"Checking local GraphQL Schema matches server. :prog",
|
|
3098
3238
|
1
|
|
3099
3239
|
);
|
|
3100
3240
|
const { config: config2 } = configManager;
|
|
3101
3241
|
const token = config2.token;
|
|
3102
|
-
const remoteSchema = await fetchRemoteGraphqlSchema({
|
|
3242
|
+
const { remoteSchema, remoteProjectVersion } = await fetchRemoteGraphqlSchema({
|
|
3103
3243
|
url: apiURL,
|
|
3104
3244
|
token
|
|
3105
3245
|
});
|
|
@@ -3119,7 +3259,7 @@ Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
|
3119
3259
|
const localSchemaDocument = await database.getGraphQLSchemaFromBridge();
|
|
3120
3260
|
const localGraphqlSchema = (0, import_graphql12.buildASTSchema)(localSchemaDocument);
|
|
3121
3261
|
try {
|
|
3122
|
-
const diffResult = await (0,
|
|
3262
|
+
const diffResult = await (0, import_core3.diff)(localGraphqlSchema, remoteGqlSchema);
|
|
3123
3263
|
if (diffResult.length === 0) {
|
|
3124
3264
|
bar2.tick({
|
|
3125
3265
|
prog: "\u2705"
|
|
@@ -3128,12 +3268,30 @@ Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
|
3128
3268
|
bar2.tick({
|
|
3129
3269
|
prog: "\u274C"
|
|
3130
3270
|
});
|
|
3131
|
-
|
|
3132
|
-
|
|
3133
|
-
|
|
3271
|
+
const type = diffResult[0].type;
|
|
3272
|
+
const reason = diffResult[0].message;
|
|
3273
|
+
const errorLevel = diffResult[0].criticality.level;
|
|
3274
|
+
const faqLink = getFaqLink(type);
|
|
3275
|
+
const tinaGraphQLVersion = configManager.getTinaGraphQLVersion();
|
|
3276
|
+
let errorMessage = `The local GraphQL schema doesn't match the remote GraphQL schema. Please push up your changes to GitHub to update your remote GraphQL schema. ${faqLink && `
|
|
3277
|
+
Check out '${faqLink}' for possible solutions.`}`;
|
|
3278
|
+
errorMessage += `
|
|
3134
3279
|
|
|
3135
|
-
Additional info:
|
|
3280
|
+
Additional info:
|
|
3281
|
+
|
|
3282
|
+
`;
|
|
3283
|
+
if (config2 == null ? void 0 : config2.branch) {
|
|
3284
|
+
errorMessage += ` Branch: ${config2.branch}, Client ID: ${config2.clientId}
|
|
3285
|
+
`;
|
|
3136
3286
|
}
|
|
3287
|
+
errorMessage += ` Local GraphQL version: ${tinaGraphQLVersion.fullVersion} / Remote GraphQL version: ${remoteProjectVersion}
|
|
3288
|
+
`;
|
|
3289
|
+
errorMessage += ` Last indexed at: ${new Date(
|
|
3290
|
+
timestamp
|
|
3291
|
+
).toUTCString()}
|
|
3292
|
+
`;
|
|
3293
|
+
errorMessage += ` Reason: [${errorLevel} - ${type}] ${reason}
|
|
3294
|
+
`;
|
|
3137
3295
|
throw new Error(errorMessage);
|
|
3138
3296
|
}
|
|
3139
3297
|
} catch (e) {
|
|
@@ -3148,6 +3306,71 @@ Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
|
3148
3306
|
}
|
|
3149
3307
|
}
|
|
3150
3308
|
}
|
|
3309
|
+
async checkTinaSchema(configManager, database, apiURL, previewName, verbose, timestamp) {
|
|
3310
|
+
const bar2 = new import_progress2.default(
|
|
3311
|
+
"Checking local Tina Schema matches server. :prog",
|
|
3312
|
+
1
|
|
3313
|
+
);
|
|
3314
|
+
const { config: config2 } = configManager;
|
|
3315
|
+
const token = config2.token;
|
|
3316
|
+
const { clientId, branch, isLocalClient, host } = (0, import_schema_tools2.parseURL)(apiURL);
|
|
3317
|
+
if (isLocalClient || !host || !clientId || !branch) {
|
|
3318
|
+
if (verbose) {
|
|
3319
|
+
logger.info(logText("Not using Tina Cloud, skipping Tina Schema check"));
|
|
3320
|
+
}
|
|
3321
|
+
return;
|
|
3322
|
+
}
|
|
3323
|
+
const { tinaSchema: remoteTinaSchemaSha } = await fetchSchemaSha({
|
|
3324
|
+
url: `https://${host}/db/${clientId}/${previewName || branch}/schemaSha`,
|
|
3325
|
+
token
|
|
3326
|
+
});
|
|
3327
|
+
if (!remoteTinaSchemaSha) {
|
|
3328
|
+
bar2.tick({
|
|
3329
|
+
prog: "\u274C"
|
|
3330
|
+
});
|
|
3331
|
+
let errorMessage = `The remote Tina schema does not exist. Check indexing for this branch.`;
|
|
3332
|
+
if (config2 == null ? void 0 : config2.branch) {
|
|
3333
|
+
errorMessage += `
|
|
3334
|
+
|
|
3335
|
+
Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
3336
|
+
}
|
|
3337
|
+
throw new Error(errorMessage);
|
|
3338
|
+
}
|
|
3339
|
+
if (!database.bridge) {
|
|
3340
|
+
throw new Error(`No bridge configured`);
|
|
3341
|
+
}
|
|
3342
|
+
const localTinaSchema = JSON.parse(
|
|
3343
|
+
await database.bridge.get(
|
|
3344
|
+
import_path6.default.join(database.tinaDirectory, "__generated__", "_schema.json")
|
|
3345
|
+
)
|
|
3346
|
+
);
|
|
3347
|
+
localTinaSchema.version = void 0;
|
|
3348
|
+
const localTinaSchemaSha = import_crypto.default.createHash("sha256").update(JSON.stringify(localTinaSchema)).digest("hex");
|
|
3349
|
+
if (localTinaSchemaSha === remoteTinaSchemaSha) {
|
|
3350
|
+
bar2.tick({
|
|
3351
|
+
prog: "\u2705"
|
|
3352
|
+
});
|
|
3353
|
+
} else {
|
|
3354
|
+
bar2.tick({
|
|
3355
|
+
prog: "\u274C"
|
|
3356
|
+
});
|
|
3357
|
+
let errorMessage = `The local Tina schema doesn't match the remote Tina schema. Please push up your changes to GitHub to update your remote tina schema.`;
|
|
3358
|
+
errorMessage += `
|
|
3359
|
+
|
|
3360
|
+
Additional info:
|
|
3361
|
+
|
|
3362
|
+
`;
|
|
3363
|
+
if (config2 == null ? void 0 : config2.branch) {
|
|
3364
|
+
errorMessage += ` Branch: ${config2.branch}, Client ID: ${config2.clientId}
|
|
3365
|
+
`;
|
|
3366
|
+
}
|
|
3367
|
+
errorMessage += ` Last indexed at: ${new Date(
|
|
3368
|
+
timestamp
|
|
3369
|
+
).toUTCString()}
|
|
3370
|
+
`;
|
|
3371
|
+
throw new Error(errorMessage);
|
|
3372
|
+
}
|
|
3373
|
+
}
|
|
3151
3374
|
};
|
|
3152
3375
|
BuildCommand.paths = [["build"]];
|
|
3153
3376
|
BuildCommand.usage = import_clipanion3.Command.Usage({
|
|
@@ -3214,7 +3437,26 @@ var fetchRemoteGraphqlSchema = async ({
|
|
|
3214
3437
|
body
|
|
3215
3438
|
});
|
|
3216
3439
|
const data = await res.json();
|
|
3217
|
-
return
|
|
3440
|
+
return {
|
|
3441
|
+
remoteSchema: data == null ? void 0 : data.data,
|
|
3442
|
+
remoteRuntimeVersion: res.headers.get("tinacms-grapqhl-version"),
|
|
3443
|
+
remoteProjectVersion: res.headers.get("tinacms-graphql-project-version")
|
|
3444
|
+
};
|
|
3445
|
+
};
|
|
3446
|
+
var fetchSchemaSha = async ({
|
|
3447
|
+
url,
|
|
3448
|
+
token
|
|
3449
|
+
}) => {
|
|
3450
|
+
const headers = new Headers();
|
|
3451
|
+
if (token) {
|
|
3452
|
+
headers.append("X-API-KEY", token);
|
|
3453
|
+
}
|
|
3454
|
+
const res = await fetch(url, {
|
|
3455
|
+
method: "GET",
|
|
3456
|
+
headers,
|
|
3457
|
+
cache: "no-cache"
|
|
3458
|
+
});
|
|
3459
|
+
return res.json();
|
|
3218
3460
|
};
|
|
3219
3461
|
|
|
3220
3462
|
// src/next/commands/audit-command/index.ts
|
|
@@ -3323,6 +3565,7 @@ var auditDocuments = async (args) => {
|
|
|
3323
3565
|
logger.error(import_chalk5.default.red(err.message));
|
|
3324
3566
|
if (err.originalError.originalError) {
|
|
3325
3567
|
logger.error(
|
|
3568
|
+
// @ts-ignore FIXME: this doesn't seem right
|
|
3326
3569
|
import_chalk5.default.red(` ${err.originalError.originalError.message}`)
|
|
3327
3570
|
);
|
|
3328
3571
|
}
|
|
@@ -3469,25 +3712,25 @@ var import_clipanion6 = require("clipanion");
|
|
|
3469
3712
|
|
|
3470
3713
|
// src/cmds/init/detectEnvironment.ts
|
|
3471
3714
|
var import_fs_extra8 = __toESM(require("fs-extra"));
|
|
3472
|
-
var
|
|
3715
|
+
var import_path7 = __toESM(require("path"));
|
|
3473
3716
|
var checkGitignoreForItem = async ({
|
|
3474
3717
|
baseDir,
|
|
3475
3718
|
line
|
|
3476
3719
|
}) => {
|
|
3477
|
-
const gitignoreContent = import_fs_extra8.default.readFileSync(
|
|
3720
|
+
const gitignoreContent = import_fs_extra8.default.readFileSync(import_path7.default.join(baseDir, ".gitignore")).toString();
|
|
3478
3721
|
return gitignoreContent.split("\n").some((item) => item === line);
|
|
3479
3722
|
};
|
|
3480
3723
|
var makeGeneratedFile = async (name2, generatedFileType, parentPath, opts) => {
|
|
3481
3724
|
const result = {
|
|
3482
|
-
fullPathTS:
|
|
3725
|
+
fullPathTS: import_path7.default.join(
|
|
3483
3726
|
parentPath,
|
|
3484
3727
|
`${name2}.${(opts == null ? void 0 : opts.typescriptSuffix) || (opts == null ? void 0 : opts.extensionOverride) || "ts"}`
|
|
3485
3728
|
),
|
|
3486
|
-
fullPathJS:
|
|
3729
|
+
fullPathJS: import_path7.default.join(
|
|
3487
3730
|
parentPath,
|
|
3488
3731
|
`${name2}.${(opts == null ? void 0 : opts.extensionOverride) || "js"}`
|
|
3489
3732
|
),
|
|
3490
|
-
fullPathOverride: (opts == null ? void 0 : opts.extensionOverride) ?
|
|
3733
|
+
fullPathOverride: (opts == null ? void 0 : opts.extensionOverride) ? import_path7.default.join(parentPath, `${name2}.${opts == null ? void 0 : opts.extensionOverride}`) : "",
|
|
3491
3734
|
generatedFileType,
|
|
3492
3735
|
name: name2,
|
|
3493
3736
|
parentPath,
|
|
@@ -3517,18 +3760,20 @@ var detectEnvironment = async ({
|
|
|
3517
3760
|
}) => {
|
|
3518
3761
|
var _a;
|
|
3519
3762
|
const hasForestryConfig = await import_fs_extra8.default.pathExists(
|
|
3520
|
-
|
|
3763
|
+
import_path7.default.join(pathToForestryConfig, ".forestry", "settings.yml")
|
|
3521
3764
|
);
|
|
3522
|
-
const sampleContentPath =
|
|
3765
|
+
const sampleContentPath = import_path7.default.join(
|
|
3523
3766
|
baseDir,
|
|
3524
3767
|
"content",
|
|
3525
3768
|
"posts",
|
|
3526
3769
|
"hello-world.md"
|
|
3527
3770
|
);
|
|
3528
|
-
const usingSrc = import_fs_extra8.default.pathExistsSync(
|
|
3529
|
-
const tinaFolder =
|
|
3771
|
+
const usingSrc = import_fs_extra8.default.pathExistsSync(import_path7.default.join(baseDir, "src")) && (import_fs_extra8.default.pathExistsSync(import_path7.default.join(baseDir, "src", "app")) || import_fs_extra8.default.pathExistsSync(import_path7.default.join(baseDir, "src", "pages")));
|
|
3772
|
+
const tinaFolder = import_path7.default.join(baseDir, "tina");
|
|
3530
3773
|
const tinaConfigExists = Boolean(
|
|
3531
|
-
|
|
3774
|
+
// Does the tina folder exist?
|
|
3775
|
+
await import_fs_extra8.default.pathExists(tinaFolder) && // Does the tina folder contain a config file?
|
|
3776
|
+
(await import_fs_extra8.default.readdir(tinaFolder)).find((x) => x.includes("config"))
|
|
3532
3777
|
);
|
|
3533
3778
|
const pagesDir = [baseDir, usingSrc ? "src" : false, "pages"].filter(
|
|
3534
3779
|
Boolean
|
|
@@ -3540,12 +3785,12 @@ var detectEnvironment = async ({
|
|
|
3540
3785
|
"next-api-handler": await makeGeneratedFile(
|
|
3541
3786
|
"[...routes]",
|
|
3542
3787
|
"next-api-handler",
|
|
3543
|
-
|
|
3788
|
+
import_path7.default.join(...pagesDir, "api", "tina")
|
|
3544
3789
|
),
|
|
3545
3790
|
"reactive-example": await makeGeneratedFile(
|
|
3546
3791
|
"[filename]",
|
|
3547
3792
|
"reactive-example",
|
|
3548
|
-
|
|
3793
|
+
import_path7.default.join(...pagesDir, "demo", "blog"),
|
|
3549
3794
|
{
|
|
3550
3795
|
typescriptSuffix: "tsx"
|
|
3551
3796
|
}
|
|
@@ -3553,13 +3798,13 @@ var detectEnvironment = async ({
|
|
|
3553
3798
|
"users-json": await makeGeneratedFile(
|
|
3554
3799
|
"index",
|
|
3555
3800
|
"users-json",
|
|
3556
|
-
|
|
3801
|
+
import_path7.default.join(baseDir, "content", "users"),
|
|
3557
3802
|
{ extensionOverride: "json" }
|
|
3558
3803
|
),
|
|
3559
3804
|
"sample-content": await makeGeneratedFile(
|
|
3560
3805
|
"hello-world",
|
|
3561
3806
|
"sample-content",
|
|
3562
|
-
|
|
3807
|
+
import_path7.default.join(baseDir, "content", "posts"),
|
|
3563
3808
|
{ extensionOverride: "md" }
|
|
3564
3809
|
)
|
|
3565
3810
|
};
|
|
@@ -3585,13 +3830,13 @@ var detectEnvironment = async ({
|
|
|
3585
3830
|
);
|
|
3586
3831
|
}
|
|
3587
3832
|
}
|
|
3588
|
-
const hasGitIgnore = await import_fs_extra8.default.pathExists(
|
|
3833
|
+
const hasGitIgnore = await import_fs_extra8.default.pathExists(import_path7.default.join(".gitignore"));
|
|
3589
3834
|
const hasGitIgnoreNodeModules = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: "node_modules" });
|
|
3590
3835
|
const hasEnvTina = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: ".env.tina" });
|
|
3591
3836
|
const hasGitIgnoreEnv = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: ".env" });
|
|
3592
3837
|
let frontMatterFormat;
|
|
3593
3838
|
if (hasForestryConfig) {
|
|
3594
|
-
const hugoConfigPath =
|
|
3839
|
+
const hugoConfigPath = import_path7.default.join(rootPath, "config.toml");
|
|
3595
3840
|
if (await import_fs_extra8.default.pathExists(hugoConfigPath)) {
|
|
3596
3841
|
const hugoConfig = await import_fs_extra8.default.readFile(hugoConfigPath, "utf8");
|
|
3597
3842
|
const metaDataFormat = (_a = hugoConfig.match(/metaDataFormat = "(.*)"/)) == null ? void 0 : _a[1];
|
|
@@ -3763,6 +4008,7 @@ var supportedDatabaseAdapters = {
|
|
|
3763
4008
|
{
|
|
3764
4009
|
from: "mongodb",
|
|
3765
4010
|
imported: [],
|
|
4011
|
+
// not explicitly imported
|
|
3766
4012
|
packageName: "mongodb"
|
|
3767
4013
|
}
|
|
3768
4014
|
]
|
|
@@ -3835,6 +4081,10 @@ var chooseDatabaseAdapter = async ({
|
|
|
3835
4081
|
title: "MongoDB",
|
|
3836
4082
|
value: "mongodb"
|
|
3837
4083
|
}
|
|
4084
|
+
// {
|
|
4085
|
+
// title: "I'll create my own database adapter",
|
|
4086
|
+
// value: 'other',
|
|
4087
|
+
// },
|
|
3838
4088
|
]
|
|
3839
4089
|
}
|
|
3840
4090
|
]);
|
|
@@ -4112,6 +4362,7 @@ async function configure(env, opts) {
|
|
|
4112
4362
|
packageManager,
|
|
4113
4363
|
forestryMigrate: false,
|
|
4114
4364
|
isLocalEnvVarName: "TINA_PUBLIC_IS_LOCAL",
|
|
4365
|
+
// TODO: give this a better default
|
|
4115
4366
|
typescript: false
|
|
4116
4367
|
};
|
|
4117
4368
|
if (config2.framework.name === "next") {
|
|
@@ -4199,31 +4450,41 @@ var CLICommand = class {
|
|
|
4199
4450
|
};
|
|
4200
4451
|
|
|
4201
4452
|
// src/cmds/init/apply.ts
|
|
4202
|
-
var
|
|
4453
|
+
var import_path11 = __toESM(require("path"));
|
|
4203
4454
|
|
|
4204
4455
|
// src/cmds/forestry-migrate/index.ts
|
|
4205
4456
|
var import_fs_extra10 = __toESM(require("fs-extra"));
|
|
4206
|
-
var
|
|
4457
|
+
var import_path9 = __toESM(require("path"));
|
|
4207
4458
|
var import_js_yaml2 = __toESM(require("js-yaml"));
|
|
4208
4459
|
var import_minimatch = __toESM(require("minimatch"));
|
|
4209
4460
|
var import_graphql16 = require("@tinacms/graphql");
|
|
4210
4461
|
|
|
4211
4462
|
// src/cmds/forestry-migrate/util/index.ts
|
|
4212
4463
|
var import_fs_extra9 = __toESM(require("fs-extra"));
|
|
4213
|
-
var
|
|
4464
|
+
var import_path8 = __toESM(require("path"));
|
|
4214
4465
|
var import_js_yaml = __toESM(require("js-yaml"));
|
|
4215
4466
|
var import_zod = __toESM(require("zod"));
|
|
4216
4467
|
|
|
4217
4468
|
// src/cmds/forestry-migrate/util/errorSingleton.ts
|
|
4218
|
-
var ErrorSingleton = class {
|
|
4469
|
+
var ErrorSingleton = class _ErrorSingleton {
|
|
4470
|
+
/**
|
|
4471
|
+
* The Singleton's constructor should always be private to prevent direct
|
|
4472
|
+
* construction calls with the `new` operator.
|
|
4473
|
+
*/
|
|
4219
4474
|
constructor() {
|
|
4220
4475
|
}
|
|
4476
|
+
/**
|
|
4477
|
+
* The static method that controls the access to the singleton instance.
|
|
4478
|
+
*
|
|
4479
|
+
* This implementation let you subclass the Singleton class while keeping
|
|
4480
|
+
* just one instance of each subclass around.
|
|
4481
|
+
*/
|
|
4221
4482
|
static getInstance() {
|
|
4222
|
-
if (!
|
|
4223
|
-
|
|
4224
|
-
|
|
4483
|
+
if (!_ErrorSingleton.instance) {
|
|
4484
|
+
_ErrorSingleton.instance = new _ErrorSingleton();
|
|
4485
|
+
_ErrorSingleton.instance.collectionNameErrors = [];
|
|
4225
4486
|
}
|
|
4226
|
-
return
|
|
4487
|
+
return _ErrorSingleton.instance;
|
|
4227
4488
|
}
|
|
4228
4489
|
addErrorName(error) {
|
|
4229
4490
|
this.collectionNameErrors.push(error);
|
|
@@ -4266,8 +4527,7 @@ var makeFieldsWithInternalCode = ({
|
|
|
4266
4527
|
if (hasBody) {
|
|
4267
4528
|
return [bodyField, `__TINA_INTERNAL__:::...${field}():::`];
|
|
4268
4529
|
} else {
|
|
4269
|
-
if (spread)
|
|
4270
|
-
return `__TINA_INTERNAL__:::...${field}():::`;
|
|
4530
|
+
if (spread) return `__TINA_INTERNAL__:::...${field}():::`;
|
|
4271
4531
|
return `__TINA_INTERNAL__:::${field}():::`;
|
|
4272
4532
|
}
|
|
4273
4533
|
};
|
|
@@ -4351,6 +4611,7 @@ var forestryConfigSchema = import_zod.default.object({
|
|
|
4351
4611
|
)
|
|
4352
4612
|
});
|
|
4353
4613
|
var forestryFieldWithoutField = import_zod.default.object({
|
|
4614
|
+
// TODO: maybe better type this?
|
|
4354
4615
|
type: import_zod.default.union([
|
|
4355
4616
|
import_zod.default.literal("text"),
|
|
4356
4617
|
import_zod.default.literal("datetime"),
|
|
@@ -4374,6 +4635,7 @@ var forestryFieldWithoutField = import_zod.default.object({
|
|
|
4374
4635
|
default: import_zod.default.any().optional(),
|
|
4375
4636
|
template: import_zod.default.string().optional(),
|
|
4376
4637
|
config: import_zod.default.object({
|
|
4638
|
+
// min and max are used for lists
|
|
4377
4639
|
min: import_zod.default.number().optional().nullable(),
|
|
4378
4640
|
max: import_zod.default.number().optional().nullable(),
|
|
4379
4641
|
required: import_zod.default.boolean().optional().nullable(),
|
|
@@ -4387,6 +4649,7 @@ var forestryFieldWithoutField = import_zod.default.object({
|
|
|
4387
4649
|
import_zod.default.literal("pages"),
|
|
4388
4650
|
import_zod.default.literal("documents"),
|
|
4389
4651
|
import_zod.default.literal("simple"),
|
|
4652
|
+
// TODO: I want to ignore this key if its invalid
|
|
4390
4653
|
import_zod.default.string()
|
|
4391
4654
|
]).optional().nullable(),
|
|
4392
4655
|
section: import_zod.default.string().optional().nullable()
|
|
@@ -4422,6 +4685,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4422
4685
|
}
|
|
4423
4686
|
let field;
|
|
4424
4687
|
switch (forestryField2.type) {
|
|
4688
|
+
// Single filed types
|
|
4425
4689
|
case "text":
|
|
4426
4690
|
field = {
|
|
4427
4691
|
type: "string",
|
|
@@ -4501,6 +4765,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4501
4765
|
);
|
|
4502
4766
|
}
|
|
4503
4767
|
break;
|
|
4768
|
+
// List Types
|
|
4504
4769
|
case "list":
|
|
4505
4770
|
field = {
|
|
4506
4771
|
type: "string",
|
|
@@ -4523,6 +4788,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4523
4788
|
}
|
|
4524
4789
|
};
|
|
4525
4790
|
break;
|
|
4791
|
+
// Object (Group) types
|
|
4526
4792
|
case "field_group":
|
|
4527
4793
|
field = {
|
|
4528
4794
|
type: "object",
|
|
@@ -4563,6 +4829,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4563
4829
|
});
|
|
4564
4830
|
const fieldsString = stringifyLabelWithField(template2.label);
|
|
4565
4831
|
const t = {
|
|
4832
|
+
// @ts-ignore
|
|
4566
4833
|
fields: makeFieldsWithInternalCode({
|
|
4567
4834
|
hasBody: false,
|
|
4568
4835
|
field: fieldsString
|
|
@@ -4600,6 +4867,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4600
4867
|
spread: true
|
|
4601
4868
|
});
|
|
4602
4869
|
tinaFields.push(
|
|
4870
|
+
// @ts-ignore
|
|
4603
4871
|
field2
|
|
4604
4872
|
);
|
|
4605
4873
|
break;
|
|
@@ -4621,7 +4889,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4621
4889
|
return tinaFields;
|
|
4622
4890
|
};
|
|
4623
4891
|
var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false }) => {
|
|
4624
|
-
const templatePath =
|
|
4892
|
+
const templatePath = import_path8.default.join(
|
|
4625
4893
|
pathToForestryConfig,
|
|
4626
4894
|
".forestry",
|
|
4627
4895
|
"front_matter",
|
|
@@ -4659,6 +4927,7 @@ var parseSections = ({ val }) => {
|
|
|
4659
4927
|
|
|
4660
4928
|
// src/cmds/forestry-migrate/index.ts
|
|
4661
4929
|
var BODY_FIELD = {
|
|
4930
|
+
// This is the body field
|
|
4662
4931
|
type: "rich-text",
|
|
4663
4932
|
name: "body",
|
|
4664
4933
|
label: "Body of Document",
|
|
@@ -4696,8 +4965,8 @@ var generateAllTemplates = async ({
|
|
|
4696
4965
|
pathToForestryConfig
|
|
4697
4966
|
}) => {
|
|
4698
4967
|
const allTemplates = (await import_fs_extra10.default.readdir(
|
|
4699
|
-
|
|
4700
|
-
)).map((tem) =>
|
|
4968
|
+
import_path9.default.join(pathToForestryConfig, ".forestry", "front_matter", "templates")
|
|
4969
|
+
)).map((tem) => import_path9.default.basename(tem, ".yml"));
|
|
4701
4970
|
const templateMap = /* @__PURE__ */ new Map();
|
|
4702
4971
|
const proms = allTemplates.map(async (tem) => {
|
|
4703
4972
|
try {
|
|
@@ -4717,8 +4986,7 @@ var generateAllTemplates = async ({
|
|
|
4717
4986
|
};
|
|
4718
4987
|
var generateCollectionFromForestrySection = (args) => {
|
|
4719
4988
|
const { section, templateMap } = args;
|
|
4720
|
-
if (section.read_only)
|
|
4721
|
-
return;
|
|
4989
|
+
if (section.read_only) return;
|
|
4722
4990
|
let format3 = "md";
|
|
4723
4991
|
if (section.new_doc_ext) {
|
|
4724
4992
|
const ext = checkExt(section.new_doc_ext);
|
|
@@ -4785,12 +5053,14 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
4785
5053
|
if (((forestryTemplates == null ? void 0 : forestryTemplates.length) || 0) > 1) {
|
|
4786
5054
|
c = {
|
|
4787
5055
|
...baseCollection,
|
|
5056
|
+
// @ts-expect-error
|
|
4788
5057
|
templates: forestryTemplates.map((tem) => {
|
|
4789
5058
|
const currentTemplate = templateMap.get(tem);
|
|
4790
5059
|
const fieldsString = stringifyLabelWithField(
|
|
4791
5060
|
currentTemplate.templateObj.label
|
|
4792
5061
|
);
|
|
4793
5062
|
return {
|
|
5063
|
+
// fields: [BODY_FIELD],
|
|
4794
5064
|
fields: makeFieldsWithInternalCode({
|
|
4795
5065
|
hasBody,
|
|
4796
5066
|
field: fieldsString,
|
|
@@ -4808,6 +5078,8 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
4808
5078
|
const fieldsString = stringifyLabelWithField(template.templateObj.label);
|
|
4809
5079
|
c = {
|
|
4810
5080
|
...baseCollection,
|
|
5081
|
+
// fields: [BODY_FIELD],
|
|
5082
|
+
// @ts-expect-error
|
|
4811
5083
|
fields: makeFieldsWithInternalCode({
|
|
4812
5084
|
field: fieldsString,
|
|
4813
5085
|
hasBody,
|
|
@@ -4839,9 +5111,9 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
4839
5111
|
return c;
|
|
4840
5112
|
} else if (section.type === "document") {
|
|
4841
5113
|
const filePath = section.path;
|
|
4842
|
-
const extname =
|
|
4843
|
-
const fileName =
|
|
4844
|
-
const dir =
|
|
5114
|
+
const extname = import_path9.default.extname(filePath);
|
|
5115
|
+
const fileName = import_path9.default.basename(filePath, extname);
|
|
5116
|
+
const dir = import_path9.default.dirname(filePath);
|
|
4845
5117
|
const ext = checkExt(extname);
|
|
4846
5118
|
if (ext) {
|
|
4847
5119
|
const fields = [];
|
|
@@ -4904,7 +5176,7 @@ var generateCollections = async ({
|
|
|
4904
5176
|
usingTypescript
|
|
4905
5177
|
});
|
|
4906
5178
|
const forestryConfig = await import_fs_extra10.default.readFile(
|
|
4907
|
-
|
|
5179
|
+
import_path9.default.join(pathToForestryConfig, ".forestry", "settings.yml")
|
|
4908
5180
|
);
|
|
4909
5181
|
rewriteTemplateKeysInDocs({
|
|
4910
5182
|
templateMap,
|
|
@@ -4935,11 +5207,11 @@ var rewriteTemplateKeysInDocs = (args) => {
|
|
|
4935
5207
|
const { templateObj } = templateMap.get(templateKey);
|
|
4936
5208
|
(_a = templateObj == null ? void 0 : templateObj.pages) == null ? void 0 : _a.forEach((page) => {
|
|
4937
5209
|
try {
|
|
4938
|
-
const filePath =
|
|
5210
|
+
const filePath = import_path9.default.join(page);
|
|
4939
5211
|
if (import_fs_extra10.default.lstatSync(filePath).isDirectory()) {
|
|
4940
5212
|
return;
|
|
4941
5213
|
}
|
|
4942
|
-
const extname =
|
|
5214
|
+
const extname = import_path9.default.extname(filePath);
|
|
4943
5215
|
const fileContent = import_fs_extra10.default.readFileSync(filePath).toString();
|
|
4944
5216
|
const content = (0, import_graphql16.parseFile)(
|
|
4945
5217
|
fileContent,
|
|
@@ -4971,7 +5243,7 @@ var import_fs_extra13 = __toESM(require("fs-extra"));
|
|
|
4971
5243
|
// src/next/commands/codemod-command/index.ts
|
|
4972
5244
|
var import_clipanion5 = require("clipanion");
|
|
4973
5245
|
var import_fs_extra11 = __toESM(require("fs-extra"));
|
|
4974
|
-
var
|
|
5246
|
+
var import_path10 = __toESM(require("path"));
|
|
4975
5247
|
var CodemodCommand = class extends import_clipanion5.Command {
|
|
4976
5248
|
constructor() {
|
|
4977
5249
|
super(...arguments);
|
|
@@ -5015,7 +5287,7 @@ var moveTinaFolder = async (rootPath = process.cwd()) => {
|
|
|
5015
5287
|
logger.error(e.message);
|
|
5016
5288
|
process.exit(1);
|
|
5017
5289
|
}
|
|
5018
|
-
const tinaDestination =
|
|
5290
|
+
const tinaDestination = import_path10.default.join(configManager.rootPath, "tina");
|
|
5019
5291
|
if (await import_fs_extra11.default.existsSync(tinaDestination)) {
|
|
5020
5292
|
logger.info(
|
|
5021
5293
|
`Folder already exists at ${tinaDestination}. Either delete this folder to complete the codemod, or ensure you have properly copied your config from the ".tina" folder.`
|
|
@@ -5030,7 +5302,7 @@ var moveTinaFolder = async (rootPath = process.cwd()) => {
|
|
|
5030
5302
|
};
|
|
5031
5303
|
var writeGitignore = async (rootPath) => {
|
|
5032
5304
|
await import_fs_extra11.default.outputFileSync(
|
|
5033
|
-
|
|
5305
|
+
import_path10.default.join(rootPath, "tina", ".gitignore"),
|
|
5034
5306
|
"__generated__"
|
|
5035
5307
|
);
|
|
5036
5308
|
};
|
|
@@ -5555,6 +5827,7 @@ var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
|
5555
5827
|
) : [];
|
|
5556
5828
|
const newImports = [
|
|
5557
5829
|
.../* @__PURE__ */ new Set([
|
|
5830
|
+
// we use Set to remove duplicates
|
|
5558
5831
|
...existingImports,
|
|
5559
5832
|
...imports
|
|
5560
5833
|
])
|
|
@@ -5709,6 +5982,7 @@ var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
|
5709
5982
|
);
|
|
5710
5983
|
const { configImports, configAuthProviderClass, extraTinaCollections } = config2.authProvider;
|
|
5711
5984
|
const importMap = {
|
|
5985
|
+
// iterate over configImports and add them to the import map
|
|
5712
5986
|
...configImports.reduce((acc, { from, imported }) => {
|
|
5713
5987
|
acc[from] = imported;
|
|
5714
5988
|
return acc;
|
|
@@ -5868,8 +6142,8 @@ async function apply({
|
|
|
5868
6142
|
await addConfigFile({
|
|
5869
6143
|
configArgs: {
|
|
5870
6144
|
config: config2,
|
|
5871
|
-
publicFolder:
|
|
5872
|
-
|
|
6145
|
+
publicFolder: import_path11.default.join(
|
|
6146
|
+
import_path11.default.relative(process.cwd(), pathToForestryConfig),
|
|
5873
6147
|
config2.publicFolder
|
|
5874
6148
|
),
|
|
5875
6149
|
collections,
|
|
@@ -5883,7 +6157,13 @@ async function apply({
|
|
|
5883
6157
|
config: config2
|
|
5884
6158
|
});
|
|
5885
6159
|
}
|
|
5886
|
-
if (
|
|
6160
|
+
if (
|
|
6161
|
+
// if the config was just generated we do not need to update the config file because it will be generated correctly
|
|
6162
|
+
env.tinaConfigExists && // Are we running tinacms init backend
|
|
6163
|
+
params.isBackendInit && // Do the user choose the 'self-host' option
|
|
6164
|
+
config2.hosting === "self-host" && // the user did not choose the 'tina-cloud' auth provider
|
|
6165
|
+
(((_a = config2.authProvider) == null ? void 0 : _a.name) || "") !== "tina-cloud"
|
|
6166
|
+
) {
|
|
5887
6167
|
await addSelfHostedTinaAuthToConfig(config2, env.generatedFiles["config"]);
|
|
5888
6168
|
}
|
|
5889
6169
|
logNextSteps({
|
|
@@ -5936,18 +6216,18 @@ var createPackageJSON = async () => {
|
|
|
5936
6216
|
};
|
|
5937
6217
|
var createGitignore = async ({ baseDir }) => {
|
|
5938
6218
|
logger.info(logText("No .gitignore found, creating one"));
|
|
5939
|
-
import_fs_extra13.default.outputFileSync(
|
|
6219
|
+
import_fs_extra13.default.outputFileSync(import_path11.default.join(baseDir, ".gitignore"), "node_modules");
|
|
5940
6220
|
};
|
|
5941
6221
|
var updateGitIgnore = async ({
|
|
5942
6222
|
baseDir,
|
|
5943
6223
|
items
|
|
5944
6224
|
}) => {
|
|
5945
6225
|
logger.info(logText(`Adding ${items.join(",")} to .gitignore`));
|
|
5946
|
-
const gitignoreContent = import_fs_extra13.default.readFileSync(
|
|
6226
|
+
const gitignoreContent = import_fs_extra13.default.readFileSync(import_path11.default.join(baseDir, ".gitignore")).toString();
|
|
5947
6227
|
const newGitignoreContent = [...gitignoreContent.split("\n"), ...items].join(
|
|
5948
6228
|
"\n"
|
|
5949
6229
|
);
|
|
5950
|
-
await import_fs_extra13.default.writeFile(
|
|
6230
|
+
await import_fs_extra13.default.writeFile(import_path11.default.join(baseDir, ".gitignore"), newGitignoreContent);
|
|
5951
6231
|
};
|
|
5952
6232
|
var addDependencies = async (config2, env, params) => {
|
|
5953
6233
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
@@ -6017,22 +6297,22 @@ var writeGeneratedFile = async ({
|
|
|
6017
6297
|
content,
|
|
6018
6298
|
typescript
|
|
6019
6299
|
}) => {
|
|
6020
|
-
const { exists, path:
|
|
6300
|
+
const { exists, path: path14, parentPath } = generatedFile.resolve(typescript);
|
|
6021
6301
|
if (exists) {
|
|
6022
6302
|
if (overwrite) {
|
|
6023
|
-
logger.info(`Overwriting file at ${
|
|
6024
|
-
import_fs_extra13.default.outputFileSync(
|
|
6303
|
+
logger.info(`Overwriting file at ${path14}... \u2705`);
|
|
6304
|
+
import_fs_extra13.default.outputFileSync(path14, content);
|
|
6025
6305
|
} else {
|
|
6026
|
-
logger.info(`Not overwriting file at ${
|
|
6306
|
+
logger.info(`Not overwriting file at ${path14}.`);
|
|
6027
6307
|
logger.info(
|
|
6028
|
-
logText(`Please add the following to ${
|
|
6308
|
+
logText(`Please add the following to ${path14}:
|
|
6029
6309
|
${indentText(content)}}`)
|
|
6030
6310
|
);
|
|
6031
6311
|
}
|
|
6032
6312
|
} else {
|
|
6033
|
-
logger.info(`Adding file at ${
|
|
6313
|
+
logger.info(`Adding file at ${path14}... \u2705`);
|
|
6034
6314
|
await import_fs_extra13.default.ensureDir(parentPath);
|
|
6035
|
-
import_fs_extra13.default.outputFileSync(
|
|
6315
|
+
import_fs_extra13.default.outputFileSync(path14, content);
|
|
6036
6316
|
}
|
|
6037
6317
|
};
|
|
6038
6318
|
var addConfigFile = async ({
|
|
@@ -6115,7 +6395,7 @@ var addContentFile = async ({
|
|
|
6115
6395
|
return () => ({
|
|
6116
6396
|
exists: env.sampleContentExists,
|
|
6117
6397
|
path: env.sampleContentPath,
|
|
6118
|
-
parentPath:
|
|
6398
|
+
parentPath: import_path11.default.dirname(env.sampleContentPath)
|
|
6119
6399
|
});
|
|
6120
6400
|
}
|
|
6121
6401
|
},
|
|
@@ -6138,7 +6418,7 @@ ${titleText(" TinaCMS ")} backend initialized!`));
|
|
|
6138
6418
|
return `${x.key}=${x.value || "***"}`;
|
|
6139
6419
|
}).join("\n") + `
|
|
6140
6420
|
TINA_PUBLIC_IS_LOCAL=true`;
|
|
6141
|
-
const envFile =
|
|
6421
|
+
const envFile = import_path11.default.join(process.cwd(), ".env");
|
|
6142
6422
|
if (!import_fs_extra13.default.existsSync(envFile)) {
|
|
6143
6423
|
logger.info(`Adding .env file to your project... \u2705`);
|
|
6144
6424
|
import_fs_extra13.default.writeFileSync(envFile, envFileText);
|
|
@@ -6176,6 +6456,7 @@ var other = ({ packageManager }) => {
|
|
|
6176
6456
|
const packageManagers = {
|
|
6177
6457
|
pnpm: `pnpm`,
|
|
6178
6458
|
npm: `npx`,
|
|
6459
|
+
// npx is the way to run executables that aren't in your "scripts"
|
|
6179
6460
|
yarn: `yarn`
|
|
6180
6461
|
};
|
|
6181
6462
|
return `${packageManagers[packageManager]} tinacms dev -c "<your dev command>"`;
|
|
@@ -6188,6 +6469,7 @@ var frameworkDevCmds = {
|
|
|
6188
6469
|
const packageManagers = {
|
|
6189
6470
|
pnpm: `pnpm`,
|
|
6190
6471
|
npm: `npm run`,
|
|
6472
|
+
// npx is the way to run executables that aren't in your "scripts"
|
|
6191
6473
|
yarn: `yarn`
|
|
6192
6474
|
};
|
|
6193
6475
|
return `${packageManagers[packageManager]} dev`;
|
|
@@ -6202,7 +6484,7 @@ var addReactiveFile = {
|
|
|
6202
6484
|
dataLayer
|
|
6203
6485
|
}) => {
|
|
6204
6486
|
var _a, _b;
|
|
6205
|
-
const packageJsonPath =
|
|
6487
|
+
const packageJsonPath = import_path11.default.join(baseDir, "package.json");
|
|
6206
6488
|
await writeGeneratedFile({
|
|
6207
6489
|
generatedFile,
|
|
6208
6490
|
typescript: config2.typescript,
|
|
@@ -6444,6 +6726,4 @@ cli.register(SearchIndexCommand);
|
|
|
6444
6726
|
cli.register(import_clipanion8.Builtins.DefinitionsCommand);
|
|
6445
6727
|
cli.register(import_clipanion8.Builtins.HelpCommand);
|
|
6446
6728
|
cli.register(import_clipanion8.Builtins.VersionCommand);
|
|
6447
|
-
var
|
|
6448
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
6449
|
-
0 && (module.exports = {});
|
|
6729
|
+
var index_default = cli;
|