@tinacms/cli 0.0.0-c6a6335-20250416234606 → 0.0.0-c706b9f-20251222081038
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/README.md +5 -5
- package/bin/tinacms +12 -6
- package/dist/cmds/forestry-migrate/index.d.ts +2 -2
- package/dist/cmds/forestry-migrate/util/index.d.ts +4 -4
- package/dist/cmds/init/index.d.ts +2 -2
- package/dist/cmds/init/prompts/index.d.ts +3 -2
- package/dist/cmds/init/prompts/types.d.ts +3 -2
- package/dist/index.js +1271 -1106
- package/dist/logger/index.d.ts +7 -2
- package/dist/next/codegen/index.d.ts +3 -9
- package/dist/next/commands/build-command/index.d.ts +3 -0
- package/dist/next/commands/dev-command/server/searchIndex.d.ts +39 -4
- package/dist/utils/path.d.ts +3 -0
- package/dist/utils/sleep.d.ts +1 -0
- package/dist/utils/theme.d.ts +10 -30
- package/package.json +11 -12
package/dist/index.js
CHANGED
|
@@ -1,53 +1,20 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name2 in all)
|
|
9
|
-
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
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.
|
|
24
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
-
mod
|
|
26
|
-
));
|
|
27
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
-
|
|
29
1
|
// src/index.ts
|
|
30
|
-
|
|
31
|
-
__export(index_exports, {
|
|
32
|
-
default: () => index_default
|
|
33
|
-
});
|
|
34
|
-
module.exports = __toCommonJS(index_exports);
|
|
35
|
-
var import_clipanion8 = require("clipanion");
|
|
2
|
+
import { Cli, Builtins } from "clipanion";
|
|
36
3
|
|
|
37
4
|
// package.json
|
|
38
|
-
var version = "
|
|
5
|
+
var version = "2.0.5";
|
|
39
6
|
|
|
40
7
|
// src/next/commands/dev-command/index.ts
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
8
|
+
import path8 from "path";
|
|
9
|
+
import { FilesystemBridge as FilesystemBridge2, buildSchema } from "@tinacms/graphql";
|
|
10
|
+
import { LocalSearchIndexClient, SearchIndexer } from "@tinacms/search";
|
|
11
|
+
import AsyncLock from "async-lock";
|
|
12
|
+
import chokidar from "chokidar";
|
|
13
|
+
import { Command as Command2, Option as Option2 } from "clipanion";
|
|
14
|
+
import fs7 from "fs-extra";
|
|
48
15
|
|
|
49
16
|
// src/logger/index.ts
|
|
50
|
-
|
|
17
|
+
import chalk from "chalk";
|
|
51
18
|
|
|
52
19
|
// src/logger/is-unicode-supported.ts
|
|
53
20
|
function isUnicodeSupported() {
|
|
@@ -61,15 +28,15 @@ function isUnicodeSupported() {
|
|
|
61
28
|
}
|
|
62
29
|
|
|
63
30
|
// src/logger/index.ts
|
|
64
|
-
var
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
31
|
+
var logger = {
|
|
32
|
+
level: "info",
|
|
33
|
+
info: (msg) => process.stdout.write(msg + "\n"),
|
|
34
|
+
warn: (msg) => process.stdout.write(msg + "\n"),
|
|
35
|
+
error: (msg) => process.stderr.write(msg + "\n"),
|
|
36
|
+
debug: (msg) => {
|
|
37
|
+
if (logger.level === "debug") process.stdout.write(msg + "\n");
|
|
38
|
+
}
|
|
39
|
+
};
|
|
73
40
|
function ansiRegex() {
|
|
74
41
|
const pattern = [
|
|
75
42
|
"[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
|
|
@@ -88,18 +55,18 @@ ${message}
|
|
|
88
55
|
return ln.length > sum ? ln.length : sum;
|
|
89
56
|
}, 0) + 2;
|
|
90
57
|
const msg = lines.map(
|
|
91
|
-
(ln) => `${
|
|
58
|
+
(ln) => `${chalk.gray(bar)} ${chalk.white(ln)}${" ".repeat(
|
|
92
59
|
len - strip(ln).length
|
|
93
|
-
)}${
|
|
60
|
+
)}${chalk.gray(bar)}`
|
|
94
61
|
).join("\n");
|
|
95
62
|
const underscoreLen = len - title.length - 1 > 0 ? len - title.length - 1 : 0;
|
|
96
63
|
process.stdout.write(
|
|
97
|
-
`${
|
|
98
|
-
${
|
|
64
|
+
`${chalk.gray(bar)}
|
|
65
|
+
${chalk.green("\u25CB")} ${chalk.reset(
|
|
99
66
|
title
|
|
100
|
-
)} ${
|
|
67
|
+
)} ${chalk.gray("\u2500".repeat(underscoreLen) + "\u256E")}
|
|
101
68
|
${msg}
|
|
102
|
-
${
|
|
69
|
+
${chalk.gray(
|
|
103
70
|
"\u251C" + "\u2500".repeat(len + 2) + "\u256F"
|
|
104
71
|
)}
|
|
105
72
|
`
|
|
@@ -116,11 +83,11 @@ var summary = (content) => {
|
|
|
116
83
|
});
|
|
117
84
|
});
|
|
118
85
|
content.items.forEach((item) => {
|
|
119
|
-
outString.push(`${item.emoji} ${
|
|
86
|
+
outString.push(`${item.emoji} ${chalk.cyan(item.heading)}`);
|
|
120
87
|
item.subItems.forEach((subItem) => {
|
|
121
88
|
const spaces = longestKey - subItem.key.length + 4;
|
|
122
89
|
outString.push(
|
|
123
|
-
` ${subItem.key}:${[...Array(spaces)].join(" ")}${
|
|
90
|
+
` ${subItem.key}:${[...Array(spaces)].join(" ")}${chalk.cyan(
|
|
124
91
|
subItem.value
|
|
125
92
|
)}`
|
|
126
93
|
);
|
|
@@ -158,12 +125,12 @@ var S_WARN = s("\u25B2", "!");
|
|
|
158
125
|
var S_ERROR = s("\u25A0", "x");
|
|
159
126
|
|
|
160
127
|
// src/utils/spinner.ts
|
|
161
|
-
|
|
128
|
+
import { Spinner } from "cli-spinner";
|
|
162
129
|
async function localSpin({
|
|
163
130
|
waitFor,
|
|
164
131
|
text
|
|
165
132
|
}) {
|
|
166
|
-
const spinner = new
|
|
133
|
+
const spinner = new Spinner({
|
|
167
134
|
text: `${text} %s`,
|
|
168
135
|
stream: process.stderr,
|
|
169
136
|
onTick: function(msg) {
|
|
@@ -194,32 +161,32 @@ function spin({
|
|
|
194
161
|
}
|
|
195
162
|
|
|
196
163
|
// src/utils/theme.ts
|
|
197
|
-
|
|
198
|
-
var successText =
|
|
199
|
-
var focusText =
|
|
200
|
-
var dangerText =
|
|
201
|
-
var neutralText =
|
|
202
|
-
var linkText =
|
|
203
|
-
var labelText =
|
|
204
|
-
var cmdText =
|
|
164
|
+
import chalk2 from "chalk";
|
|
165
|
+
var successText = chalk2.bold.green;
|
|
166
|
+
var focusText = chalk2.bold;
|
|
167
|
+
var dangerText = chalk2.bold.red;
|
|
168
|
+
var neutralText = chalk2.bold.cyan;
|
|
169
|
+
var linkText = chalk2.bold.cyan;
|
|
170
|
+
var labelText = chalk2.bold;
|
|
171
|
+
var cmdText = chalk2.inverse;
|
|
205
172
|
var indentedCmd = (str) => {
|
|
206
173
|
return ` \u2503 ` + str;
|
|
207
174
|
};
|
|
208
175
|
var indentText = (str) => {
|
|
209
176
|
return String(str).split("\n").map((line) => ` ${line}`).join("\n");
|
|
210
177
|
};
|
|
211
|
-
var logText =
|
|
212
|
-
var warnText =
|
|
213
|
-
var titleText =
|
|
214
|
-
var CONFIRMATION_TEXT =
|
|
178
|
+
var logText = chalk2.italic.gray;
|
|
179
|
+
var warnText = chalk2.yellowBright.bgBlack;
|
|
180
|
+
var titleText = chalk2.bgHex("d2f1f8").hex("ec4816");
|
|
181
|
+
var CONFIRMATION_TEXT = chalk2.dim("enter to confirm");
|
|
215
182
|
|
|
216
183
|
// src/next/codegen/index.ts
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
184
|
+
import fs from "fs-extra";
|
|
185
|
+
import path from "path";
|
|
186
|
+
import { buildASTSchema, printSchema as printSchema2 } from "graphql";
|
|
220
187
|
|
|
221
188
|
// src/next/codegen/codegen/index.ts
|
|
222
|
-
|
|
189
|
+
import { parse, printSchema } from "graphql";
|
|
223
190
|
|
|
224
191
|
// src/next/codegen/codegen/plugin.ts
|
|
225
192
|
var AddGeneratedClientFunc = (apiURL) => {
|
|
@@ -288,37 +255,44 @@ var AddGeneratedClient = (apiURL) => ({
|
|
|
288
255
|
});
|
|
289
256
|
|
|
290
257
|
// src/next/codegen/codegen/index.ts
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
258
|
+
import { GraphQLFileLoader } from "@graphql-tools/graphql-file-loader";
|
|
259
|
+
import { codegen } from "@graphql-codegen/core";
|
|
260
|
+
import { loadDocuments } from "@graphql-tools/load";
|
|
261
|
+
import { plugin as typescriptOperationsPlugin } from "@graphql-codegen/typescript-operations";
|
|
262
|
+
import { plugin as typescriptPlugin } from "@graphql-codegen/typescript";
|
|
296
263
|
|
|
297
264
|
// src/next/codegen/codegen/sdkPlugin/index.ts
|
|
298
|
-
|
|
299
|
-
|
|
265
|
+
import { visit } from "graphql";
|
|
266
|
+
import {
|
|
267
|
+
concatAST,
|
|
268
|
+
Kind as Kind2
|
|
269
|
+
} from "graphql";
|
|
300
270
|
|
|
301
271
|
// src/next/codegen/codegen/sdkPlugin/visitor.ts
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
272
|
+
import {
|
|
273
|
+
ClientSideBaseVisitor,
|
|
274
|
+
DocumentMode,
|
|
275
|
+
indentMultiline
|
|
276
|
+
} from "@graphql-codegen/visitor-plugin-common";
|
|
277
|
+
import autoBind from "auto-bind";
|
|
278
|
+
import { Kind, print } from "graphql";
|
|
279
|
+
var GenericSdkVisitor = class extends ClientSideBaseVisitor {
|
|
280
|
+
_operationsToInclude = [];
|
|
306
281
|
constructor(schema, fragments, rawConfig) {
|
|
307
282
|
super(schema, fragments, rawConfig, {
|
|
308
283
|
usingObservableFrom: rawConfig.usingObservableFrom
|
|
309
284
|
});
|
|
310
|
-
this
|
|
311
|
-
(0, import_auto_bind.default)(this);
|
|
285
|
+
autoBind(this);
|
|
312
286
|
if (this.config.usingObservableFrom) {
|
|
313
287
|
this._additionalImports.push(this.config.usingObservableFrom);
|
|
314
288
|
}
|
|
315
|
-
if (this.config.documentMode !==
|
|
289
|
+
if (this.config.documentMode !== DocumentMode.string) {
|
|
316
290
|
}
|
|
317
291
|
}
|
|
318
292
|
buildOperation(node, documentVariableName, operationType, operationResultType, operationVariablesTypes) {
|
|
319
293
|
if (node.name == null) {
|
|
320
294
|
throw new Error(
|
|
321
|
-
"Plugin 'generic-sdk' cannot generate SDK for unnamed operation.\n\n" +
|
|
295
|
+
"Plugin 'generic-sdk' cannot generate SDK for unnamed operation.\n\n" + print(node)
|
|
322
296
|
);
|
|
323
297
|
} else {
|
|
324
298
|
this._operationsToInclude.push({
|
|
@@ -336,14 +310,14 @@ var GenericSdkVisitor = class extends import_visitor_plugin_common.ClientSideBas
|
|
|
336
310
|
const usingObservable = !!this.config.usingObservableFrom;
|
|
337
311
|
const allPossibleActions = this._operationsToInclude.map((o) => {
|
|
338
312
|
const optionalVariables = !o.node.variableDefinitions || o.node.variableDefinitions.length === 0 || o.node.variableDefinitions.every(
|
|
339
|
-
(v) => v.type.kind !==
|
|
313
|
+
(v) => v.type.kind !== Kind.NON_NULL_TYPE || v.defaultValue
|
|
340
314
|
);
|
|
341
315
|
const returnType = usingObservable && o.operationType === "Subscription" ? "Observable" : "Promise";
|
|
342
316
|
return `${o.node.name.value}(variables${optionalVariables ? "?" : ""}: ${o.operationVariablesTypes}, options?: C): ${returnType}<${o.operationResultType}> {
|
|
343
317
|
return requester<${o.operationResultType}, ${o.operationVariablesTypes}>(${o.documentVariableName}, variables, options);
|
|
344
318
|
}`;
|
|
345
|
-
}).map((s2) =>
|
|
346
|
-
return `export type Requester<C= {}> = <R, V>(doc: ${this.config.documentMode ===
|
|
319
|
+
}).map((s2) => indentMultiline(s2, 2));
|
|
320
|
+
return `export type Requester<C= {}> = <R, V>(doc: ${this.config.documentMode === DocumentMode.string ? "string" : "DocumentNode"}, vars?: V, options?: C) => ${usingObservable ? "Promise<R> & Observable<R>" : "Promise<R>"}
|
|
347
321
|
export function getSdk<C>(requester: Requester<C>) {
|
|
348
322
|
return {
|
|
349
323
|
${allPossibleActions.join(",\n")}
|
|
@@ -355,14 +329,14 @@ var GenericSdkVisitor = class extends import_visitor_plugin_common.ClientSideBas
|
|
|
355
329
|
|
|
356
330
|
// src/next/codegen/codegen/sdkPlugin/index.ts
|
|
357
331
|
var plugin = (schema, documents, config2) => {
|
|
358
|
-
const allAst =
|
|
332
|
+
const allAst = concatAST(
|
|
359
333
|
documents.reduce((prev, v) => {
|
|
360
334
|
return [...prev, v.document];
|
|
361
335
|
}, [])
|
|
362
336
|
);
|
|
363
337
|
const allFragments = [
|
|
364
338
|
...allAst.definitions.filter(
|
|
365
|
-
(d) => d.kind ===
|
|
339
|
+
(d) => d.kind === Kind2.FRAGMENT_DEFINITION
|
|
366
340
|
).map((fragmentDef) => ({
|
|
367
341
|
node: fragmentDef,
|
|
368
342
|
name: fragmentDef.name.value,
|
|
@@ -372,7 +346,7 @@ var plugin = (schema, documents, config2) => {
|
|
|
372
346
|
...config2.externalFragments || []
|
|
373
347
|
];
|
|
374
348
|
const visitor = new GenericSdkVisitor(schema, allFragments, config2);
|
|
375
|
-
const visitorResult =
|
|
349
|
+
const visitorResult = visit(allAst, { leave: visitor });
|
|
376
350
|
return {
|
|
377
351
|
// We will take care of imports
|
|
378
352
|
// prepend: visitor.getImports(),
|
|
@@ -390,10 +364,10 @@ var generateTypes = async (schema, queryPathGlob = process.cwd(), fragDocPath =
|
|
|
390
364
|
let fragDocs = [];
|
|
391
365
|
docs = await loadGraphQLDocuments(queryPathGlob);
|
|
392
366
|
fragDocs = await loadGraphQLDocuments(fragDocPath);
|
|
393
|
-
const res = await
|
|
367
|
+
const res = await codegen({
|
|
394
368
|
// Filename is not used. This is because the typescript plugin returns a string instead of writing to a file.
|
|
395
369
|
filename: process.cwd(),
|
|
396
|
-
schema:
|
|
370
|
+
schema: parse(printSchema(schema)),
|
|
397
371
|
documents: [...docs, ...fragDocs],
|
|
398
372
|
config: {},
|
|
399
373
|
plugins: [
|
|
@@ -406,10 +380,10 @@ var generateTypes = async (schema, queryPathGlob = process.cwd(), fragDocPath =
|
|
|
406
380
|
],
|
|
407
381
|
pluginMap: {
|
|
408
382
|
typescript: {
|
|
409
|
-
plugin:
|
|
383
|
+
plugin: typescriptPlugin
|
|
410
384
|
},
|
|
411
385
|
typescriptOperations: {
|
|
412
|
-
plugin:
|
|
386
|
+
plugin: typescriptOperationsPlugin
|
|
413
387
|
},
|
|
414
388
|
typescriptSdk: {
|
|
415
389
|
plugin
|
|
@@ -422,8 +396,8 @@ var generateTypes = async (schema, queryPathGlob = process.cwd(), fragDocPath =
|
|
|
422
396
|
var loadGraphQLDocuments = async (globPath) => {
|
|
423
397
|
let result = [];
|
|
424
398
|
try {
|
|
425
|
-
result = await
|
|
426
|
-
loaders: [new
|
|
399
|
+
result = await loadDocuments(globPath, {
|
|
400
|
+
loaders: [new GraphQLFileLoader()]
|
|
427
401
|
});
|
|
428
402
|
} catch (e) {
|
|
429
403
|
if (
|
|
@@ -440,11 +414,27 @@ var loadGraphQLDocuments = async (globPath) => {
|
|
|
440
414
|
};
|
|
441
415
|
|
|
442
416
|
// src/next/codegen/index.ts
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
417
|
+
import { transform } from "esbuild";
|
|
418
|
+
import { mapUserFields } from "@tinacms/graphql";
|
|
419
|
+
import normalizePath from "normalize-path";
|
|
446
420
|
var TINA_HOST = "content.tinajs.io";
|
|
447
421
|
var Codegen = class {
|
|
422
|
+
configManager;
|
|
423
|
+
port;
|
|
424
|
+
schema;
|
|
425
|
+
queryDoc;
|
|
426
|
+
fragDoc;
|
|
427
|
+
isLocal;
|
|
428
|
+
// The API url used in the client
|
|
429
|
+
apiURL;
|
|
430
|
+
// This is always the local URL.
|
|
431
|
+
localUrl;
|
|
432
|
+
// production url
|
|
433
|
+
productionUrl;
|
|
434
|
+
graphqlSchemaDoc;
|
|
435
|
+
tinaSchema;
|
|
436
|
+
lookup;
|
|
437
|
+
noClientBuildCache;
|
|
448
438
|
constructor({
|
|
449
439
|
configManager,
|
|
450
440
|
port,
|
|
@@ -460,7 +450,7 @@ var Codegen = class {
|
|
|
460
450
|
this.graphqlSchemaDoc = graphqlSchemaDoc;
|
|
461
451
|
this.configManager = configManager;
|
|
462
452
|
this.port = port;
|
|
463
|
-
this.schema =
|
|
453
|
+
this.schema = buildASTSchema(graphqlSchemaDoc);
|
|
464
454
|
this.tinaSchema = tinaSchema;
|
|
465
455
|
this.queryDoc = queryDoc;
|
|
466
456
|
this.fragDoc = fragDoc;
|
|
@@ -468,19 +458,19 @@ var Codegen = class {
|
|
|
468
458
|
this.noClientBuildCache = noClientBuildCache;
|
|
469
459
|
}
|
|
470
460
|
async writeConfigFile(fileName, data) {
|
|
471
|
-
const filePath =
|
|
461
|
+
const filePath = path.join(
|
|
472
462
|
this.configManager.generatedFolderPath,
|
|
473
463
|
fileName
|
|
474
464
|
);
|
|
475
|
-
await
|
|
476
|
-
await
|
|
465
|
+
await fs.ensureFile(filePath);
|
|
466
|
+
await fs.outputFile(filePath, data);
|
|
477
467
|
if (this.configManager.hasSeparateContentRoot()) {
|
|
478
|
-
const filePath2 =
|
|
468
|
+
const filePath2 = path.join(
|
|
479
469
|
this.configManager.generatedFolderPathContentRepo,
|
|
480
470
|
fileName
|
|
481
471
|
);
|
|
482
|
-
await
|
|
483
|
-
await
|
|
472
|
+
await fs.ensureFile(filePath2);
|
|
473
|
+
await fs.outputFile(filePath2, data);
|
|
484
474
|
}
|
|
485
475
|
}
|
|
486
476
|
async removeGeneratedFilesIfExists() {
|
|
@@ -512,11 +502,11 @@ var Codegen = class {
|
|
|
512
502
|
await this.removeGeneratedFilesIfExists();
|
|
513
503
|
return apiURL;
|
|
514
504
|
}
|
|
515
|
-
await
|
|
505
|
+
await fs.outputFile(
|
|
516
506
|
this.configManager.generatedQueriesFilePath,
|
|
517
507
|
this.queryDoc
|
|
518
508
|
);
|
|
519
|
-
await
|
|
509
|
+
await fs.outputFile(
|
|
520
510
|
this.configManager.generatedFragmentsFilePath,
|
|
521
511
|
this.fragDoc
|
|
522
512
|
);
|
|
@@ -524,21 +514,21 @@ var Codegen = class {
|
|
|
524
514
|
const { clientString } = await this.genClient();
|
|
525
515
|
const databaseClientString = this.configManager.hasSelfHostedConfig() ? await this.genDatabaseClient() : "";
|
|
526
516
|
const { codeString, schemaString } = await this.genTypes();
|
|
527
|
-
await
|
|
517
|
+
await fs.outputFile(
|
|
528
518
|
this.configManager.generatedGraphQLGQLPath,
|
|
529
519
|
schemaString
|
|
530
520
|
);
|
|
531
521
|
if (this.configManager.isUsingTs()) {
|
|
532
|
-
await
|
|
522
|
+
await fs.outputFile(
|
|
533
523
|
this.configManager.generatedTypesTSFilePath,
|
|
534
524
|
codeString
|
|
535
525
|
);
|
|
536
|
-
await
|
|
526
|
+
await fs.outputFile(
|
|
537
527
|
this.configManager.generatedClientTSFilePath,
|
|
538
528
|
clientString
|
|
539
529
|
);
|
|
540
530
|
if (this.configManager.hasSelfHostedConfig()) {
|
|
541
|
-
await
|
|
531
|
+
await fs.outputFile(
|
|
542
532
|
this.configManager.generatedDatabaseClientTSFilePath,
|
|
543
533
|
databaseClientString
|
|
544
534
|
);
|
|
@@ -547,35 +537,35 @@ var Codegen = class {
|
|
|
547
537
|
await unlinkIfExists(this.configManager.generatedTypesDFilePath);
|
|
548
538
|
await unlinkIfExists(this.configManager.generatedTypesJSFilePath);
|
|
549
539
|
} else {
|
|
550
|
-
await
|
|
540
|
+
await fs.outputFile(
|
|
551
541
|
this.configManager.generatedTypesDFilePath,
|
|
552
542
|
codeString
|
|
553
543
|
);
|
|
554
|
-
const jsTypes = await
|
|
555
|
-
await
|
|
544
|
+
const jsTypes = await transform(codeString, { loader: "ts" });
|
|
545
|
+
await fs.outputFile(
|
|
556
546
|
this.configManager.generatedTypesJSFilePath,
|
|
557
547
|
jsTypes.code
|
|
558
548
|
);
|
|
559
|
-
await
|
|
549
|
+
await fs.outputFile(
|
|
560
550
|
this.configManager.generatedClientDFilePath,
|
|
561
551
|
clientString
|
|
562
552
|
);
|
|
563
|
-
const jsClient = await
|
|
564
|
-
await
|
|
553
|
+
const jsClient = await transform(clientString, { loader: "ts" });
|
|
554
|
+
await fs.outputFile(
|
|
565
555
|
this.configManager.generatedClientJSFilePath,
|
|
566
556
|
jsClient.code
|
|
567
557
|
);
|
|
568
558
|
await unlinkIfExists(this.configManager.generatedTypesTSFilePath);
|
|
569
559
|
await unlinkIfExists(this.configManager.generatedClientTSFilePath);
|
|
570
560
|
if (this.configManager.hasSelfHostedConfig()) {
|
|
571
|
-
const jsDatabaseClient = await
|
|
561
|
+
const jsDatabaseClient = await transform(databaseClientString, {
|
|
572
562
|
loader: "ts"
|
|
573
563
|
});
|
|
574
|
-
await
|
|
564
|
+
await fs.outputFile(
|
|
575
565
|
this.configManager.generatedDatabaseClientJSFilePath,
|
|
576
566
|
jsDatabaseClient.code
|
|
577
567
|
);
|
|
578
|
-
await
|
|
568
|
+
await fs.outputFile(
|
|
579
569
|
this.configManager.generatedDatabaseClientDFilePath,
|
|
580
570
|
databaseClientString
|
|
581
571
|
);
|
|
@@ -587,13 +577,12 @@ var Codegen = class {
|
|
|
587
577
|
return apiURL;
|
|
588
578
|
}
|
|
589
579
|
_createApiUrl() {
|
|
590
|
-
|
|
591
|
-
const
|
|
592
|
-
const
|
|
593
|
-
const token = (_c = this.configManager.config) == null ? void 0 : _c.token;
|
|
580
|
+
const branch = this.configManager.config?.branch;
|
|
581
|
+
const clientId = this.configManager.config?.clientId;
|
|
582
|
+
const token = this.configManager.config?.token;
|
|
594
583
|
const fullVersion = this.configManager.getTinaGraphQLVersion();
|
|
595
584
|
const version2 = `${fullVersion.major}.${fullVersion.minor}`;
|
|
596
|
-
const baseUrl =
|
|
585
|
+
const baseUrl = this.configManager.config.tinaioConfig?.contentApiUrlOverride || `https://${TINA_HOST}`;
|
|
597
586
|
if ((!branch || !clientId || !token) && !this.port && !this.configManager.config.contentApiUrlOverride) {
|
|
598
587
|
const missing = [];
|
|
599
588
|
if (!branch) missing.push("branch");
|
|
@@ -602,7 +591,7 @@ var Codegen = class {
|
|
|
602
591
|
throw new Error(
|
|
603
592
|
`Client not configured properly. Missing ${missing.join(
|
|
604
593
|
", "
|
|
605
|
-
)}. Please visit https://tina.io/docs/
|
|
594
|
+
)}. Please visit https://tina.io/docs/r/what-is-tinacloud for more information`
|
|
606
595
|
);
|
|
607
596
|
}
|
|
608
597
|
let localUrl = `http://localhost:${this.port}/graphql`;
|
|
@@ -621,18 +610,17 @@ var Codegen = class {
|
|
|
621
610
|
return this.apiURL;
|
|
622
611
|
}
|
|
623
612
|
async genDatabaseClient() {
|
|
624
|
-
var _a, _b;
|
|
625
613
|
const authCollection = this.tinaSchema.getCollections().find((c) => c.isAuthCollection);
|
|
626
614
|
let authFields = [];
|
|
627
615
|
if (authCollection) {
|
|
628
|
-
const usersFields =
|
|
616
|
+
const usersFields = mapUserFields(authCollection, []);
|
|
629
617
|
if (usersFields.length === 0) {
|
|
630
618
|
throw new Error("No user field found");
|
|
631
619
|
}
|
|
632
620
|
if (usersFields.length > 1) {
|
|
633
621
|
throw new Error("Only one user field is allowed");
|
|
634
622
|
}
|
|
635
|
-
authFields =
|
|
623
|
+
authFields = usersFields[0]?.collectable?.fields.map((f) => {
|
|
636
624
|
if (f.type !== "password" && f.type !== "object") {
|
|
637
625
|
if (f.uid) {
|
|
638
626
|
return `id:${f.name}`;
|
|
@@ -710,13 +698,12 @@ export default databaseClient;
|
|
|
710
698
|
`;
|
|
711
699
|
}
|
|
712
700
|
async genClient() {
|
|
713
|
-
|
|
714
|
-
const
|
|
715
|
-
const errorPolicy = (_c = (_b = this.configManager.config) == null ? void 0 : _b.client) == null ? void 0 : _c.errorPolicy;
|
|
701
|
+
const token = this.configManager.config?.token;
|
|
702
|
+
const errorPolicy = this.configManager.config?.client?.errorPolicy;
|
|
716
703
|
const apiURL = this.getApiURL();
|
|
717
704
|
const clientString = `import { createClient } from "tinacms/dist/client";
|
|
718
705
|
import { queries } from "./types";
|
|
719
|
-
export const client = createClient({ ${this.noClientBuildCache === false ? `cacheDir: '${(
|
|
706
|
+
export const client = createClient({ ${this.noClientBuildCache === false ? `cacheDir: '${normalizePath(
|
|
720
707
|
this.configManager.generatedCachePath
|
|
721
708
|
)}', ` : ""}url: '${apiURL}', token: '${token}', queries, ${errorPolicy ? `errorPolicy: '${errorPolicy}'` : ""} });
|
|
722
709
|
export default client;
|
|
@@ -742,7 +729,7 @@ export default client;
|
|
|
742
729
|
${typescriptTypes}
|
|
743
730
|
`;
|
|
744
731
|
const schemaString = `# DO NOT MODIFY THIS FILE. This file is automatically generated by Tina
|
|
745
|
-
${(
|
|
732
|
+
${printSchema2(this.schema)}
|
|
746
733
|
schema {
|
|
747
734
|
query: Query
|
|
748
735
|
mutation: Mutation
|
|
@@ -754,7 +741,7 @@ schema {
|
|
|
754
741
|
var maybeWarnFragmentSize = async (filepath) => {
|
|
755
742
|
if (
|
|
756
743
|
// is the file bigger than 100kb?
|
|
757
|
-
(await
|
|
744
|
+
(await fs.stat(filepath)).size > // convert to 100 kb to bytes
|
|
758
745
|
100 * 1024
|
|
759
746
|
) {
|
|
760
747
|
console.warn(
|
|
@@ -771,19 +758,34 @@ var maybeWarnFragmentSize = async (filepath) => {
|
|
|
771
758
|
}
|
|
772
759
|
};
|
|
773
760
|
var unlinkIfExists = async (filepath) => {
|
|
774
|
-
if (
|
|
775
|
-
|
|
761
|
+
if (fs.existsSync(filepath)) {
|
|
762
|
+
fs.unlinkSync(filepath);
|
|
776
763
|
}
|
|
777
764
|
};
|
|
778
765
|
|
|
779
766
|
// src/next/config-manager.ts
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
767
|
+
import fs2 from "fs-extra";
|
|
768
|
+
import path3 from "path";
|
|
769
|
+
import os from "os";
|
|
770
|
+
import { pathToFileURL } from "url";
|
|
771
|
+
import * as esbuild from "esbuild";
|
|
772
|
+
import * as dotenv from "dotenv";
|
|
773
|
+
import normalizePath2 from "normalize-path";
|
|
774
|
+
import chalk3 from "chalk";
|
|
775
|
+
import { createRequire } from "module";
|
|
776
|
+
|
|
777
|
+
// src/utils/path.ts
|
|
778
|
+
import path2 from "path";
|
|
779
|
+
function stripNativeTrailingSlash(p) {
|
|
780
|
+
const { root } = path2.parse(p);
|
|
781
|
+
let str = p;
|
|
782
|
+
while (str.length > root.length && str.endsWith(path2.sep)) {
|
|
783
|
+
str = str.slice(0, -1);
|
|
784
|
+
}
|
|
785
|
+
return str;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
// src/next/config-manager.ts
|
|
787
789
|
var TINA_FOLDER = "tina";
|
|
788
790
|
var LEGACY_TINA_FOLDER = ".tina";
|
|
789
791
|
var GENERATED_FOLDER = "__generated__";
|
|
@@ -792,17 +794,57 @@ var GRAPHQL_GQL_FILE = "schema.gql";
|
|
|
792
794
|
var SCHEMA_JSON_FILE = "_schema.json";
|
|
793
795
|
var LOOKUP_JSON_FILE = "_lookup.json";
|
|
794
796
|
var ConfigManager = class {
|
|
797
|
+
config;
|
|
798
|
+
rootPath;
|
|
799
|
+
tinaFolderPath;
|
|
800
|
+
isUsingLegacyFolder;
|
|
801
|
+
tinaConfigFilePath;
|
|
802
|
+
tinaSpaPackagePath;
|
|
803
|
+
contentRootPath;
|
|
804
|
+
envFilePath;
|
|
805
|
+
generatedCachePath;
|
|
806
|
+
generatedFolderPath;
|
|
807
|
+
generatedFolderPathContentRepo;
|
|
808
|
+
generatedGraphQLGQLPath;
|
|
809
|
+
generatedGraphQLJSONPath;
|
|
810
|
+
generatedSchemaJSONPath;
|
|
811
|
+
generatedLookupJSONPath;
|
|
812
|
+
generatedTypesTSFilePath;
|
|
813
|
+
generatedTypesJSFilePath;
|
|
814
|
+
generatedTypesDFilePath;
|
|
815
|
+
generatedClientTSFilePath;
|
|
816
|
+
generatedClientJSFilePath;
|
|
817
|
+
generatedClientDFilePath;
|
|
818
|
+
generatedDatabaseClientJSFilePath;
|
|
819
|
+
generatedDatabaseClientTSFilePath;
|
|
820
|
+
generatedDatabaseClientDFilePath;
|
|
821
|
+
generatedQueriesFilePath;
|
|
822
|
+
generatedFragmentsFilePath;
|
|
823
|
+
generatedQueriesAndFragmentsGlob;
|
|
824
|
+
userQueriesAndFragmentsGlob;
|
|
825
|
+
publicFolderPath;
|
|
826
|
+
outputFolderPath;
|
|
827
|
+
outputHTMLFilePath;
|
|
828
|
+
outputGitignorePath;
|
|
829
|
+
selfHostedDatabaseFilePath;
|
|
830
|
+
prebuildFilePath;
|
|
831
|
+
spaRootPath;
|
|
832
|
+
spaMainPath;
|
|
833
|
+
spaHTMLPath;
|
|
834
|
+
tinaGraphQLVersionFromCLI;
|
|
835
|
+
legacyNoSDK;
|
|
836
|
+
watchList;
|
|
795
837
|
constructor({
|
|
796
838
|
rootPath = process.cwd(),
|
|
797
839
|
tinaGraphQLVersion,
|
|
798
840
|
legacyNoSDK
|
|
799
841
|
}) {
|
|
800
|
-
this.rootPath = (
|
|
842
|
+
this.rootPath = normalizePath2(rootPath);
|
|
801
843
|
this.tinaGraphQLVersionFromCLI = tinaGraphQLVersion;
|
|
802
844
|
this.legacyNoSDK = legacyNoSDK;
|
|
803
845
|
}
|
|
804
846
|
isUsingTs() {
|
|
805
|
-
return [".ts", ".tsx"].includes(
|
|
847
|
+
return [".ts", ".tsx"].includes(path3.extname(this.tinaConfigFilePath));
|
|
806
848
|
}
|
|
807
849
|
hasSelfHostedConfig() {
|
|
808
850
|
return !!this.selfHostedDatabaseFilePath;
|
|
@@ -811,20 +853,20 @@ var ConfigManager = class {
|
|
|
811
853
|
return this.rootPath !== this.contentRootPath;
|
|
812
854
|
}
|
|
813
855
|
shouldSkipSDK() {
|
|
814
|
-
var _a;
|
|
815
856
|
if (this.legacyNoSDK) {
|
|
816
857
|
return this.legacyNoSDK;
|
|
817
858
|
}
|
|
818
|
-
return
|
|
859
|
+
return this.config.client?.skip || false;
|
|
819
860
|
}
|
|
820
861
|
async processConfig() {
|
|
862
|
+
const require2 = createRequire(import.meta.url);
|
|
821
863
|
this.tinaFolderPath = await this.getTinaFolderPath(this.rootPath);
|
|
822
|
-
this.envFilePath =
|
|
823
|
-
|
|
864
|
+
this.envFilePath = path3.resolve(
|
|
865
|
+
path3.join(this.tinaFolderPath, "..", ".env")
|
|
824
866
|
);
|
|
825
867
|
dotenv.config({ path: this.envFilePath });
|
|
826
868
|
this.tinaConfigFilePath = await this.getPathWithExtension(
|
|
827
|
-
|
|
869
|
+
path3.join(this.tinaFolderPath, "config")
|
|
828
870
|
);
|
|
829
871
|
if (!this.tinaConfigFilePath) {
|
|
830
872
|
throw new Error(
|
|
@@ -832,89 +874,89 @@ var ConfigManager = class {
|
|
|
832
874
|
);
|
|
833
875
|
}
|
|
834
876
|
this.selfHostedDatabaseFilePath = await this.getPathWithExtension(
|
|
835
|
-
|
|
877
|
+
path3.join(this.tinaFolderPath, "database")
|
|
836
878
|
);
|
|
837
|
-
this.generatedFolderPath =
|
|
838
|
-
this.generatedCachePath =
|
|
879
|
+
this.generatedFolderPath = path3.join(this.tinaFolderPath, GENERATED_FOLDER);
|
|
880
|
+
this.generatedCachePath = path3.join(
|
|
839
881
|
this.generatedFolderPath,
|
|
840
882
|
".cache",
|
|
841
883
|
String((/* @__PURE__ */ new Date()).getTime())
|
|
842
884
|
);
|
|
843
|
-
this.generatedGraphQLGQLPath =
|
|
885
|
+
this.generatedGraphQLGQLPath = path3.join(
|
|
844
886
|
this.generatedFolderPath,
|
|
845
887
|
GRAPHQL_GQL_FILE
|
|
846
888
|
);
|
|
847
|
-
this.generatedGraphQLJSONPath =
|
|
889
|
+
this.generatedGraphQLJSONPath = path3.join(
|
|
848
890
|
this.generatedFolderPath,
|
|
849
891
|
GRAPHQL_JSON_FILE
|
|
850
892
|
);
|
|
851
|
-
this.generatedSchemaJSONPath =
|
|
893
|
+
this.generatedSchemaJSONPath = path3.join(
|
|
852
894
|
this.generatedFolderPath,
|
|
853
895
|
SCHEMA_JSON_FILE
|
|
854
896
|
);
|
|
855
|
-
this.generatedLookupJSONPath =
|
|
897
|
+
this.generatedLookupJSONPath = path3.join(
|
|
856
898
|
this.generatedFolderPath,
|
|
857
899
|
LOOKUP_JSON_FILE
|
|
858
900
|
);
|
|
859
|
-
this.generatedQueriesFilePath =
|
|
901
|
+
this.generatedQueriesFilePath = path3.join(
|
|
860
902
|
this.generatedFolderPath,
|
|
861
903
|
"queries.gql"
|
|
862
904
|
);
|
|
863
|
-
this.generatedFragmentsFilePath =
|
|
905
|
+
this.generatedFragmentsFilePath = path3.join(
|
|
864
906
|
this.generatedFolderPath,
|
|
865
907
|
"frags.gql"
|
|
866
908
|
);
|
|
867
|
-
this.generatedTypesTSFilePath =
|
|
909
|
+
this.generatedTypesTSFilePath = path3.join(
|
|
868
910
|
this.generatedFolderPath,
|
|
869
911
|
"types.ts"
|
|
870
912
|
);
|
|
871
|
-
this.generatedTypesJSFilePath =
|
|
913
|
+
this.generatedTypesJSFilePath = path3.join(
|
|
872
914
|
this.generatedFolderPath,
|
|
873
915
|
"types.js"
|
|
874
916
|
);
|
|
875
|
-
this.generatedTypesDFilePath =
|
|
917
|
+
this.generatedTypesDFilePath = path3.join(
|
|
876
918
|
this.generatedFolderPath,
|
|
877
919
|
"types.d.ts"
|
|
878
920
|
);
|
|
879
|
-
this.userQueriesAndFragmentsGlob =
|
|
921
|
+
this.userQueriesAndFragmentsGlob = path3.join(
|
|
880
922
|
this.tinaFolderPath,
|
|
881
923
|
"queries/**/*.{graphql,gql}"
|
|
882
924
|
);
|
|
883
|
-
this.generatedQueriesAndFragmentsGlob =
|
|
925
|
+
this.generatedQueriesAndFragmentsGlob = path3.join(
|
|
884
926
|
this.generatedFolderPath,
|
|
885
927
|
"*.{graphql,gql}"
|
|
886
928
|
);
|
|
887
|
-
this.generatedClientTSFilePath =
|
|
929
|
+
this.generatedClientTSFilePath = path3.join(
|
|
888
930
|
this.generatedFolderPath,
|
|
889
931
|
"client.ts"
|
|
890
932
|
);
|
|
891
|
-
this.generatedClientJSFilePath =
|
|
933
|
+
this.generatedClientJSFilePath = path3.join(
|
|
892
934
|
this.generatedFolderPath,
|
|
893
935
|
"client.js"
|
|
894
936
|
);
|
|
895
|
-
this.generatedClientDFilePath =
|
|
937
|
+
this.generatedClientDFilePath = path3.join(
|
|
896
938
|
this.generatedFolderPath,
|
|
897
939
|
"client.d.ts"
|
|
898
940
|
);
|
|
899
|
-
this.generatedDatabaseClientDFilePath =
|
|
941
|
+
this.generatedDatabaseClientDFilePath = path3.join(
|
|
900
942
|
this.generatedFolderPath,
|
|
901
943
|
"databaseClient.d.ts"
|
|
902
944
|
);
|
|
903
|
-
this.generatedDatabaseClientTSFilePath =
|
|
945
|
+
this.generatedDatabaseClientTSFilePath = path3.join(
|
|
904
946
|
this.generatedFolderPath,
|
|
905
947
|
"databaseClient.ts"
|
|
906
948
|
);
|
|
907
|
-
this.generatedDatabaseClientJSFilePath =
|
|
949
|
+
this.generatedDatabaseClientJSFilePath = path3.join(
|
|
908
950
|
this.generatedFolderPath,
|
|
909
951
|
"databaseClient.js"
|
|
910
952
|
);
|
|
911
|
-
const clientExists = this.isUsingTs() ? await
|
|
953
|
+
const clientExists = this.isUsingTs() ? await fs2.pathExists(this.generatedClientTSFilePath) : await fs2.pathExists(this.generatedClientJSFilePath);
|
|
912
954
|
if (!clientExists) {
|
|
913
955
|
const file = "export default ()=>({})\nexport const client = ()=>({})";
|
|
914
956
|
if (this.isUsingTs()) {
|
|
915
|
-
await
|
|
957
|
+
await fs2.outputFile(this.generatedClientTSFilePath, file);
|
|
916
958
|
} else {
|
|
917
|
-
await
|
|
959
|
+
await fs2.outputFile(this.generatedClientJSFilePath, file);
|
|
918
960
|
}
|
|
919
961
|
}
|
|
920
962
|
const { config: config2, prebuildPath, watchList } = await this.loadConfigFile(
|
|
@@ -924,30 +966,29 @@ var ConfigManager = class {
|
|
|
924
966
|
this.watchList = watchList;
|
|
925
967
|
this.config = config2;
|
|
926
968
|
this.prebuildFilePath = prebuildPath;
|
|
927
|
-
this.publicFolderPath =
|
|
969
|
+
this.publicFolderPath = path3.join(
|
|
928
970
|
this.rootPath,
|
|
929
971
|
this.config.build.publicFolder
|
|
930
972
|
);
|
|
931
|
-
this.outputFolderPath =
|
|
973
|
+
this.outputFolderPath = path3.join(
|
|
932
974
|
this.publicFolderPath,
|
|
933
975
|
this.config.build.outputFolder
|
|
934
976
|
);
|
|
935
|
-
this.outputHTMLFilePath =
|
|
936
|
-
this.outputGitignorePath =
|
|
937
|
-
const fullLocalContentPath =
|
|
938
|
-
this.tinaFolderPath,
|
|
939
|
-
this.config.localContentPath || ""
|
|
977
|
+
this.outputHTMLFilePath = path3.join(this.outputFolderPath, "index.html");
|
|
978
|
+
this.outputGitignorePath = path3.join(this.outputFolderPath, ".gitignore");
|
|
979
|
+
const fullLocalContentPath = stripNativeTrailingSlash(
|
|
980
|
+
path3.join(this.tinaFolderPath, this.config.localContentPath || "")
|
|
940
981
|
);
|
|
941
982
|
if (this.config.localContentPath) {
|
|
942
|
-
const localContentPathExists = await
|
|
983
|
+
const localContentPathExists = await fs2.pathExists(fullLocalContentPath);
|
|
943
984
|
if (localContentPathExists) {
|
|
944
985
|
logger.info(`Using separate content repo at ${fullLocalContentPath}`);
|
|
945
986
|
this.contentRootPath = fullLocalContentPath;
|
|
946
987
|
} else {
|
|
947
988
|
logger.warn(
|
|
948
|
-
`${
|
|
989
|
+
`${chalk3.yellow("Warning:")} The localContentPath ${chalk3.cyan(
|
|
949
990
|
fullLocalContentPath
|
|
950
|
-
)} does not exist. Please create it or remove the localContentPath from your config file at ${
|
|
991
|
+
)} does not exist. Please create it or remove the localContentPath from your config file at ${chalk3.cyan(
|
|
951
992
|
this.tinaConfigFilePath
|
|
952
993
|
)}`
|
|
953
994
|
);
|
|
@@ -956,22 +997,22 @@ var ConfigManager = class {
|
|
|
956
997
|
if (!this.contentRootPath) {
|
|
957
998
|
this.contentRootPath = this.rootPath;
|
|
958
999
|
}
|
|
959
|
-
this.generatedFolderPathContentRepo =
|
|
1000
|
+
this.generatedFolderPathContentRepo = path3.join(
|
|
960
1001
|
await this.getTinaFolderPath(this.contentRootPath),
|
|
961
1002
|
GENERATED_FOLDER
|
|
962
1003
|
);
|
|
963
|
-
this.spaMainPath =
|
|
964
|
-
this.spaRootPath =
|
|
1004
|
+
this.spaMainPath = require2.resolve("@tinacms/app");
|
|
1005
|
+
this.spaRootPath = path3.join(this.spaMainPath, "..", "..");
|
|
965
1006
|
}
|
|
966
1007
|
async getTinaFolderPath(rootPath) {
|
|
967
|
-
const tinaFolderPath =
|
|
968
|
-
const tinaFolderExists = await
|
|
1008
|
+
const tinaFolderPath = path3.join(rootPath, TINA_FOLDER);
|
|
1009
|
+
const tinaFolderExists = await fs2.pathExists(tinaFolderPath);
|
|
969
1010
|
if (tinaFolderExists) {
|
|
970
1011
|
this.isUsingLegacyFolder = false;
|
|
971
1012
|
return tinaFolderPath;
|
|
972
1013
|
}
|
|
973
|
-
const legacyFolderPath =
|
|
974
|
-
const legacyFolderExists = await
|
|
1014
|
+
const legacyFolderPath = path3.join(rootPath, LEGACY_TINA_FOLDER);
|
|
1015
|
+
const legacyFolderExists = await fs2.pathExists(legacyFolderPath);
|
|
975
1016
|
if (legacyFolderExists) {
|
|
976
1017
|
this.isUsingLegacyFolder = true;
|
|
977
1018
|
return legacyFolderPath;
|
|
@@ -990,8 +1031,8 @@ var ConfigManager = class {
|
|
|
990
1031
|
patch: version2[2] || "x"
|
|
991
1032
|
};
|
|
992
1033
|
}
|
|
993
|
-
const generatedSchema =
|
|
994
|
-
if (!generatedSchema || !(typeof
|
|
1034
|
+
const generatedSchema = fs2.readJSONSync(this.generatedSchemaJSONPath);
|
|
1035
|
+
if (!generatedSchema || !(typeof generatedSchema?.version !== "undefined")) {
|
|
995
1036
|
throw new Error(
|
|
996
1037
|
`Can not find Tina GraphQL version in ${this.generatedSchemaJSONPath}`
|
|
997
1038
|
);
|
|
@@ -1037,7 +1078,7 @@ var ConfigManager = class {
|
|
|
1037
1078
|
return;
|
|
1038
1079
|
}
|
|
1039
1080
|
const filepathWithExtension = `${filepath}.${ext}`;
|
|
1040
|
-
const exists =
|
|
1081
|
+
const exists = fs2.existsSync(filepathWithExtension);
|
|
1041
1082
|
if (exists) {
|
|
1042
1083
|
result = filepathWithExtension;
|
|
1043
1084
|
}
|
|
@@ -1046,33 +1087,45 @@ var ConfigManager = class {
|
|
|
1046
1087
|
return result;
|
|
1047
1088
|
}
|
|
1048
1089
|
async loadDatabaseFile() {
|
|
1049
|
-
const tmpdir =
|
|
1050
|
-
const outfile =
|
|
1090
|
+
const tmpdir = path3.join(os.tmpdir(), Date.now().toString());
|
|
1091
|
+
const outfile = path3.join(tmpdir, "database.build.mjs");
|
|
1051
1092
|
await esbuild.build({
|
|
1052
1093
|
entryPoints: [this.selfHostedDatabaseFilePath],
|
|
1053
1094
|
bundle: true,
|
|
1054
1095
|
platform: "node",
|
|
1096
|
+
format: "esm",
|
|
1055
1097
|
outfile,
|
|
1056
|
-
loader: loaders
|
|
1098
|
+
loader: loaders,
|
|
1099
|
+
// Provide a require() polyfill for ESM bundles containing CommonJS packages.
|
|
1100
|
+
// Some bundled packages (e.g., 'scmp' used by 'mongodb-level') use require('crypto').
|
|
1101
|
+
// When esbuild inlines these CommonJS packages, it keeps the require() calls,
|
|
1102
|
+
// but ESM doesn't have a global require. This banner creates one using Node.js's
|
|
1103
|
+
// official createRequire API, allowing the bundled CommonJS code to work in ESM.
|
|
1104
|
+
banner: {
|
|
1105
|
+
js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`
|
|
1106
|
+
}
|
|
1057
1107
|
});
|
|
1058
|
-
const result =
|
|
1059
|
-
|
|
1108
|
+
const result = await import(pathToFileURL(outfile).href);
|
|
1109
|
+
fs2.removeSync(outfile);
|
|
1060
1110
|
return result.default;
|
|
1061
1111
|
}
|
|
1062
1112
|
async loadConfigFile(generatedFolderPath, configFilePath) {
|
|
1063
|
-
const tmpdir =
|
|
1064
|
-
const preBuildConfigPath =
|
|
1113
|
+
const tmpdir = path3.join(os.tmpdir(), Date.now().toString());
|
|
1114
|
+
const preBuildConfigPath = path3.join(
|
|
1065
1115
|
this.generatedFolderPath,
|
|
1066
1116
|
"config.prebuild.jsx"
|
|
1067
1117
|
);
|
|
1068
|
-
const outfile =
|
|
1069
|
-
const outfile2 =
|
|
1070
|
-
const tempTSConfigFile =
|
|
1071
|
-
|
|
1118
|
+
const outfile = path3.join(tmpdir, "config.build.jsx");
|
|
1119
|
+
const outfile2 = path3.join(tmpdir, "config.build.mjs");
|
|
1120
|
+
const tempTSConfigFile = path3.join(tmpdir, "tsconfig.json");
|
|
1121
|
+
const esmRequireBanner = {
|
|
1122
|
+
js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`
|
|
1123
|
+
};
|
|
1124
|
+
fs2.outputFileSync(tempTSConfigFile, "{}");
|
|
1072
1125
|
const result2 = await esbuild.build({
|
|
1073
1126
|
entryPoints: [configFilePath],
|
|
1074
1127
|
bundle: true,
|
|
1075
|
-
target: ["
|
|
1128
|
+
target: ["esnext"],
|
|
1076
1129
|
platform: "browser",
|
|
1077
1130
|
format: "esm",
|
|
1078
1131
|
logLevel: "silent",
|
|
@@ -1092,31 +1145,34 @@ var ConfigManager = class {
|
|
|
1092
1145
|
await esbuild.build({
|
|
1093
1146
|
entryPoints: [configFilePath],
|
|
1094
1147
|
bundle: true,
|
|
1095
|
-
target: ["
|
|
1148
|
+
target: ["esnext"],
|
|
1096
1149
|
logLevel: "silent",
|
|
1097
1150
|
platform: "node",
|
|
1151
|
+
format: "esm",
|
|
1098
1152
|
outfile,
|
|
1099
|
-
loader: loaders
|
|
1153
|
+
loader: loaders,
|
|
1154
|
+
banner: esmRequireBanner
|
|
1100
1155
|
});
|
|
1101
1156
|
await esbuild.build({
|
|
1102
1157
|
entryPoints: [outfile],
|
|
1103
1158
|
bundle: true,
|
|
1104
|
-
// Suppress warning about comparison with -0 from client module
|
|
1105
1159
|
logLevel: "silent",
|
|
1106
1160
|
platform: "node",
|
|
1161
|
+
target: ["esnext"],
|
|
1162
|
+
format: "esm",
|
|
1107
1163
|
outfile: outfile2,
|
|
1108
1164
|
loader: loaders
|
|
1109
1165
|
});
|
|
1110
1166
|
let result;
|
|
1111
1167
|
try {
|
|
1112
|
-
result =
|
|
1168
|
+
result = await import(pathToFileURL(outfile2).href);
|
|
1113
1169
|
} catch (e) {
|
|
1114
1170
|
console.error("Unexpected error loading config");
|
|
1115
1171
|
console.error(e);
|
|
1116
1172
|
throw e;
|
|
1117
1173
|
}
|
|
1118
|
-
|
|
1119
|
-
|
|
1174
|
+
fs2.removeSync(outfile);
|
|
1175
|
+
fs2.removeSync(outfile2);
|
|
1120
1176
|
return {
|
|
1121
1177
|
config: result.default,
|
|
1122
1178
|
prebuildPath: preBuildConfigPath,
|
|
@@ -1151,24 +1207,28 @@ var loaders = {
|
|
|
1151
1207
|
};
|
|
1152
1208
|
|
|
1153
1209
|
// src/next/database.ts
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1210
|
+
import {
|
|
1211
|
+
createDatabaseInternal,
|
|
1212
|
+
FilesystemBridge,
|
|
1213
|
+
TinaLevelClient
|
|
1214
|
+
} from "@tinacms/graphql";
|
|
1215
|
+
import { pipeline } from "readable-stream";
|
|
1216
|
+
import { createServer } from "net";
|
|
1217
|
+
import { ManyLevelHost } from "many-level";
|
|
1218
|
+
import { MemoryLevel } from "memory-level";
|
|
1159
1219
|
var createDBServer = (port) => {
|
|
1160
|
-
const levelHost = new
|
|
1220
|
+
const levelHost = new ManyLevelHost(
|
|
1161
1221
|
// @ts-ignore
|
|
1162
|
-
new
|
|
1222
|
+
new MemoryLevel({
|
|
1163
1223
|
valueEncoding: "json"
|
|
1164
1224
|
})
|
|
1165
1225
|
);
|
|
1166
|
-
const dbServer =
|
|
1167
|
-
return
|
|
1226
|
+
const dbServer = createServer(function(socket) {
|
|
1227
|
+
return pipeline(socket, levelHost.createRpcStream(), socket, () => {
|
|
1168
1228
|
});
|
|
1169
1229
|
});
|
|
1170
1230
|
dbServer.once("error", (err) => {
|
|
1171
|
-
if (
|
|
1231
|
+
if (err?.code === "EADDRINUSE") {
|
|
1172
1232
|
throw new Error(
|
|
1173
1233
|
`Tina Dev server is already in use. Datalayer server is busy on port ${port}`
|
|
1174
1234
|
);
|
|
@@ -1178,7 +1238,7 @@ var createDBServer = (port) => {
|
|
|
1178
1238
|
};
|
|
1179
1239
|
async function createAndInitializeDatabase(configManager, datalayerPort, bridgeOverride) {
|
|
1180
1240
|
let database;
|
|
1181
|
-
const bridge = bridgeOverride || new
|
|
1241
|
+
const bridge = bridgeOverride || new FilesystemBridge(configManager.rootPath, configManager.contentRootPath);
|
|
1182
1242
|
if (configManager.hasSelfHostedConfig() && configManager.config.contentApiUrlOverride) {
|
|
1183
1243
|
database = await configManager.loadDatabaseFile();
|
|
1184
1244
|
database.bridge = bridge;
|
|
@@ -1190,9 +1250,9 @@ async function createAndInitializeDatabase(configManager, datalayerPort, bridgeO
|
|
|
1190
1250
|
)} but there was no "contentApiUrlOverride" set. Falling back to built-in datalayer`
|
|
1191
1251
|
);
|
|
1192
1252
|
}
|
|
1193
|
-
const level = new
|
|
1253
|
+
const level = new TinaLevelClient(datalayerPort);
|
|
1194
1254
|
level.openConnection();
|
|
1195
|
-
database =
|
|
1255
|
+
database = createDatabaseInternal({
|
|
1196
1256
|
bridge,
|
|
1197
1257
|
level,
|
|
1198
1258
|
tinaDirectory: configManager.isUsingLegacyFolder ? LEGACY_TINA_FOLDER : TINA_FOLDER
|
|
@@ -1202,17 +1262,17 @@ async function createAndInitializeDatabase(configManager, datalayerPort, bridgeO
|
|
|
1202
1262
|
}
|
|
1203
1263
|
|
|
1204
1264
|
// src/next/commands/baseCommands.ts
|
|
1205
|
-
|
|
1206
|
-
|
|
1265
|
+
import { Command, Option } from "clipanion";
|
|
1266
|
+
import chalk4 from "chalk";
|
|
1207
1267
|
|
|
1208
1268
|
// src/utils/start-subprocess.ts
|
|
1209
|
-
|
|
1269
|
+
import childProcess from "child_process";
|
|
1210
1270
|
var startSubprocess2 = async ({ command: command2 }) => {
|
|
1211
1271
|
if (typeof command2 === "string") {
|
|
1212
1272
|
const commands = command2.split(" ");
|
|
1213
1273
|
const firstCommand = commands[0];
|
|
1214
1274
|
const args = commands.slice(1) || [];
|
|
1215
|
-
const ps =
|
|
1275
|
+
const ps = childProcess.spawn(firstCommand, args, {
|
|
1216
1276
|
stdio: "inherit",
|
|
1217
1277
|
shell: true
|
|
1218
1278
|
});
|
|
@@ -1236,45 +1296,42 @@ stack: ${code.stack || "No stack was provided"}`);
|
|
|
1236
1296
|
};
|
|
1237
1297
|
|
|
1238
1298
|
// src/next/commands/baseCommands.ts
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
var BaseCommand = class extends
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
description: "Disable anonymous telemetry that is collected"
|
|
1270
|
-
});
|
|
1271
|
-
}
|
|
1299
|
+
import { getChangedFiles, getSha, shaExists } from "@tinacms/graphql";
|
|
1300
|
+
import fs3 from "fs-extra";
|
|
1301
|
+
var BaseCommand = class extends Command {
|
|
1302
|
+
experimentalDataLayer = Option.Boolean("--experimentalData", {
|
|
1303
|
+
description: "DEPRECATED - Build the server with additional data querying capabilities"
|
|
1304
|
+
});
|
|
1305
|
+
isomorphicGitBridge = Option.Boolean("--isomorphicGitBridge", {
|
|
1306
|
+
description: "DEPRECATED - Enable Isomorphic Git Bridge Implementation"
|
|
1307
|
+
});
|
|
1308
|
+
port = Option.String("-p,--port", "4001", {
|
|
1309
|
+
description: "Specify a port to run the server on. (default 4001)"
|
|
1310
|
+
});
|
|
1311
|
+
datalayerPort = Option.String("--datalayer-port", "9000", {
|
|
1312
|
+
description: "Specify a port to run the datalayer server on. (default 9000)"
|
|
1313
|
+
});
|
|
1314
|
+
subCommand = Option.String("-c,--command", {
|
|
1315
|
+
description: "The sub-command to run"
|
|
1316
|
+
});
|
|
1317
|
+
rootPath = Option.String("--rootPath", {
|
|
1318
|
+
description: "Specify the root directory to run the CLI from (defaults to current working directory)"
|
|
1319
|
+
});
|
|
1320
|
+
verbose = Option.Boolean("-v,--verbose", false, {
|
|
1321
|
+
description: "increase verbosity of logged output"
|
|
1322
|
+
});
|
|
1323
|
+
noSDK = Option.Boolean("--noSDK", false, {
|
|
1324
|
+
description: "DEPRECATED - This should now be set in the config at client.skip = true'. Don't generate the generated client SDK"
|
|
1325
|
+
});
|
|
1326
|
+
noTelemetry = Option.Boolean("--noTelemetry", false, {
|
|
1327
|
+
description: "Disable anonymous telemetry that is collected"
|
|
1328
|
+
});
|
|
1272
1329
|
async startSubCommand() {
|
|
1273
1330
|
let subProc;
|
|
1274
1331
|
if (this.subCommand) {
|
|
1275
1332
|
subProc = await startSubprocess2({ command: this.subCommand });
|
|
1276
1333
|
logger.info(
|
|
1277
|
-
`Running web application with command: ${
|
|
1334
|
+
`Running web application with command: ${chalk4.cyan(this.subCommand)}`
|
|
1278
1335
|
);
|
|
1279
1336
|
}
|
|
1280
1337
|
function exitHandler(options, exitCode) {
|
|
@@ -1319,11 +1376,10 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1319
1376
|
const warnings = [];
|
|
1320
1377
|
await spin({
|
|
1321
1378
|
waitFor: async () => {
|
|
1322
|
-
var _a, _b;
|
|
1323
1379
|
const rootPath = configManager.rootPath;
|
|
1324
1380
|
let sha;
|
|
1325
1381
|
try {
|
|
1326
|
-
sha = await
|
|
1382
|
+
sha = await getSha({ fs: fs3, dir: rootPath });
|
|
1327
1383
|
} catch (e) {
|
|
1328
1384
|
if (partialReindex) {
|
|
1329
1385
|
console.error(
|
|
@@ -1333,7 +1389,7 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1333
1389
|
}
|
|
1334
1390
|
}
|
|
1335
1391
|
const lastSha = await database.getMetadata("lastSha");
|
|
1336
|
-
const exists = lastSha && await
|
|
1392
|
+
const exists = lastSha && await shaExists({ fs: fs3, dir: rootPath, sha: lastSha });
|
|
1337
1393
|
let res;
|
|
1338
1394
|
if (partialReindex && lastSha && exists && sha) {
|
|
1339
1395
|
const pathFilter = {};
|
|
@@ -1344,18 +1400,18 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1344
1400
|
}
|
|
1345
1401
|
for (const collection of tinaSchema.getCollections()) {
|
|
1346
1402
|
pathFilter[collection.path] = {
|
|
1347
|
-
matches:
|
|
1403
|
+
matches: collection.match?.exclude || collection.match?.include ? tinaSchema.getMatches({ collection }) : void 0
|
|
1348
1404
|
};
|
|
1349
1405
|
}
|
|
1350
|
-
const { added, modified, deleted } = await
|
|
1351
|
-
fs:
|
|
1406
|
+
const { added, modified, deleted } = await getChangedFiles({
|
|
1407
|
+
fs: fs3,
|
|
1352
1408
|
dir: rootPath,
|
|
1353
1409
|
from: lastSha,
|
|
1354
1410
|
to: sha,
|
|
1355
1411
|
pathFilter
|
|
1356
1412
|
});
|
|
1357
1413
|
const tinaPathUpdates = modified.filter(
|
|
1358
|
-
(
|
|
1414
|
+
(path15) => path15.startsWith(".tina/__generated__/_schema.json") || path15.startsWith("tina/tina-lock.json")
|
|
1359
1415
|
);
|
|
1360
1416
|
if (tinaPathUpdates.length > 0) {
|
|
1361
1417
|
res = await database.indexContent({
|
|
@@ -1379,7 +1435,7 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1379
1435
|
if (sha) {
|
|
1380
1436
|
await database.setMetadata("lastSha", sha);
|
|
1381
1437
|
}
|
|
1382
|
-
if (res
|
|
1438
|
+
if (res?.warnings) {
|
|
1383
1439
|
warnings.push(...res.warnings);
|
|
1384
1440
|
}
|
|
1385
1441
|
},
|
|
@@ -1433,7 +1489,7 @@ var errorHTML = `<style type="text/css">
|
|
|
1433
1489
|
the assets for this page.
|
|
1434
1490
|
</p>
|
|
1435
1491
|
<p>
|
|
1436
|
-
Please visit <a href="https://tina.io/docs/
|
|
1492
|
+
Please visit <a href="https://tina.io/docs/r/FAQ/#13-how-do-i-resolve-failed-loading-tinacms-assets-error">this doc</a> for help.
|
|
1437
1493
|
</p>
|
|
1438
1494
|
</div>
|
|
1439
1495
|
</div>`.trim().replace(/[\r\n\s]+/g, " ");
|
|
@@ -1471,34 +1527,38 @@ var devHTML = (port) => `<!DOCTYPE html>
|
|
|
1471
1527
|
</html>`;
|
|
1472
1528
|
|
|
1473
1529
|
// src/next/commands/dev-command/server/index.ts
|
|
1474
|
-
|
|
1530
|
+
import { createServer as createViteServer } from "vite";
|
|
1475
1531
|
|
|
1476
1532
|
// src/next/vite/index.ts
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1533
|
+
import path5 from "node:path";
|
|
1534
|
+
import react from "@vitejs/plugin-react";
|
|
1535
|
+
import fs4 from "fs-extra";
|
|
1536
|
+
import normalizePath3 from "normalize-path";
|
|
1537
|
+
import {
|
|
1538
|
+
splitVendorChunkPlugin
|
|
1539
|
+
} from "vite";
|
|
1482
1540
|
|
|
1483
1541
|
// src/next/vite/tailwind.ts
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1542
|
+
import path4 from "node:path";
|
|
1543
|
+
import aspectRatio from "@tailwindcss/aspect-ratio";
|
|
1544
|
+
import containerQueries from "@tailwindcss/container-queries";
|
|
1545
|
+
import twTypography from "@tailwindcss/typography";
|
|
1546
|
+
import tailwind from "tailwindcss";
|
|
1547
|
+
import defaultTheme from "tailwindcss/defaultTheme.js";
|
|
1548
|
+
import { createRequire as createRequire2 } from "module";
|
|
1490
1549
|
var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
1491
1550
|
return {
|
|
1492
1551
|
name: "vite-plugin-tina",
|
|
1493
1552
|
// @ts-ignore
|
|
1494
1553
|
config: (viteConfig) => {
|
|
1554
|
+
const require2 = createRequire2(import.meta.url);
|
|
1495
1555
|
const plugins = [];
|
|
1496
1556
|
const content = [
|
|
1497
|
-
|
|
1557
|
+
path4.join(spaPath, "src/**/*.{vue,js,ts,jsx,tsx,svelte}"),
|
|
1498
1558
|
prebuildFilePath,
|
|
1499
|
-
|
|
1559
|
+
require2.resolve("tinacms")
|
|
1500
1560
|
];
|
|
1501
|
-
const tw = (
|
|
1561
|
+
const tw = tailwind({
|
|
1502
1562
|
theme: {
|
|
1503
1563
|
columns: {
|
|
1504
1564
|
auto: "auto",
|
|
@@ -1650,7 +1710,7 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1650
1710
|
},
|
|
1651
1711
|
boxShadow: {
|
|
1652
1712
|
xs: "0 0 0 1px rgba(0, 0, 0, 0.05)",
|
|
1653
|
-
outline: "0 0 0 3px rgba(
|
|
1713
|
+
outline: "0 0 0 3px rgba(194, 65, 12, 0.2)"
|
|
1654
1714
|
},
|
|
1655
1715
|
colors: {
|
|
1656
1716
|
blue: {
|
|
@@ -1686,6 +1746,9 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1686
1746
|
500: "#EC4815",
|
|
1687
1747
|
600: "#DC4419"
|
|
1688
1748
|
},
|
|
1749
|
+
"tina-orange": "#EC4815",
|
|
1750
|
+
"tina-orange-dark": "#C2410C",
|
|
1751
|
+
"tina-orange-light": "#FFF7ED",
|
|
1689
1752
|
background: "#FFFFFF",
|
|
1690
1753
|
foreground: "#0A0A0A",
|
|
1691
1754
|
muted: "#F5F5F5",
|
|
@@ -1704,10 +1767,10 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1704
1767
|
"accent-foreground": "#171717",
|
|
1705
1768
|
destructive: "#FF3B3B",
|
|
1706
1769
|
"destructive-foreground": "#FAFAFA",
|
|
1707
|
-
ring: "#
|
|
1770
|
+
ring: "#C2410C"
|
|
1708
1771
|
},
|
|
1709
1772
|
fontFamily: {
|
|
1710
|
-
sans: ["Inter", ...
|
|
1773
|
+
sans: ["Inter", ...defaultTheme.fontFamily.sans]
|
|
1711
1774
|
},
|
|
1712
1775
|
lineHeight: {
|
|
1713
1776
|
3: "12px",
|
|
@@ -1732,9 +1795,9 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1732
1795
|
},
|
|
1733
1796
|
content,
|
|
1734
1797
|
plugins: [
|
|
1735
|
-
(
|
|
1736
|
-
|
|
1737
|
-
|
|
1798
|
+
twTypography({ className: "tina-prose" }),
|
|
1799
|
+
aspectRatio,
|
|
1800
|
+
containerQueries
|
|
1738
1801
|
]
|
|
1739
1802
|
});
|
|
1740
1803
|
plugins.push(tw);
|
|
@@ -1755,35 +1818,35 @@ async function listFilesRecursively({
|
|
|
1755
1818
|
config: config2,
|
|
1756
1819
|
roothPath
|
|
1757
1820
|
}) {
|
|
1758
|
-
const fullDirectoryPath =
|
|
1821
|
+
const fullDirectoryPath = path5.join(
|
|
1759
1822
|
roothPath,
|
|
1760
1823
|
config2.publicFolder,
|
|
1761
1824
|
directoryPath
|
|
1762
1825
|
);
|
|
1763
|
-
const exists = await
|
|
1826
|
+
const exists = await fs4.pathExists(fullDirectoryPath);
|
|
1764
1827
|
if (!exists) {
|
|
1765
1828
|
return { "0": [] };
|
|
1766
1829
|
}
|
|
1767
|
-
const items = await
|
|
1830
|
+
const items = await fs4.readdir(fullDirectoryPath);
|
|
1768
1831
|
const staticMediaItems = [];
|
|
1769
1832
|
for (const item of items) {
|
|
1770
|
-
const itemPath =
|
|
1771
|
-
const stats = await
|
|
1833
|
+
const itemPath = path5.join(fullDirectoryPath, item);
|
|
1834
|
+
const stats = await fs4.promises.lstat(itemPath);
|
|
1772
1835
|
const staticMediaItem = {
|
|
1773
1836
|
id: item,
|
|
1774
1837
|
filename: item,
|
|
1775
1838
|
type: stats.isDirectory() ? "dir" : "file",
|
|
1776
1839
|
directory: `${directoryPath.replace(config2.mediaRoot, "")}`,
|
|
1777
|
-
src: `/${
|
|
1840
|
+
src: `/${path5.join(directoryPath, item)}`,
|
|
1778
1841
|
thumbnails: {
|
|
1779
|
-
"75x75": `/${
|
|
1780
|
-
"400x400": `/${
|
|
1781
|
-
"1000x1000": `/${
|
|
1842
|
+
"75x75": `/${path5.join(directoryPath, item)}`,
|
|
1843
|
+
"400x400": `/${path5.join(directoryPath, item)}`,
|
|
1844
|
+
"1000x1000": `/${path5.join(directoryPath, item)}`
|
|
1782
1845
|
}
|
|
1783
1846
|
};
|
|
1784
1847
|
if (stats.isDirectory()) {
|
|
1785
1848
|
staticMediaItem.children = await listFilesRecursively({
|
|
1786
|
-
directoryPath:
|
|
1849
|
+
directoryPath: path5.join(directoryPath, item),
|
|
1787
1850
|
config: config2,
|
|
1788
1851
|
roothPath
|
|
1789
1852
|
});
|
|
@@ -1807,7 +1870,6 @@ var createConfig = async ({
|
|
|
1807
1870
|
noWatch,
|
|
1808
1871
|
rollupOptions
|
|
1809
1872
|
}) => {
|
|
1810
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1811
1873
|
const publicEnv = {};
|
|
1812
1874
|
Object.keys(process.env).forEach((key) => {
|
|
1813
1875
|
if (key.startsWith("TINA_PUBLIC_") || key.startsWith("NEXT_PUBLIC_") || key === "NODE_ENV" || key === "HEAD") {
|
|
@@ -1825,31 +1887,31 @@ var createConfig = async ({
|
|
|
1825
1887
|
}
|
|
1826
1888
|
}
|
|
1827
1889
|
});
|
|
1828
|
-
const staticMediaPath =
|
|
1890
|
+
const staticMediaPath = path5.join(
|
|
1829
1891
|
configManager.generatedFolderPath,
|
|
1830
1892
|
"static-media.json"
|
|
1831
1893
|
);
|
|
1832
|
-
if (
|
|
1894
|
+
if (configManager.config.media?.tina?.static) {
|
|
1833
1895
|
const staticMedia = await listFilesRecursively({
|
|
1834
|
-
directoryPath:
|
|
1896
|
+
directoryPath: configManager.config.media.tina?.mediaRoot || "",
|
|
1835
1897
|
config: configManager.config.media.tina,
|
|
1836
1898
|
roothPath: configManager.rootPath
|
|
1837
1899
|
});
|
|
1838
|
-
await
|
|
1900
|
+
await fs4.outputFile(staticMediaPath, JSON.stringify(staticMedia, null, 2));
|
|
1839
1901
|
} else {
|
|
1840
|
-
await
|
|
1902
|
+
await fs4.outputFile(staticMediaPath, `[]`);
|
|
1841
1903
|
}
|
|
1842
1904
|
const alias = {
|
|
1843
1905
|
TINA_IMPORT: configManager.prebuildFilePath,
|
|
1844
1906
|
SCHEMA_IMPORT: configManager.generatedGraphQLJSONPath,
|
|
1845
1907
|
STATIC_MEDIA_IMPORT: staticMediaPath,
|
|
1846
|
-
crypto:
|
|
1847
|
-
fs:
|
|
1848
|
-
os:
|
|
1849
|
-
path:
|
|
1908
|
+
crypto: path5.join(configManager.spaRootPath, "src", "dummy-client.ts"),
|
|
1909
|
+
fs: path5.join(configManager.spaRootPath, "src", "dummy-client.ts"),
|
|
1910
|
+
os: path5.join(configManager.spaRootPath, "src", "dummy-client.ts"),
|
|
1911
|
+
path: path5.join(configManager.spaRootPath, "src", "dummy-client.ts")
|
|
1850
1912
|
};
|
|
1851
1913
|
if (configManager.shouldSkipSDK()) {
|
|
1852
|
-
alias["CLIENT_IMPORT"] =
|
|
1914
|
+
alias["CLIENT_IMPORT"] = path5.join(
|
|
1853
1915
|
configManager.spaRootPath,
|
|
1854
1916
|
"src",
|
|
1855
1917
|
"dummy-client.ts"
|
|
@@ -1865,7 +1927,7 @@ var createConfig = async ({
|
|
|
1865
1927
|
const version2 = `${fullVersion.major}.${fullVersion.minor}`;
|
|
1866
1928
|
const config2 = {
|
|
1867
1929
|
root: configManager.spaRootPath,
|
|
1868
|
-
base: `/${basePath ? `${(
|
|
1930
|
+
base: `/${basePath ? `${normalizePath3(basePath)}/` : ""}${normalizePath3(
|
|
1869
1931
|
configManager.config.build.outputFolder
|
|
1870
1932
|
)}/`,
|
|
1871
1933
|
appType: "spa",
|
|
@@ -1892,7 +1954,7 @@ var createConfig = async ({
|
|
|
1892
1954
|
// Used by picomatch https://github.com/micromatch/picomatch/blob/master/lib/utils.js#L4
|
|
1893
1955
|
"process.platform": `"${process.platform}"`,
|
|
1894
1956
|
__API_URL__: `"${apiURL}"`,
|
|
1895
|
-
__BASE_PATH__: `"${
|
|
1957
|
+
__BASE_PATH__: `"${configManager.config?.build?.basePath || ""}"`,
|
|
1896
1958
|
__TINA_GRAPHQL_VERSION__: version2
|
|
1897
1959
|
},
|
|
1898
1960
|
logLevel: "error",
|
|
@@ -1904,7 +1966,7 @@ var createConfig = async ({
|
|
|
1904
1966
|
include: ["react/jsx-runtime", "react/jsx-dev-runtime"]
|
|
1905
1967
|
},
|
|
1906
1968
|
server: {
|
|
1907
|
-
host:
|
|
1969
|
+
host: configManager.config?.build?.host ?? false,
|
|
1908
1970
|
watch: noWatch ? {
|
|
1909
1971
|
ignored: ["**/*"]
|
|
1910
1972
|
} : {
|
|
@@ -1928,13 +1990,14 @@ var createConfig = async ({
|
|
|
1928
1990
|
* `splitVendorChunkPlugin` is needed because `tinacms` is quite large,
|
|
1929
1991
|
* Vite's chunking strategy chokes on memory issues for smaller machines (ie. on CI).
|
|
1930
1992
|
*/
|
|
1931
|
-
(
|
|
1993
|
+
react({
|
|
1932
1994
|
babel: {
|
|
1933
1995
|
// Supresses the warning [NOTE] babel The code generator has deoptimised the styling of
|
|
1934
1996
|
compact: true
|
|
1935
|
-
}
|
|
1997
|
+
},
|
|
1998
|
+
fastRefresh: false
|
|
1936
1999
|
}),
|
|
1937
|
-
|
|
2000
|
+
splitVendorChunkPlugin(),
|
|
1938
2001
|
tinaTailwind(configManager.spaRootPath, configManager.prebuildFilePath),
|
|
1939
2002
|
...plugins
|
|
1940
2003
|
]
|
|
@@ -1943,21 +2006,21 @@ var createConfig = async ({
|
|
|
1943
2006
|
};
|
|
1944
2007
|
|
|
1945
2008
|
// src/next/vite/plugins.ts
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
2009
|
+
import { createFilter } from "@rollup/pluginutils";
|
|
2010
|
+
import fs6 from "fs";
|
|
2011
|
+
import { transformWithEsbuild } from "vite";
|
|
2012
|
+
import { transform as esbuildTransform } from "esbuild";
|
|
2013
|
+
import path7 from "path";
|
|
2014
|
+
import bodyParser from "body-parser";
|
|
2015
|
+
import cors from "cors";
|
|
2016
|
+
import { resolve as gqlResolve } from "@tinacms/graphql";
|
|
1954
2017
|
|
|
1955
2018
|
// src/next/commands/dev-command/server/media.ts
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
2019
|
+
import fs5 from "fs-extra";
|
|
2020
|
+
import path6, { join } from "path";
|
|
2021
|
+
import busboy from "busboy";
|
|
1959
2022
|
var createMediaRouter = (config2) => {
|
|
1960
|
-
const mediaFolder =
|
|
2023
|
+
const mediaFolder = path6.join(
|
|
1961
2024
|
config2.rootPath,
|
|
1962
2025
|
config2.publicFolder,
|
|
1963
2026
|
config2.mediaRoot
|
|
@@ -1981,13 +2044,12 @@ var createMediaRouter = (config2) => {
|
|
|
1981
2044
|
res.end(JSON.stringify(didDelete));
|
|
1982
2045
|
};
|
|
1983
2046
|
const handlePost = async function(req, res) {
|
|
1984
|
-
const bb = (
|
|
2047
|
+
const bb = busboy({ headers: req.headers });
|
|
1985
2048
|
bb.on("file", async (_name, file, _info) => {
|
|
1986
|
-
|
|
1987
|
-
const
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
file.pipe(import_fs_extra5.default.createWriteStream(saveTo));
|
|
2049
|
+
const fullPath = decodeURI(req.url?.slice("/media/upload/".length));
|
|
2050
|
+
const saveTo = path6.join(mediaFolder, ...fullPath.split("/"));
|
|
2051
|
+
await fs5.ensureDir(path6.dirname(saveTo));
|
|
2052
|
+
file.pipe(fs5.createWriteStream(saveTo));
|
|
1991
2053
|
});
|
|
1992
2054
|
bb.on("error", (error) => {
|
|
1993
2055
|
res.statusCode = 500;
|
|
@@ -2013,6 +2075,9 @@ var parseMediaFolder = (str) => {
|
|
|
2013
2075
|
return returnString;
|
|
2014
2076
|
};
|
|
2015
2077
|
var MediaModel = class {
|
|
2078
|
+
rootPath;
|
|
2079
|
+
publicFolder;
|
|
2080
|
+
mediaRoot;
|
|
2016
2081
|
constructor({ rootPath, publicFolder, mediaRoot }) {
|
|
2017
2082
|
this.rootPath = rootPath;
|
|
2018
2083
|
this.mediaRoot = mediaRoot;
|
|
@@ -2020,23 +2085,23 @@ var MediaModel = class {
|
|
|
2020
2085
|
}
|
|
2021
2086
|
async listMedia(args) {
|
|
2022
2087
|
try {
|
|
2023
|
-
const folderPath =
|
|
2088
|
+
const folderPath = join(
|
|
2024
2089
|
this.rootPath,
|
|
2025
2090
|
this.publicFolder,
|
|
2026
2091
|
this.mediaRoot,
|
|
2027
2092
|
decodeURIComponent(args.searchPath)
|
|
2028
2093
|
);
|
|
2029
2094
|
const searchPath = parseMediaFolder(args.searchPath);
|
|
2030
|
-
if (!await
|
|
2095
|
+
if (!await fs5.pathExists(folderPath)) {
|
|
2031
2096
|
return {
|
|
2032
2097
|
files: [],
|
|
2033
2098
|
directories: []
|
|
2034
2099
|
};
|
|
2035
2100
|
}
|
|
2036
|
-
const filesStr = await
|
|
2101
|
+
const filesStr = await fs5.readdir(folderPath);
|
|
2037
2102
|
const filesProm = filesStr.map(async (file) => {
|
|
2038
|
-
const filePath =
|
|
2039
|
-
const stat = await
|
|
2103
|
+
const filePath = join(folderPath, file);
|
|
2104
|
+
const stat = await fs5.stat(filePath);
|
|
2040
2105
|
let src = `/${file}`;
|
|
2041
2106
|
const isFile = stat.isFile();
|
|
2042
2107
|
if (!isFile) {
|
|
@@ -2086,24 +2151,24 @@ var MediaModel = class {
|
|
|
2086
2151
|
return {
|
|
2087
2152
|
files: [],
|
|
2088
2153
|
directories: [],
|
|
2089
|
-
error: error
|
|
2154
|
+
error: error?.toString()
|
|
2090
2155
|
};
|
|
2091
2156
|
}
|
|
2092
2157
|
}
|
|
2093
2158
|
async deleteMedia(args) {
|
|
2094
2159
|
try {
|
|
2095
|
-
const file =
|
|
2160
|
+
const file = join(
|
|
2096
2161
|
this.rootPath,
|
|
2097
2162
|
this.publicFolder,
|
|
2098
2163
|
this.mediaRoot,
|
|
2099
2164
|
decodeURIComponent(args.searchPath)
|
|
2100
2165
|
);
|
|
2101
|
-
await
|
|
2102
|
-
await
|
|
2166
|
+
await fs5.stat(file);
|
|
2167
|
+
await fs5.remove(file);
|
|
2103
2168
|
return { ok: true };
|
|
2104
2169
|
} catch (error) {
|
|
2105
2170
|
console.error(error);
|
|
2106
|
-
return { ok: false, message: error
|
|
2171
|
+
return { ok: false, message: error?.toString() };
|
|
2107
2172
|
}
|
|
2108
2173
|
}
|
|
2109
2174
|
};
|
|
@@ -2114,34 +2179,127 @@ var createSearchIndexRouter = ({
|
|
|
2114
2179
|
searchIndex
|
|
2115
2180
|
}) => {
|
|
2116
2181
|
const put = async (req, res) => {
|
|
2117
|
-
const
|
|
2182
|
+
const docs = req.body?.docs ?? [];
|
|
2118
2183
|
const result = await searchIndex.PUT(docs);
|
|
2119
2184
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
2120
2185
|
res.end(JSON.stringify({ result }));
|
|
2121
2186
|
};
|
|
2122
2187
|
const get = async (req, res) => {
|
|
2123
|
-
const requestURL = new URL(req.url, config2.apiURL);
|
|
2188
|
+
const requestURL = new URL(req.url ?? "", config2.apiURL);
|
|
2189
|
+
const isV2 = requestURL.pathname.startsWith("/v2/searchIndex");
|
|
2190
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
2191
|
+
if (isV2) {
|
|
2192
|
+
const queryParam = requestURL.searchParams.get("query");
|
|
2193
|
+
const collectionParam = requestURL.searchParams.get("collection");
|
|
2194
|
+
const limitParam = requestURL.searchParams.get("limit");
|
|
2195
|
+
const cursorParam = requestURL.searchParams.get("cursor");
|
|
2196
|
+
if (!queryParam) {
|
|
2197
|
+
res.end(JSON.stringify({ RESULT: [], RESULT_LENGTH: 0 }));
|
|
2198
|
+
return;
|
|
2199
|
+
}
|
|
2200
|
+
if (!searchIndex.fuzzySearchWrapper) {
|
|
2201
|
+
res.end(JSON.stringify({ RESULT: [], RESULT_LENGTH: 0 }));
|
|
2202
|
+
return;
|
|
2203
|
+
}
|
|
2204
|
+
try {
|
|
2205
|
+
const paginationOptions = {};
|
|
2206
|
+
if (limitParam) {
|
|
2207
|
+
paginationOptions.limit = parseInt(limitParam, 10);
|
|
2208
|
+
}
|
|
2209
|
+
if (cursorParam) {
|
|
2210
|
+
paginationOptions.cursor = cursorParam;
|
|
2211
|
+
}
|
|
2212
|
+
const searchQuery = collectionParam ? `${queryParam} _collection:${collectionParam}` : queryParam;
|
|
2213
|
+
const result2 = await searchIndex.fuzzySearchWrapper.query(searchQuery, {
|
|
2214
|
+
...paginationOptions
|
|
2215
|
+
});
|
|
2216
|
+
if (collectionParam) {
|
|
2217
|
+
result2.results = result2.results.filter(
|
|
2218
|
+
(r) => r._id && r._id.startsWith(`${collectionParam}:`)
|
|
2219
|
+
);
|
|
2220
|
+
}
|
|
2221
|
+
res.end(
|
|
2222
|
+
JSON.stringify({
|
|
2223
|
+
RESULT: result2.results,
|
|
2224
|
+
RESULT_LENGTH: result2.total,
|
|
2225
|
+
NEXT_CURSOR: result2.nextCursor,
|
|
2226
|
+
PREV_CURSOR: result2.prevCursor,
|
|
2227
|
+
FUZZY_MATCHES: result2.fuzzyMatches || {}
|
|
2228
|
+
})
|
|
2229
|
+
);
|
|
2230
|
+
return;
|
|
2231
|
+
} catch (error) {
|
|
2232
|
+
console.warn(
|
|
2233
|
+
"[search] v2 fuzzy search failed:",
|
|
2234
|
+
error instanceof Error ? error.message : error
|
|
2235
|
+
);
|
|
2236
|
+
res.end(JSON.stringify({ RESULT: [], RESULT_LENGTH: 0 }));
|
|
2237
|
+
return;
|
|
2238
|
+
}
|
|
2239
|
+
}
|
|
2124
2240
|
const query = requestURL.searchParams.get("q");
|
|
2125
2241
|
const optionsParam = requestURL.searchParams.get("options");
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2242
|
+
const fuzzyParam = requestURL.searchParams.get("fuzzy");
|
|
2243
|
+
const fuzzyOptionsParam = requestURL.searchParams.get("fuzzyOptions");
|
|
2244
|
+
if (!query) {
|
|
2245
|
+
res.end(JSON.stringify({ RESULT: [] }));
|
|
2246
|
+
return;
|
|
2247
|
+
}
|
|
2248
|
+
let searchIndexOptions = { DOCUMENTS: false };
|
|
2129
2249
|
if (optionsParam) {
|
|
2130
|
-
|
|
2131
|
-
...
|
|
2250
|
+
searchIndexOptions = {
|
|
2251
|
+
...searchIndexOptions,
|
|
2132
2252
|
...JSON.parse(optionsParam)
|
|
2133
2253
|
};
|
|
2134
2254
|
}
|
|
2135
|
-
|
|
2136
|
-
if (
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2255
|
+
const queryObj = JSON.parse(query);
|
|
2256
|
+
if (fuzzyParam === "true" && searchIndex.fuzzySearchWrapper) {
|
|
2257
|
+
try {
|
|
2258
|
+
const fuzzyOptions = fuzzyOptionsParam ? JSON.parse(fuzzyOptionsParam) : {};
|
|
2259
|
+
const searchTerms = queryObj.AND ? queryObj.AND.filter(
|
|
2260
|
+
(term) => !term.includes("_collection:")
|
|
2261
|
+
) : [];
|
|
2262
|
+
const collectionFilter = queryObj.AND?.find(
|
|
2263
|
+
(term) => term.includes("_collection:")
|
|
2264
|
+
);
|
|
2265
|
+
const paginationOptions = {};
|
|
2266
|
+
if (searchIndexOptions.PAGE) {
|
|
2267
|
+
paginationOptions.limit = searchIndexOptions.PAGE.SIZE;
|
|
2268
|
+
paginationOptions.cursor = searchIndexOptions.PAGE.NUMBER.toString();
|
|
2269
|
+
}
|
|
2270
|
+
const searchQuery = collectionFilter ? `${searchTerms.join(" ")} ${collectionFilter}` : searchTerms.join(" ");
|
|
2271
|
+
const result2 = await searchIndex.fuzzySearchWrapper.query(searchQuery, {
|
|
2272
|
+
...paginationOptions,
|
|
2273
|
+
fuzzyOptions
|
|
2274
|
+
});
|
|
2275
|
+
if (collectionFilter) {
|
|
2276
|
+
const collection = collectionFilter.split(":")[1];
|
|
2277
|
+
result2.results = result2.results.filter(
|
|
2278
|
+
(r) => r._id && r._id.startsWith(`${collection}:`)
|
|
2279
|
+
);
|
|
2280
|
+
}
|
|
2281
|
+
res.end(
|
|
2282
|
+
JSON.stringify({
|
|
2283
|
+
RESULT: result2.results,
|
|
2284
|
+
RESULT_LENGTH: result2.total,
|
|
2285
|
+
NEXT_CURSOR: result2.nextCursor,
|
|
2286
|
+
PREV_CURSOR: result2.prevCursor,
|
|
2287
|
+
FUZZY_MATCHES: result2.fuzzyMatches || {}
|
|
2288
|
+
})
|
|
2289
|
+
);
|
|
2290
|
+
return;
|
|
2291
|
+
} catch (error) {
|
|
2292
|
+
console.warn(
|
|
2293
|
+
"[search] Fuzzy search failed, falling back to standard search:",
|
|
2294
|
+
error instanceof Error ? error.message : error
|
|
2295
|
+
);
|
|
2296
|
+
}
|
|
2141
2297
|
}
|
|
2298
|
+
const result = await searchIndex.QUERY(queryObj, searchIndexOptions);
|
|
2299
|
+
res.end(JSON.stringify(result));
|
|
2142
2300
|
};
|
|
2143
2301
|
const del = async (req, res) => {
|
|
2144
|
-
const requestURL = new URL(req.url, config2.apiURL);
|
|
2302
|
+
const requestURL = new URL(req.url ?? "", config2.apiURL);
|
|
2145
2303
|
const docId = requestURL.pathname.split("/").filter(Boolean).slice(1).join("/");
|
|
2146
2304
|
const result = await searchIndex.DELETE(docId);
|
|
2147
2305
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
@@ -2157,9 +2315,9 @@ var transformTsxPlugin = ({
|
|
|
2157
2315
|
const plug = {
|
|
2158
2316
|
name: "transform-tsx",
|
|
2159
2317
|
async transform(code, id) {
|
|
2160
|
-
const extName =
|
|
2318
|
+
const extName = path7.extname(id);
|
|
2161
2319
|
if (extName.startsWith(".tsx") || extName.startsWith(".ts")) {
|
|
2162
|
-
const result = await (
|
|
2320
|
+
const result = await esbuildTransform(code, { loader: "tsx" });
|
|
2163
2321
|
return {
|
|
2164
2322
|
code: result.code
|
|
2165
2323
|
};
|
|
@@ -2178,16 +2336,15 @@ var devServerEndPointsPlugin = ({
|
|
|
2178
2336
|
const plug = {
|
|
2179
2337
|
name: "graphql-endpoints",
|
|
2180
2338
|
configureServer(server) {
|
|
2181
|
-
server.middlewares.use((
|
|
2182
|
-
server.middlewares.use(
|
|
2339
|
+
server.middlewares.use(cors());
|
|
2340
|
+
server.middlewares.use(bodyParser.json({ limit: "5mb" }));
|
|
2183
2341
|
server.middlewares.use(async (req, res, next) => {
|
|
2184
|
-
|
|
2185
|
-
const mediaPaths = (_a = configManager.config.media) == null ? void 0 : _a.tina;
|
|
2342
|
+
const mediaPaths = configManager.config.media?.tina;
|
|
2186
2343
|
const mediaRouter = createMediaRouter({
|
|
2187
2344
|
rootPath: configManager.rootPath,
|
|
2188
2345
|
apiURL,
|
|
2189
|
-
publicFolder: parseMediaFolder(
|
|
2190
|
-
mediaRoot: parseMediaFolder(
|
|
2346
|
+
publicFolder: parseMediaFolder(mediaPaths?.publicFolder || ""),
|
|
2347
|
+
mediaRoot: parseMediaFolder(mediaPaths?.mediaRoot || "")
|
|
2191
2348
|
});
|
|
2192
2349
|
const searchIndexRouter = createSearchIndexRouter({
|
|
2193
2350
|
config: { apiURL, searchPath: "searchIndex" },
|
|
@@ -2219,7 +2376,7 @@ var devServerEndPointsPlugin = ({
|
|
|
2219
2376
|
const { query, variables } = req.body;
|
|
2220
2377
|
let result;
|
|
2221
2378
|
await databaseLock(async () => {
|
|
2222
|
-
result = await (
|
|
2379
|
+
result = await gqlResolve({
|
|
2223
2380
|
config: {
|
|
2224
2381
|
useRelativeMedia: true
|
|
2225
2382
|
},
|
|
@@ -2232,7 +2389,7 @@ var devServerEndPointsPlugin = ({
|
|
|
2232
2389
|
res.end(JSON.stringify(result));
|
|
2233
2390
|
return;
|
|
2234
2391
|
}
|
|
2235
|
-
if (req.url.startsWith("/searchIndex")) {
|
|
2392
|
+
if (req.url.startsWith("/searchIndex") || req.url.startsWith("/v2/searchIndex")) {
|
|
2236
2393
|
if (req.method === "POST") {
|
|
2237
2394
|
await searchIndexRouter.put(req, res);
|
|
2238
2395
|
} else if (req.method === "GET") {
|
|
@@ -2255,13 +2412,13 @@ function viteTransformExtension({
|
|
|
2255
2412
|
include = "**/*.svg",
|
|
2256
2413
|
exclude
|
|
2257
2414
|
} = {}) {
|
|
2258
|
-
const filter =
|
|
2415
|
+
const filter = createFilter(include, exclude);
|
|
2259
2416
|
return {
|
|
2260
2417
|
name: "vite-plugin-svgr",
|
|
2261
2418
|
async transform(code, id) {
|
|
2262
2419
|
if (filter(id)) {
|
|
2263
|
-
const { transform: transform2 } = await
|
|
2264
|
-
const svgCode = await
|
|
2420
|
+
const { transform: transform2 } = await import("@svgr/core");
|
|
2421
|
+
const svgCode = await fs6.promises.readFile(
|
|
2265
2422
|
id.replace(/\?.*$/, ""),
|
|
2266
2423
|
"utf8"
|
|
2267
2424
|
);
|
|
@@ -2271,7 +2428,7 @@ function viteTransformExtension({
|
|
|
2271
2428
|
previousExport: exportAsDefault ? null : code
|
|
2272
2429
|
}
|
|
2273
2430
|
});
|
|
2274
|
-
const res = await
|
|
2431
|
+
const res = await transformWithEsbuild(componentCode, id, {
|
|
2275
2432
|
loader: "jsx",
|
|
2276
2433
|
...esbuildOptions
|
|
2277
2434
|
});
|
|
@@ -2298,7 +2455,7 @@ var createDevServer = async (configManager, database, searchIndex, apiURL, noWat
|
|
|
2298
2455
|
}),
|
|
2299
2456
|
viteTransformExtension()
|
|
2300
2457
|
];
|
|
2301
|
-
return (
|
|
2458
|
+
return createViteServer(
|
|
2302
2459
|
await createConfig({
|
|
2303
2460
|
configManager,
|
|
2304
2461
|
database,
|
|
@@ -2328,23 +2485,30 @@ var createDevServer = async (configManager, database, searchIndex, apiURL, noWat
|
|
|
2328
2485
|
|
|
2329
2486
|
// src/next/commands/dev-command/index.ts
|
|
2330
2487
|
var DevCommand = class extends BaseCommand {
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
this
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2488
|
+
static paths = [["dev"], ["server:start"]];
|
|
2489
|
+
// NOTE: camelCase commands for string options don't work if there's an `=` used https://github.com/arcanis/clipanion/issues/141
|
|
2490
|
+
watchFolders = Option2.String("-w,--watchFolders", {
|
|
2491
|
+
description: "DEPRECATED - a list of folders (relative to where this is being run) that the cli will watch for changes"
|
|
2492
|
+
});
|
|
2493
|
+
noWatch = Option2.Boolean("--noWatch", false, {
|
|
2494
|
+
description: "Don't regenerate config on file changes"
|
|
2495
|
+
});
|
|
2496
|
+
outputSearchIndexPath = Option2.String("--outputSearchIndexPath", {
|
|
2497
|
+
description: "Path to write the search index to"
|
|
2498
|
+
});
|
|
2499
|
+
noServer = Option2.Boolean("--no-server", false, {
|
|
2500
|
+
description: "Do not start the dev server"
|
|
2501
|
+
});
|
|
2502
|
+
indexingLock = new AsyncLock();
|
|
2503
|
+
// Prevent indexes and reads occurring at once
|
|
2504
|
+
static usage = Command2.Usage({
|
|
2505
|
+
category: `Commands`,
|
|
2506
|
+
description: `Builds Tina and starts the dev server`,
|
|
2507
|
+
examples: [
|
|
2508
|
+
[`A basic example`, `$0 dev`],
|
|
2509
|
+
[`A second example`, `$0 dev --rootPath`]
|
|
2510
|
+
]
|
|
2511
|
+
});
|
|
2348
2512
|
async catch(error) {
|
|
2349
2513
|
logger.error("Error occured during tinacms dev");
|
|
2350
2514
|
console.error(error);
|
|
@@ -2359,7 +2523,6 @@ var DevCommand = class extends BaseCommand {
|
|
|
2359
2523
|
}
|
|
2360
2524
|
}
|
|
2361
2525
|
async execute() {
|
|
2362
|
-
var _a, _b, _c, _d, _e, _f;
|
|
2363
2526
|
const configManager = new ConfigManager({
|
|
2364
2527
|
rootPath: this.rootPath,
|
|
2365
2528
|
legacyNoSDK: this.noSDK
|
|
@@ -2382,7 +2545,7 @@ var DevCommand = class extends BaseCommand {
|
|
|
2382
2545
|
} else {
|
|
2383
2546
|
database.clearCache();
|
|
2384
2547
|
}
|
|
2385
|
-
const { tinaSchema: tinaSchema2, graphQLSchema: graphQLSchema2, lookup, queryDoc, fragDoc } = await
|
|
2548
|
+
const { tinaSchema: tinaSchema2, graphQLSchema: graphQLSchema2, lookup, queryDoc, fragDoc } = await buildSchema(configManager.config);
|
|
2386
2549
|
const codegen2 = new Codegen({
|
|
2387
2550
|
isLocal: true,
|
|
2388
2551
|
configManager,
|
|
@@ -2396,29 +2559,32 @@ var DevCommand = class extends BaseCommand {
|
|
|
2396
2559
|
});
|
|
2397
2560
|
const apiURL2 = await codegen2.execute();
|
|
2398
2561
|
if (!configManager.isUsingLegacyFolder) {
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
const
|
|
2403
|
-
|
|
2404
|
-
|
|
2562
|
+
const schemaObject = await fs7.readJSON(
|
|
2563
|
+
configManager.generatedSchemaJSONPath
|
|
2564
|
+
);
|
|
2565
|
+
const lookupObject = await fs7.readJSON(
|
|
2566
|
+
configManager.generatedLookupJSONPath
|
|
2567
|
+
);
|
|
2568
|
+
const graphqlSchemaObject = await fs7.readJSON(
|
|
2569
|
+
configManager.generatedGraphQLJSONPath
|
|
2570
|
+
);
|
|
2405
2571
|
const tinaLockFilename = "tina-lock.json";
|
|
2406
2572
|
const tinaLockContent = JSON.stringify({
|
|
2407
2573
|
schema: schemaObject,
|
|
2408
2574
|
lookup: lookupObject,
|
|
2409
2575
|
graphql: graphqlSchemaObject
|
|
2410
2576
|
});
|
|
2411
|
-
|
|
2412
|
-
|
|
2577
|
+
fs7.writeFileSync(
|
|
2578
|
+
path8.join(configManager.tinaFolderPath, tinaLockFilename),
|
|
2413
2579
|
tinaLockContent
|
|
2414
2580
|
);
|
|
2415
2581
|
if (configManager.hasSeparateContentRoot()) {
|
|
2416
2582
|
const rootPath = await configManager.getTinaFolderPath(
|
|
2417
2583
|
configManager.contentRootPath
|
|
2418
2584
|
);
|
|
2419
|
-
const filePath =
|
|
2420
|
-
await
|
|
2421
|
-
await
|
|
2585
|
+
const filePath = path8.join(rootPath, tinaLockFilename);
|
|
2586
|
+
await fs7.ensureFile(filePath);
|
|
2587
|
+
await fs7.outputFile(filePath, tinaLockContent);
|
|
2422
2588
|
}
|
|
2423
2589
|
}
|
|
2424
2590
|
await this.indexContentWithSpinner({
|
|
@@ -2461,25 +2627,25 @@ ${dangerText(e.message)}
|
|
|
2461
2627
|
const { apiURL, graphQLSchema, tinaSchema } = await setup({
|
|
2462
2628
|
firstTime: true
|
|
2463
2629
|
});
|
|
2464
|
-
await
|
|
2465
|
-
await
|
|
2630
|
+
await fs7.outputFile(configManager.outputHTMLFilePath, devHTML(this.port));
|
|
2631
|
+
await fs7.outputFile(
|
|
2466
2632
|
configManager.outputGitignorePath,
|
|
2467
2633
|
"index.html\nassets/"
|
|
2468
2634
|
);
|
|
2469
|
-
const searchIndexClient = new
|
|
2470
|
-
stopwordLanguages:
|
|
2471
|
-
tokenSplitRegex:
|
|
2635
|
+
const searchIndexClient = new LocalSearchIndexClient({
|
|
2636
|
+
stopwordLanguages: configManager.config.search?.tina?.stopwordLanguages,
|
|
2637
|
+
tokenSplitRegex: configManager.config.search?.tina?.tokenSplitRegex
|
|
2472
2638
|
});
|
|
2473
2639
|
await searchIndexClient.onStartIndexing();
|
|
2474
|
-
const searchIndexer = new
|
|
2475
|
-
batchSize:
|
|
2476
|
-
bridge: new
|
|
2640
|
+
const searchIndexer = new SearchIndexer({
|
|
2641
|
+
batchSize: configManager.config.search?.indexBatchSize || 100,
|
|
2642
|
+
bridge: new FilesystemBridge2(
|
|
2477
2643
|
configManager.rootPath,
|
|
2478
2644
|
configManager.contentRootPath
|
|
2479
2645
|
),
|
|
2480
2646
|
schema: tinaSchema,
|
|
2481
2647
|
client: searchIndexClient,
|
|
2482
|
-
textIndexLength:
|
|
2648
|
+
textIndexLength: configManager.config.search?.maxSearchIndexFieldLength || 100
|
|
2483
2649
|
});
|
|
2484
2650
|
if (configManager.config.search) {
|
|
2485
2651
|
await spin({
|
|
@@ -2504,17 +2670,21 @@ ${dangerText(e.message)}
|
|
|
2504
2670
|
configManager.config.search && searchIndexer
|
|
2505
2671
|
);
|
|
2506
2672
|
}
|
|
2673
|
+
const searchIndexWithFuzzy = searchIndexClient.searchIndex;
|
|
2674
|
+
if (searchIndexWithFuzzy && searchIndexClient.fuzzySearchWrapper) {
|
|
2675
|
+
searchIndexWithFuzzy.fuzzySearchWrapper = searchIndexClient.fuzzySearchWrapper;
|
|
2676
|
+
}
|
|
2507
2677
|
const server = await createDevServer(
|
|
2508
2678
|
configManager,
|
|
2509
2679
|
database,
|
|
2510
|
-
|
|
2680
|
+
searchIndexWithFuzzy,
|
|
2511
2681
|
apiURL,
|
|
2512
2682
|
this.noWatch,
|
|
2513
2683
|
dbLock
|
|
2514
2684
|
);
|
|
2515
2685
|
await server.listen(Number(this.port));
|
|
2516
2686
|
if (!this.noWatch) {
|
|
2517
|
-
|
|
2687
|
+
chokidar.watch(configManager.watchList).on("change", async () => {
|
|
2518
2688
|
await dbLock(async () => {
|
|
2519
2689
|
logger.info(`Tina config change detected, rebuilding`);
|
|
2520
2690
|
await setup({ firstTime: false });
|
|
@@ -2576,11 +2746,11 @@ ${dangerText(e.message)}
|
|
|
2576
2746
|
// subItems: [
|
|
2577
2747
|
// {
|
|
2578
2748
|
// key: 'Custom queries',
|
|
2579
|
-
// value: 'https://tina.io/
|
|
2749
|
+
// value: 'https://tina.io/docs/r/content-api-overview',
|
|
2580
2750
|
// },
|
|
2581
2751
|
// {
|
|
2582
2752
|
// key: 'Visual editing',
|
|
2583
|
-
// value: 'https://tina.io/visual-editing',
|
|
2753
|
+
// value: 'https://tina.io/docs/r/visual-editing-setup',
|
|
2584
2754
|
// },
|
|
2585
2755
|
// ],
|
|
2586
2756
|
// },
|
|
@@ -2591,14 +2761,14 @@ ${dangerText(e.message)}
|
|
|
2591
2761
|
watchContentFiles(configManager, database, databaseLock, searchIndexer) {
|
|
2592
2762
|
const collectionContentFiles = [];
|
|
2593
2763
|
configManager.config.schema.collections.forEach((collection) => {
|
|
2594
|
-
const collectionGlob = `${
|
|
2764
|
+
const collectionGlob = `${path8.join(
|
|
2595
2765
|
configManager.contentRootPath,
|
|
2596
2766
|
collection.path
|
|
2597
2767
|
)}/**/*.${collection.format || "md"}`;
|
|
2598
2768
|
collectionContentFiles.push(collectionGlob);
|
|
2599
2769
|
});
|
|
2600
2770
|
let ready = false;
|
|
2601
|
-
|
|
2771
|
+
chokidar.watch(collectionContentFiles).on("ready", () => {
|
|
2602
2772
|
ready = true;
|
|
2603
2773
|
}).on("add", async (addedFile) => {
|
|
2604
2774
|
if (!ready) {
|
|
@@ -2635,38 +2805,35 @@ ${dangerText(e.message)}
|
|
|
2635
2805
|
await callback();
|
|
2636
2806
|
});
|
|
2637
2807
|
};
|
|
2638
|
-
|
|
2808
|
+
chokidar.watch(configManager.userQueriesAndFragmentsGlob).on("add", executeCallback).on("change", executeCallback).on("unlink", executeCallback);
|
|
2639
2809
|
}
|
|
2640
2810
|
};
|
|
2641
|
-
DevCommand.paths = [["dev"], ["server:start"]];
|
|
2642
|
-
// Prevent indexes and reads occurring at once
|
|
2643
|
-
DevCommand.usage = import_clipanion2.Command.Usage({
|
|
2644
|
-
category: `Commands`,
|
|
2645
|
-
description: `Builds Tina and starts the dev server`,
|
|
2646
|
-
examples: [
|
|
2647
|
-
[`A basic example`, `$0 dev`],
|
|
2648
|
-
[`A second example`, `$0 dev --rootPath`]
|
|
2649
|
-
]
|
|
2650
|
-
});
|
|
2651
2811
|
|
|
2652
2812
|
// src/next/commands/build-command/index.ts
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2813
|
+
import crypto from "crypto";
|
|
2814
|
+
import path9 from "path";
|
|
2815
|
+
import { diff } from "@graphql-inspector/core";
|
|
2816
|
+
import { FilesystemBridge as FilesystemBridge3, buildSchema as buildSchema2 } from "@tinacms/graphql";
|
|
2817
|
+
import { parseURL as parseURL2 } from "@tinacms/schema-tools";
|
|
2818
|
+
import {
|
|
2819
|
+
SearchIndexer as SearchIndexer2,
|
|
2820
|
+
TinaCMSSearchIndexClient
|
|
2821
|
+
} from "@tinacms/search";
|
|
2822
|
+
import { Command as Command3, Option as Option3 } from "clipanion";
|
|
2823
|
+
import fs8 from "fs-extra";
|
|
2824
|
+
import {
|
|
2825
|
+
buildASTSchema as buildASTSchema2,
|
|
2826
|
+
buildClientSchema,
|
|
2827
|
+
getIntrospectionQuery
|
|
2828
|
+
} from "graphql";
|
|
2829
|
+
import Progress2 from "progress";
|
|
2663
2830
|
|
|
2664
2831
|
// src/utils/index.ts
|
|
2665
|
-
|
|
2832
|
+
import { ChangeType } from "@graphql-inspector/core";
|
|
2666
2833
|
var getFaqLink = (type) => {
|
|
2667
2834
|
switch (type) {
|
|
2668
|
-
case
|
|
2669
|
-
return "https://tina.io/docs/
|
|
2835
|
+
case ChangeType.FieldRemoved: {
|
|
2836
|
+
return "https://tina.io/docs/r/FAQ/#2-how-do-i-resolve-the-local-graphql-schema-doesnt-match-the-remote-graphql-schema-error";
|
|
2670
2837
|
}
|
|
2671
2838
|
default:
|
|
2672
2839
|
return null;
|
|
@@ -2687,7 +2854,7 @@ async function sleepAndCallFunc({
|
|
|
2687
2854
|
}
|
|
2688
2855
|
|
|
2689
2856
|
// src/next/commands/build-command/server.ts
|
|
2690
|
-
|
|
2857
|
+
import { build as build2 } from "vite";
|
|
2691
2858
|
var buildProductionSpa = async (configManager, database, apiURL) => {
|
|
2692
2859
|
const publicEnv = {};
|
|
2693
2860
|
Object.keys(process.env).forEach((key) => {
|
|
@@ -2721,12 +2888,12 @@ var buildProductionSpa = async (configManager, database, apiURL) => {
|
|
|
2721
2888
|
}
|
|
2722
2889
|
}
|
|
2723
2890
|
});
|
|
2724
|
-
return (
|
|
2891
|
+
return build2(config2);
|
|
2725
2892
|
};
|
|
2726
2893
|
|
|
2727
2894
|
// src/next/commands/build-command/waitForDB.ts
|
|
2728
|
-
|
|
2729
|
-
|
|
2895
|
+
import { parseURL } from "@tinacms/schema-tools";
|
|
2896
|
+
import Progress from "progress";
|
|
2730
2897
|
var POLLING_INTERVAL = 5e3;
|
|
2731
2898
|
var STATUS_INPROGRESS = "inprogress";
|
|
2732
2899
|
var STATUS_COMPLETE = "complete";
|
|
@@ -2739,14 +2906,14 @@ var IndexFailedError = class extends Error {
|
|
|
2739
2906
|
};
|
|
2740
2907
|
var waitForDB = async (config2, apiUrl, previewName, verbose) => {
|
|
2741
2908
|
const token = config2.token;
|
|
2742
|
-
const { clientId, branch, isLocalClient, host } =
|
|
2909
|
+
const { clientId, branch, isLocalClient, host } = parseURL(apiUrl);
|
|
2743
2910
|
if (isLocalClient || !host || !clientId || !branch) {
|
|
2744
2911
|
if (verbose) {
|
|
2745
2912
|
logger.info(logText("Not using TinaCloud, skipping DB check"));
|
|
2746
2913
|
}
|
|
2747
2914
|
return;
|
|
2748
2915
|
}
|
|
2749
|
-
const bar2 = new
|
|
2916
|
+
const bar2 = new Progress(
|
|
2750
2917
|
"Checking indexing process in TinaCloud... :prog",
|
|
2751
2918
|
1
|
|
2752
2919
|
);
|
|
@@ -2809,48 +2976,49 @@ var waitForDB = async (config2, apiUrl, previewName, verbose) => {
|
|
|
2809
2976
|
|
|
2810
2977
|
// src/next/commands/build-command/index.ts
|
|
2811
2978
|
var BuildCommand = class extends BaseCommand {
|
|
2812
|
-
|
|
2813
|
-
|
|
2814
|
-
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2818
|
-
|
|
2819
|
-
|
|
2820
|
-
|
|
2821
|
-
|
|
2822
|
-
|
|
2823
|
-
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
|
|
2827
|
-
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
|
|
2832
|
-
|
|
2833
|
-
|
|
2834
|
-
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
|
|
2838
|
-
|
|
2839
|
-
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2979
|
+
static paths = [["build"]];
|
|
2980
|
+
localOption = Option3.Boolean("--local", {
|
|
2981
|
+
description: "Starts local Graphql server and builds the local client instead of production client"
|
|
2982
|
+
});
|
|
2983
|
+
skipIndexing = Option3.Boolean("--skip-indexing", false, {
|
|
2984
|
+
description: "Skips indexing the content. This can be used for building the site without indexing the content (defaults to false)"
|
|
2985
|
+
});
|
|
2986
|
+
partialReindex = Option3.Boolean("--partial-reindex", false, {
|
|
2987
|
+
description: "Re-indexes only the content that has changed since the last build (defaults to false). Not currently supported for separate content repos."
|
|
2988
|
+
});
|
|
2989
|
+
tinaGraphQLVersion = Option3.String("--tina-graphql-version", {
|
|
2990
|
+
description: "Specify the version of @tinacms/graphql to use (defaults to latest)"
|
|
2991
|
+
});
|
|
2992
|
+
/**
|
|
2993
|
+
* This option allows the user to skip the TinaCloud 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 TinaCloud
|
|
2994
|
+
*/
|
|
2995
|
+
skipCloudChecks = Option3.Boolean("--skip-cloud-checks", false, {
|
|
2996
|
+
description: "Skips checking the provided cloud config."
|
|
2997
|
+
});
|
|
2998
|
+
skipSearchIndex = Option3.Boolean("--skip-search-index", false, {
|
|
2999
|
+
description: "Skip indexing the site for search"
|
|
3000
|
+
});
|
|
3001
|
+
upstreamBranch = Option3.String("--upstream-branch", {
|
|
3002
|
+
description: "Optional upstream branch with the schema. If not specified, default will be used."
|
|
3003
|
+
});
|
|
3004
|
+
previewBaseBranch = Option3.String("--preview-base-branch", {
|
|
3005
|
+
description: "The base branch for the preview"
|
|
3006
|
+
});
|
|
3007
|
+
previewName = Option3.String("--preview-name", {
|
|
3008
|
+
description: "The name of the preview branch"
|
|
3009
|
+
});
|
|
3010
|
+
noClientBuildCache = Option3.Boolean("--no-client-build-cache", false, {
|
|
3011
|
+
description: "Disables the client build cache"
|
|
3012
|
+
});
|
|
3013
|
+
static usage = Command3.Usage({
|
|
3014
|
+
category: `Commands`,
|
|
3015
|
+
description: `Build the CMS and autogenerated modules for usage with TinaCloud`
|
|
3016
|
+
});
|
|
2848
3017
|
async catch(error) {
|
|
2849
3018
|
console.error(error);
|
|
2850
3019
|
process.exit(1);
|
|
2851
3020
|
}
|
|
2852
3021
|
async execute() {
|
|
2853
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
|
|
2854
3022
|
logger.info("Starting Tina build");
|
|
2855
3023
|
this.logDeprecationWarnings();
|
|
2856
3024
|
const configManager = new ConfigManager({
|
|
@@ -2890,7 +3058,7 @@ ${dangerText(e.message)}`);
|
|
|
2890
3058
|
configManager,
|
|
2891
3059
|
Number(this.datalayerPort)
|
|
2892
3060
|
);
|
|
2893
|
-
const { queryDoc, fragDoc, graphQLSchema, tinaSchema, lookup } = await (
|
|
3061
|
+
const { queryDoc, fragDoc, graphQLSchema, tinaSchema, lookup } = await buildSchema2(configManager.config);
|
|
2894
3062
|
const codegen2 = new Codegen({
|
|
2895
3063
|
configManager,
|
|
2896
3064
|
port: this.localOption ? Number(this.port) : void 0,
|
|
@@ -2939,56 +3107,74 @@ ${dangerText(e.message)}
|
|
|
2939
3107
|
}
|
|
2940
3108
|
const skipCloudChecks = this.skipCloudChecks || configManager.hasSelfHostedConfig();
|
|
2941
3109
|
if (!skipCloudChecks) {
|
|
2942
|
-
|
|
2943
|
-
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
if (!hasUpstream && this.upstreamBranch) {
|
|
2948
|
-
logger.warn(
|
|
2949
|
-
`${dangerText(
|
|
2950
|
-
`WARN: Upstream branch '${this.upstreamBranch}' specified but no upstream project was found.`
|
|
2951
|
-
)}`
|
|
3110
|
+
try {
|
|
3111
|
+
const clientInfo = await this.checkClientInfo(
|
|
3112
|
+
configManager,
|
|
3113
|
+
codegen2.productionUrl,
|
|
3114
|
+
this.previewBaseBranch
|
|
2952
3115
|
);
|
|
3116
|
+
if (clientInfo.detectedBotBranch) {
|
|
3117
|
+
logger.warn(
|
|
3118
|
+
`${warnText(
|
|
3119
|
+
`WARN: Detected bot branch. Using schema/content from default branch '${clientInfo.defaultBranch}' instead of '${configManager.config.branch}'.`
|
|
3120
|
+
)}`
|
|
3121
|
+
);
|
|
3122
|
+
}
|
|
3123
|
+
if (!clientInfo.hasUpstream && this.upstreamBranch) {
|
|
3124
|
+
logger.warn(
|
|
3125
|
+
`${dangerText(
|
|
3126
|
+
`WARN: Upstream branch '${this.upstreamBranch}' specified but no upstream project was found.`
|
|
3127
|
+
)}`
|
|
3128
|
+
);
|
|
3129
|
+
}
|
|
3130
|
+
if (clientInfo.hasUpstream || this.previewBaseBranch && this.previewName) {
|
|
3131
|
+
await this.syncProject(configManager, codegen2.productionUrl, {
|
|
3132
|
+
upstreamBranch: this.upstreamBranch,
|
|
3133
|
+
previewBaseBranch: this.previewBaseBranch,
|
|
3134
|
+
previewName: this.previewName
|
|
3135
|
+
});
|
|
3136
|
+
}
|
|
3137
|
+
await waitForDB(
|
|
3138
|
+
configManager.config,
|
|
3139
|
+
codegen2.productionUrl,
|
|
3140
|
+
this.previewName,
|
|
3141
|
+
false
|
|
3142
|
+
);
|
|
3143
|
+
await this.checkGraphqlSchema(
|
|
3144
|
+
configManager,
|
|
3145
|
+
database,
|
|
3146
|
+
codegen2.productionUrl,
|
|
3147
|
+
clientInfo.timestamp
|
|
3148
|
+
);
|
|
3149
|
+
await this.checkTinaSchema(
|
|
3150
|
+
configManager,
|
|
3151
|
+
database,
|
|
3152
|
+
codegen2.productionUrl,
|
|
3153
|
+
this.previewName,
|
|
3154
|
+
this.verbose,
|
|
3155
|
+
clientInfo.timestamp
|
|
3156
|
+
);
|
|
3157
|
+
} catch (e) {
|
|
3158
|
+
logger.error(`
|
|
3159
|
+
|
|
3160
|
+
${dangerText(e.message)}
|
|
3161
|
+
`);
|
|
3162
|
+
if (this.verbose) {
|
|
3163
|
+
console.error(e);
|
|
3164
|
+
}
|
|
3165
|
+
process.exit(1);
|
|
2953
3166
|
}
|
|
2954
|
-
if (hasUpstream || this.previewBaseBranch && this.previewName) {
|
|
2955
|
-
await this.syncProject(configManager, codegen2.productionUrl, {
|
|
2956
|
-
upstreamBranch: this.upstreamBranch,
|
|
2957
|
-
previewBaseBranch: this.previewBaseBranch,
|
|
2958
|
-
previewName: this.previewName
|
|
2959
|
-
});
|
|
2960
|
-
}
|
|
2961
|
-
await waitForDB(
|
|
2962
|
-
configManager.config,
|
|
2963
|
-
codegen2.productionUrl,
|
|
2964
|
-
this.previewName,
|
|
2965
|
-
false
|
|
2966
|
-
);
|
|
2967
|
-
await this.checkGraphqlSchema(
|
|
2968
|
-
configManager,
|
|
2969
|
-
database,
|
|
2970
|
-
codegen2.productionUrl,
|
|
2971
|
-
timestamp
|
|
2972
|
-
);
|
|
2973
|
-
await this.checkTinaSchema(
|
|
2974
|
-
configManager,
|
|
2975
|
-
database,
|
|
2976
|
-
codegen2.productionUrl,
|
|
2977
|
-
this.previewName,
|
|
2978
|
-
this.verbose,
|
|
2979
|
-
timestamp
|
|
2980
|
-
);
|
|
2981
3167
|
}
|
|
2982
3168
|
await buildProductionSpa(configManager, database, codegen2.productionUrl);
|
|
2983
|
-
await
|
|
3169
|
+
await fs8.outputFile(
|
|
2984
3170
|
configManager.outputGitignorePath,
|
|
2985
3171
|
"index.html\nassets/"
|
|
2986
3172
|
);
|
|
2987
3173
|
if (configManager.config.search && !this.skipSearchIndex && !this.localOption) {
|
|
2988
3174
|
let client;
|
|
2989
|
-
const hasTinaSearch = Boolean(
|
|
3175
|
+
const hasTinaSearch = Boolean(configManager.config?.search?.tina);
|
|
2990
3176
|
if (hasTinaSearch) {
|
|
2991
|
-
if (!
|
|
3177
|
+
if (!configManager.config?.branch) {
|
|
2992
3178
|
logger.error(
|
|
2993
3179
|
`${dangerText(
|
|
2994
3180
|
`ERROR: Branch not configured in tina search configuration.`
|
|
@@ -2998,11 +3184,11 @@ ${dangerText(e.message)}
|
|
|
2998
3184
|
"Branch not configured in tina search configuration."
|
|
2999
3185
|
);
|
|
3000
3186
|
}
|
|
3001
|
-
if (!
|
|
3187
|
+
if (!configManager.config?.clientId) {
|
|
3002
3188
|
logger.error(`${dangerText(`ERROR: clientId not configured.`)}`);
|
|
3003
3189
|
throw new Error("clientId not configured.");
|
|
3004
3190
|
}
|
|
3005
|
-
if (!
|
|
3191
|
+
if (!configManager.config?.search?.tina?.indexerToken) {
|
|
3006
3192
|
logger.error(
|
|
3007
3193
|
`${dangerText(
|
|
3008
3194
|
`ERROR: indexerToken not configured in tina search configuration.`
|
|
@@ -3012,18 +3198,18 @@ ${dangerText(e.message)}
|
|
|
3012
3198
|
"indexerToken not configured in tina search configuration."
|
|
3013
3199
|
);
|
|
3014
3200
|
}
|
|
3015
|
-
client = new
|
|
3016
|
-
apiUrl: `${
|
|
3017
|
-
branch:
|
|
3018
|
-
indexerToken:
|
|
3019
|
-
stopwordLanguages:
|
|
3201
|
+
client = new TinaCMSSearchIndexClient({
|
|
3202
|
+
apiUrl: `${configManager.config.tinaioConfig?.contentApiUrlOverride || "https://content.tinajs.io"}/searchIndex/${configManager.config?.clientId}`,
|
|
3203
|
+
branch: configManager.config?.branch,
|
|
3204
|
+
indexerToken: configManager.config?.search?.tina?.indexerToken,
|
|
3205
|
+
stopwordLanguages: configManager.config?.search?.tina?.stopwordLanguages
|
|
3020
3206
|
});
|
|
3021
3207
|
} else {
|
|
3022
|
-
client =
|
|
3208
|
+
client = configManager.config?.search?.searchClient;
|
|
3023
3209
|
}
|
|
3024
|
-
const searchIndexer = new
|
|
3025
|
-
batchSize:
|
|
3026
|
-
bridge: new
|
|
3210
|
+
const searchIndexer = new SearchIndexer2({
|
|
3211
|
+
batchSize: configManager.config.search?.indexBatchSize || 100,
|
|
3212
|
+
bridge: new FilesystemBridge3(
|
|
3027
3213
|
configManager.rootPath,
|
|
3028
3214
|
configManager.contentRootPath
|
|
3029
3215
|
),
|
|
@@ -3090,86 +3276,88 @@ ${dangerText(e.message)}
|
|
|
3090
3276
|
}
|
|
3091
3277
|
}
|
|
3092
3278
|
async checkClientInfo(configManager, apiURL, previewBaseBranch) {
|
|
3279
|
+
const MAX_RETRIES = 5;
|
|
3093
3280
|
const { config: config2 } = configManager;
|
|
3094
3281
|
const token = config2.token;
|
|
3095
|
-
const { clientId, branch, host } = (
|
|
3096
|
-
const
|
|
3097
|
-
const
|
|
3098
|
-
|
|
3099
|
-
|
|
3100
|
-
|
|
3101
|
-
|
|
3102
|
-
|
|
3103
|
-
|
|
3104
|
-
|
|
3105
|
-
|
|
3106
|
-
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
|
|
3282
|
+
const { clientId, branch, host } = parseURL2(apiURL);
|
|
3283
|
+
const bar2 = new Progress2("Checking clientId and token. :prog", 1);
|
|
3284
|
+
const getBranchInfo = async () => {
|
|
3285
|
+
const url = `https://${host}/db/${clientId}/status/${previewBaseBranch || branch}`;
|
|
3286
|
+
const branchInfo2 = {
|
|
3287
|
+
status: "unknown",
|
|
3288
|
+
branchKnown: false,
|
|
3289
|
+
hasUpstream: false,
|
|
3290
|
+
timestamp: 0,
|
|
3291
|
+
detectedBotBranch: false,
|
|
3292
|
+
defaultBranch: void 0
|
|
3293
|
+
};
|
|
3294
|
+
try {
|
|
3295
|
+
const res = await request({
|
|
3296
|
+
token,
|
|
3297
|
+
url
|
|
3298
|
+
});
|
|
3299
|
+
branchInfo2.status = res.status;
|
|
3300
|
+
branchInfo2.branchKnown = res.status !== "unknown";
|
|
3301
|
+
branchInfo2.timestamp = res.timestamp || 0;
|
|
3302
|
+
branchInfo2.hasUpstream = res.hasUpstream;
|
|
3303
|
+
branchInfo2.detectedBotBranch = res.json.detectedBotBranch;
|
|
3304
|
+
branchInfo2.defaultBranch = res.json.defaultBranch;
|
|
3305
|
+
} catch (e) {
|
|
3306
|
+
summary({
|
|
3307
|
+
heading: "Error when checking client information",
|
|
3308
|
+
items: [
|
|
3309
|
+
{
|
|
3310
|
+
emoji: "\u274C",
|
|
3311
|
+
heading: "You provided",
|
|
3312
|
+
subItems: [
|
|
3313
|
+
{
|
|
3314
|
+
key: "clientId",
|
|
3315
|
+
value: config2.clientId
|
|
3316
|
+
},
|
|
3317
|
+
{
|
|
3318
|
+
key: "branch",
|
|
3319
|
+
value: config2.branch
|
|
3320
|
+
},
|
|
3321
|
+
{
|
|
3322
|
+
key: "token",
|
|
3323
|
+
value: config2.token
|
|
3324
|
+
}
|
|
3325
|
+
]
|
|
3326
|
+
}
|
|
3327
|
+
]
|
|
3328
|
+
});
|
|
3329
|
+
throw e;
|
|
3115
3330
|
}
|
|
3116
|
-
|
|
3117
|
-
|
|
3118
|
-
|
|
3119
|
-
|
|
3120
|
-
|
|
3121
|
-
|
|
3122
|
-
|
|
3123
|
-
|
|
3124
|
-
|
|
3125
|
-
|
|
3126
|
-
|
|
3127
|
-
},
|
|
3128
|
-
{
|
|
3129
|
-
key: "branch",
|
|
3130
|
-
value: config2.branch
|
|
3131
|
-
},
|
|
3132
|
-
{
|
|
3133
|
-
key: "token",
|
|
3134
|
-
value: config2.token
|
|
3135
|
-
}
|
|
3136
|
-
]
|
|
3137
|
-
}
|
|
3138
|
-
]
|
|
3139
|
-
});
|
|
3140
|
-
throw e;
|
|
3141
|
-
}
|
|
3142
|
-
const branchBar = new import_progress2.default("Checking branch is on TinaCloud. :prog", 1);
|
|
3143
|
-
if (branchKnown) {
|
|
3331
|
+
return branchInfo2;
|
|
3332
|
+
};
|
|
3333
|
+
const branchInfo = await getBranchInfo();
|
|
3334
|
+
bar2.tick({
|
|
3335
|
+
prog: "\u2705"
|
|
3336
|
+
});
|
|
3337
|
+
const branchBar = new Progress2(
|
|
3338
|
+
`Checking branch '${config2.branch}' is on TinaCloud. :prog`,
|
|
3339
|
+
1
|
|
3340
|
+
);
|
|
3341
|
+
if (branchInfo.branchKnown) {
|
|
3144
3342
|
branchBar.tick({
|
|
3145
3343
|
prog: "\u2705"
|
|
3146
3344
|
});
|
|
3147
|
-
return
|
|
3148
|
-
hasUpstream,
|
|
3149
|
-
timestamp
|
|
3150
|
-
};
|
|
3345
|
+
return branchInfo;
|
|
3151
3346
|
}
|
|
3152
|
-
for (let i =
|
|
3153
|
-
await
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
|
|
3158
|
-
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
prog: "\u2705"
|
|
3167
|
-
});
|
|
3168
|
-
return;
|
|
3169
|
-
}
|
|
3170
|
-
},
|
|
3171
|
-
ms: 5e3
|
|
3172
|
-
});
|
|
3347
|
+
for (let i = 1; i <= MAX_RETRIES; i++) {
|
|
3348
|
+
await timeout(5e3);
|
|
3349
|
+
const branchInfo2 = await getBranchInfo();
|
|
3350
|
+
if (this.verbose) {
|
|
3351
|
+
logger.info(
|
|
3352
|
+
`Branch status: ${branchInfo2.status}. Attempt: ${i}. Trying again in 5 seconds.`
|
|
3353
|
+
);
|
|
3354
|
+
}
|
|
3355
|
+
if (branchInfo2.branchKnown) {
|
|
3356
|
+
branchBar.tick({
|
|
3357
|
+
prog: "\u2705"
|
|
3358
|
+
});
|
|
3359
|
+
return branchInfo2;
|
|
3360
|
+
}
|
|
3173
3361
|
}
|
|
3174
3362
|
branchBar.tick({
|
|
3175
3363
|
prog: "\u274C"
|
|
@@ -3177,7 +3365,7 @@ ${dangerText(e.message)}
|
|
|
3177
3365
|
logger.error(
|
|
3178
3366
|
`${dangerText(
|
|
3179
3367
|
`ERROR: Branch '${branch}' is not on TinaCloud.`
|
|
3180
|
-
)} Please make sure that branch '${branch}' exists in your repository and that you have pushed your all changes to the remote. View all
|
|
3368
|
+
)} Please make sure that branch '${branch}' exists in your repository and that you have pushed your all changes to the remote. View all branches and their current status here: ${linkText(
|
|
3181
3369
|
`https://app.tina.io/projects/${clientId}/configuration`
|
|
3182
3370
|
)}`
|
|
3183
3371
|
);
|
|
@@ -3186,7 +3374,7 @@ ${dangerText(e.message)}
|
|
|
3186
3374
|
async syncProject(configManager, apiURL, options) {
|
|
3187
3375
|
const { config: config2 } = configManager;
|
|
3188
3376
|
const token = config2.token;
|
|
3189
|
-
const { clientId, branch, host } = (
|
|
3377
|
+
const { clientId, branch, host } = parseURL2(apiURL);
|
|
3190
3378
|
const { previewName, previewBaseBranch, upstreamBranch } = options || {};
|
|
3191
3379
|
let url = `https://${host}/db/${clientId}/reset/${branch}?refreshSchema=true&skipIfSchemaCurrent=true`;
|
|
3192
3380
|
if (upstreamBranch && previewBaseBranch && previewName) {
|
|
@@ -3196,7 +3384,7 @@ ${dangerText(e.message)}
|
|
|
3196
3384
|
} else if (upstreamBranch && !previewBaseBranch && !previewName) {
|
|
3197
3385
|
url = `https://${host}/db/${clientId}/reset/${branch}?refreshSchema=true&skipIfSchemaCurrent=true&upstreamBranch=${upstreamBranch}`;
|
|
3198
3386
|
}
|
|
3199
|
-
const bar2 = new
|
|
3387
|
+
const bar2 = new Progress2("Syncing Project. :prog", 1);
|
|
3200
3388
|
try {
|
|
3201
3389
|
const res = await request({
|
|
3202
3390
|
token,
|
|
@@ -3237,7 +3425,7 @@ ${dangerText(e.message)}
|
|
|
3237
3425
|
}
|
|
3238
3426
|
}
|
|
3239
3427
|
async checkGraphqlSchema(configManager, database, apiURL, timestamp) {
|
|
3240
|
-
const bar2 = new
|
|
3428
|
+
const bar2 = new Progress2(
|
|
3241
3429
|
"Checking local GraphQL Schema matches server. :prog",
|
|
3242
3430
|
1
|
|
3243
3431
|
);
|
|
@@ -3252,18 +3440,18 @@ ${dangerText(e.message)}
|
|
|
3252
3440
|
prog: "\u274C"
|
|
3253
3441
|
});
|
|
3254
3442
|
let errorMessage = `The remote GraphQL schema does not exist. Check indexing for this branch.`;
|
|
3255
|
-
if (config2
|
|
3443
|
+
if (config2?.branch) {
|
|
3256
3444
|
errorMessage += `
|
|
3257
3445
|
|
|
3258
3446
|
Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
3259
3447
|
}
|
|
3260
3448
|
throw new Error(errorMessage);
|
|
3261
3449
|
}
|
|
3262
|
-
const remoteGqlSchema =
|
|
3450
|
+
const remoteGqlSchema = buildClientSchema(remoteSchema);
|
|
3263
3451
|
const localSchemaDocument = await database.getGraphQLSchemaFromBridge();
|
|
3264
|
-
const localGraphqlSchema = (
|
|
3452
|
+
const localGraphqlSchema = buildASTSchema2(localSchemaDocument);
|
|
3265
3453
|
try {
|
|
3266
|
-
const diffResult = await
|
|
3454
|
+
const diffResult = await diff(remoteGqlSchema, localGraphqlSchema);
|
|
3267
3455
|
if (diffResult.length === 0) {
|
|
3268
3456
|
bar2.tick({
|
|
3269
3457
|
prog: "\u2705"
|
|
@@ -3284,7 +3472,7 @@ Check out '${faqLink}' for possible solutions.`}`;
|
|
|
3284
3472
|
Additional info:
|
|
3285
3473
|
|
|
3286
3474
|
`;
|
|
3287
|
-
if (config2
|
|
3475
|
+
if (config2?.branch) {
|
|
3288
3476
|
errorMessage += ` Branch: ${config2.branch}, Client ID: ${config2.clientId}
|
|
3289
3477
|
`;
|
|
3290
3478
|
}
|
|
@@ -3311,13 +3499,13 @@ Additional info:
|
|
|
3311
3499
|
}
|
|
3312
3500
|
}
|
|
3313
3501
|
async checkTinaSchema(configManager, database, apiURL, previewName, verbose, timestamp) {
|
|
3314
|
-
const bar2 = new
|
|
3502
|
+
const bar2 = new Progress2(
|
|
3315
3503
|
"Checking local Tina Schema matches server. :prog",
|
|
3316
3504
|
1
|
|
3317
3505
|
);
|
|
3318
3506
|
const { config: config2 } = configManager;
|
|
3319
3507
|
const token = config2.token;
|
|
3320
|
-
const { clientId, branch, isLocalClient, host } = (
|
|
3508
|
+
const { clientId, branch, isLocalClient, host } = parseURL2(apiURL);
|
|
3321
3509
|
if (isLocalClient || !host || !clientId || !branch) {
|
|
3322
3510
|
if (verbose) {
|
|
3323
3511
|
logger.info(logText("Not using TinaCloud, skipping Tina Schema check"));
|
|
@@ -3333,7 +3521,7 @@ Additional info:
|
|
|
3333
3521
|
prog: "\u274C"
|
|
3334
3522
|
});
|
|
3335
3523
|
let errorMessage = `The remote Tina schema does not exist. Check indexing for this branch.`;
|
|
3336
|
-
if (config2
|
|
3524
|
+
if (config2?.branch) {
|
|
3337
3525
|
errorMessage += `
|
|
3338
3526
|
|
|
3339
3527
|
Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
@@ -3345,11 +3533,11 @@ Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
|
3345
3533
|
}
|
|
3346
3534
|
const localTinaSchema = JSON.parse(
|
|
3347
3535
|
await database.bridge.get(
|
|
3348
|
-
|
|
3536
|
+
path9.join(database.tinaDirectory, "__generated__", "_schema.json")
|
|
3349
3537
|
)
|
|
3350
3538
|
);
|
|
3351
3539
|
localTinaSchema.version = void 0;
|
|
3352
|
-
const localTinaSchemaSha =
|
|
3540
|
+
const localTinaSchemaSha = crypto.createHash("sha256").update(JSON.stringify(localTinaSchema)).digest("hex");
|
|
3353
3541
|
if (localTinaSchemaSha === remoteTinaSchemaSha) {
|
|
3354
3542
|
bar2.tick({
|
|
3355
3543
|
prog: "\u2705"
|
|
@@ -3364,7 +3552,7 @@ Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
|
3364
3552
|
Additional info:
|
|
3365
3553
|
|
|
3366
3554
|
`;
|
|
3367
|
-
if (config2
|
|
3555
|
+
if (config2?.branch) {
|
|
3368
3556
|
errorMessage += ` Branch: ${config2.branch}, Client ID: ${config2.clientId}
|
|
3369
3557
|
`;
|
|
3370
3558
|
}
|
|
@@ -3376,18 +3564,13 @@ Additional info:
|
|
|
3376
3564
|
}
|
|
3377
3565
|
}
|
|
3378
3566
|
};
|
|
3379
|
-
BuildCommand.paths = [["build"]];
|
|
3380
|
-
BuildCommand.usage = import_clipanion3.Command.Usage({
|
|
3381
|
-
category: `Commands`,
|
|
3382
|
-
description: `Build the CMS and autogenerated modules for usage with TinaCloud`
|
|
3383
|
-
});
|
|
3384
3567
|
async function request(args) {
|
|
3385
3568
|
const headers = new Headers();
|
|
3386
3569
|
if (args.token) {
|
|
3387
3570
|
headers.append("X-API-KEY", args.token);
|
|
3388
3571
|
}
|
|
3389
3572
|
headers.append("Content-Type", "application/json");
|
|
3390
|
-
const url = args
|
|
3573
|
+
const url = args?.url;
|
|
3391
3574
|
const res = await fetch(url, {
|
|
3392
3575
|
method: args.method || "GET",
|
|
3393
3576
|
headers,
|
|
@@ -3405,21 +3588,22 @@ async function request(args) {
|
|
|
3405
3588
|
Message from server: ${json.message}`;
|
|
3406
3589
|
}
|
|
3407
3590
|
throw new Error(
|
|
3408
|
-
`Server responded with status code ${res.status}, ${res.statusText}. ${additionalInfo ? additionalInfo : ""} Please see our FAQ for more information: https://tina.io/docs/
|
|
3591
|
+
`Server responded with status code ${res.status}, ${res.statusText}. ${additionalInfo ? additionalInfo : ""} Please see our FAQ for more information: https://tina.io/docs/r/FAQ/`
|
|
3409
3592
|
);
|
|
3410
3593
|
}
|
|
3411
3594
|
if (json.errors) {
|
|
3412
3595
|
throw new Error(
|
|
3413
|
-
`Unable to fetch, please see our FAQ for more information: https://tina.io/docs/
|
|
3596
|
+
`Unable to fetch, please see our FAQ for more information: https://tina.io/docs/r/FAQ/
|
|
3414
3597
|
|
|
3415
3598
|
Errors:
|
|
3416
3599
|
${json.errors.map((error) => error.message).join("\n")}`
|
|
3417
3600
|
);
|
|
3418
3601
|
}
|
|
3419
3602
|
return {
|
|
3420
|
-
status: json
|
|
3421
|
-
timestamp: json
|
|
3422
|
-
hasUpstream:
|
|
3603
|
+
status: json?.status,
|
|
3604
|
+
timestamp: json?.timestamp,
|
|
3605
|
+
hasUpstream: json?.hasUpstream || false,
|
|
3606
|
+
json
|
|
3423
3607
|
};
|
|
3424
3608
|
}
|
|
3425
3609
|
var fetchRemoteGraphqlSchema = async ({
|
|
@@ -3431,7 +3615,7 @@ var fetchRemoteGraphqlSchema = async ({
|
|
|
3431
3615
|
headers.append("X-API-KEY", token);
|
|
3432
3616
|
}
|
|
3433
3617
|
const body = JSON.stringify({
|
|
3434
|
-
query:
|
|
3618
|
+
query: getIntrospectionQuery(),
|
|
3435
3619
|
variables: {}
|
|
3436
3620
|
});
|
|
3437
3621
|
headers.append("Content-Type", "application/json");
|
|
@@ -3442,7 +3626,7 @@ var fetchRemoteGraphqlSchema = async ({
|
|
|
3442
3626
|
});
|
|
3443
3627
|
const data = await res.json();
|
|
3444
3628
|
return {
|
|
3445
|
-
remoteSchema: data
|
|
3629
|
+
remoteSchema: data?.data,
|
|
3446
3630
|
remoteRuntimeVersion: res.headers.get("tinacms-grapqhl-version"),
|
|
3447
3631
|
remoteProjectVersion: res.headers.get("tinacms-graphql-project-version")
|
|
3448
3632
|
};
|
|
@@ -3464,14 +3648,14 @@ var fetchSchemaSha = async ({
|
|
|
3464
3648
|
};
|
|
3465
3649
|
|
|
3466
3650
|
// src/next/commands/audit-command/index.ts
|
|
3467
|
-
|
|
3468
|
-
|
|
3651
|
+
import { Command as Command4, Option as Option4 } from "clipanion";
|
|
3652
|
+
import { buildSchema as buildSchema3 } from "@tinacms/graphql";
|
|
3469
3653
|
|
|
3470
3654
|
// src/next/commands/audit-command/audit.ts
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
|
|
3474
|
-
|
|
3655
|
+
import prompts from "prompts";
|
|
3656
|
+
import { Telemetry } from "@tinacms/metrics";
|
|
3657
|
+
import { resolve } from "@tinacms/graphql";
|
|
3658
|
+
import chalk5 from "chalk";
|
|
3475
3659
|
var audit = async ({
|
|
3476
3660
|
database,
|
|
3477
3661
|
clean,
|
|
@@ -3479,7 +3663,7 @@ var audit = async ({
|
|
|
3479
3663
|
noTelemetry,
|
|
3480
3664
|
verbose
|
|
3481
3665
|
}) => {
|
|
3482
|
-
const telemetry = new
|
|
3666
|
+
const telemetry = new Telemetry({ disabled: noTelemetry });
|
|
3483
3667
|
await telemetry.submitRecord({
|
|
3484
3668
|
event: {
|
|
3485
3669
|
name: "tinacms:cli:audit:invoke",
|
|
@@ -3489,25 +3673,25 @@ var audit = async ({
|
|
|
3489
3673
|
});
|
|
3490
3674
|
if (clean) {
|
|
3491
3675
|
logger.info(
|
|
3492
|
-
`You are using the \`--clean\` option. This will modify your content as if a user is submitting a form. Before running this you should have a ${
|
|
3676
|
+
`You are using the \`--clean\` option. This will modify your content as if a user is submitting a form. Before running this you should have a ${chalk5.bold(
|
|
3493
3677
|
"clean git tree"
|
|
3494
3678
|
)} so unwanted changes can be undone.
|
|
3495
3679
|
|
|
3496
3680
|
`
|
|
3497
3681
|
);
|
|
3498
|
-
const res = await (
|
|
3682
|
+
const res = await prompts({
|
|
3499
3683
|
name: "useClean",
|
|
3500
3684
|
type: "confirm",
|
|
3501
3685
|
message: `Do you want to continue?`
|
|
3502
3686
|
});
|
|
3503
3687
|
if (!res.useClean) {
|
|
3504
|
-
logger.warn(
|
|
3688
|
+
logger.warn(chalk5.yellowBright("\u26A0\uFE0F Audit not complete"));
|
|
3505
3689
|
process.exit(0);
|
|
3506
3690
|
}
|
|
3507
3691
|
}
|
|
3508
3692
|
if (useDefaultValues && !clean) {
|
|
3509
3693
|
logger.warn(
|
|
3510
|
-
|
|
3694
|
+
chalk5.yellowBright(
|
|
3511
3695
|
"WARNING: using the `--useDefaultValues` without the `--clean` flag has no effect. Please re-run audit and add the `--clean` flag"
|
|
3512
3696
|
)
|
|
3513
3697
|
);
|
|
@@ -3535,10 +3719,10 @@ var audit = async ({
|
|
|
3535
3719
|
}
|
|
3536
3720
|
if (error) {
|
|
3537
3721
|
logger.error(
|
|
3538
|
-
|
|
3722
|
+
chalk5.redBright(`\u203C\uFE0F Audit ${chalk5.bold("failed")} with errors`)
|
|
3539
3723
|
);
|
|
3540
3724
|
} else {
|
|
3541
|
-
logger.info(
|
|
3725
|
+
logger.info(chalk5.greenBright("\u2705 Audit passed"));
|
|
3542
3726
|
}
|
|
3543
3727
|
};
|
|
3544
3728
|
var auditDocuments = async (args) => {
|
|
@@ -3555,7 +3739,7 @@ var auditDocuments = async (args) => {
|
|
|
3555
3739
|
}
|
|
3556
3740
|
}
|
|
3557
3741
|
}`;
|
|
3558
|
-
const docResult = await
|
|
3742
|
+
const docResult = await resolve({
|
|
3559
3743
|
database,
|
|
3560
3744
|
query: documentQuery,
|
|
3561
3745
|
variables: {},
|
|
@@ -3566,11 +3750,11 @@ var auditDocuments = async (args) => {
|
|
|
3566
3750
|
if (docResult.errors) {
|
|
3567
3751
|
error = true;
|
|
3568
3752
|
docResult.errors.forEach((err) => {
|
|
3569
|
-
logger.error(
|
|
3753
|
+
logger.error(chalk5.red(err.message));
|
|
3570
3754
|
if (err.originalError.originalError) {
|
|
3571
3755
|
logger.error(
|
|
3572
3756
|
// @ts-ignore FIXME: this doesn't seem right
|
|
3573
|
-
|
|
3757
|
+
chalk5.red(` ${err.originalError.originalError.message}`)
|
|
3574
3758
|
);
|
|
3575
3759
|
}
|
|
3576
3760
|
});
|
|
@@ -3597,7 +3781,7 @@ var auditDocuments = async (args) => {
|
|
|
3597
3781
|
params: $params
|
|
3598
3782
|
){__typename}
|
|
3599
3783
|
}`;
|
|
3600
|
-
const mutationRes = await
|
|
3784
|
+
const mutationRes = await resolve({
|
|
3601
3785
|
database,
|
|
3602
3786
|
query: mutation,
|
|
3603
3787
|
variables: {
|
|
@@ -3612,7 +3796,7 @@ var auditDocuments = async (args) => {
|
|
|
3612
3796
|
if (mutationRes.errors) {
|
|
3613
3797
|
mutationRes.errors.forEach((err) => {
|
|
3614
3798
|
error = true;
|
|
3615
|
-
logger.error(
|
|
3799
|
+
logger.error(chalk5.red(err.message));
|
|
3616
3800
|
});
|
|
3617
3801
|
}
|
|
3618
3802
|
}
|
|
@@ -3629,29 +3813,31 @@ function filterObject(obj) {
|
|
|
3629
3813
|
}
|
|
3630
3814
|
|
|
3631
3815
|
// src/next/commands/audit-command/index.ts
|
|
3632
|
-
|
|
3633
|
-
var AuditCommand = class extends
|
|
3634
|
-
|
|
3635
|
-
|
|
3636
|
-
|
|
3637
|
-
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
|
|
3641
|
-
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
|
|
3647
|
-
|
|
3648
|
-
|
|
3649
|
-
|
|
3650
|
-
|
|
3651
|
-
|
|
3652
|
-
|
|
3653
|
-
|
|
3654
|
-
|
|
3816
|
+
import { AuditFileSystemBridge } from "@tinacms/graphql";
|
|
3817
|
+
var AuditCommand = class extends Command4 {
|
|
3818
|
+
static paths = [["audit"]];
|
|
3819
|
+
rootPath = Option4.String("--rootPath", {
|
|
3820
|
+
description: "Specify the root directory to run the CLI from"
|
|
3821
|
+
});
|
|
3822
|
+
verbose = Option4.Boolean("-v,--verbose", false, {
|
|
3823
|
+
description: "increase verbosity of logged output"
|
|
3824
|
+
});
|
|
3825
|
+
clean = Option4.Boolean("--clean", false, {
|
|
3826
|
+
description: "Clean the output"
|
|
3827
|
+
});
|
|
3828
|
+
useDefaultValues = Option4.Boolean("--useDefaultValues", false, {
|
|
3829
|
+
description: "When cleaning the output, use defaults on the config"
|
|
3830
|
+
});
|
|
3831
|
+
noTelemetry = Option4.Boolean("--noTelemetry", false, {
|
|
3832
|
+
description: "Disable anonymous telemetry that is collected"
|
|
3833
|
+
});
|
|
3834
|
+
datalayerPort = Option4.String("--datalayer-port", "9000", {
|
|
3835
|
+
description: "Specify a port to run the datalayer server on. (default 9000)"
|
|
3836
|
+
});
|
|
3837
|
+
static usage = Command4.Usage({
|
|
3838
|
+
category: `Commands`,
|
|
3839
|
+
description: `Audit config and content files`
|
|
3840
|
+
});
|
|
3655
3841
|
async catch(error) {
|
|
3656
3842
|
logger.error("Error occured during tinacms audit");
|
|
3657
3843
|
if (this.verbose) {
|
|
@@ -3672,9 +3858,9 @@ var AuditCommand = class extends import_clipanion4.Command {
|
|
|
3672
3858
|
const database = await createAndInitializeDatabase(
|
|
3673
3859
|
configManager,
|
|
3674
3860
|
Number(this.datalayerPort),
|
|
3675
|
-
this.clean ? void 0 : new
|
|
3861
|
+
this.clean ? void 0 : new AuditFileSystemBridge(configManager.rootPath)
|
|
3676
3862
|
);
|
|
3677
|
-
const { tinaSchema, graphQLSchema, lookup } = await (
|
|
3863
|
+
const { tinaSchema, graphQLSchema, lookup } = await buildSchema3(
|
|
3678
3864
|
configManager.config
|
|
3679
3865
|
);
|
|
3680
3866
|
const warnings = [];
|
|
@@ -3705,36 +3891,31 @@ var AuditCommand = class extends import_clipanion4.Command {
|
|
|
3705
3891
|
process.exit();
|
|
3706
3892
|
}
|
|
3707
3893
|
};
|
|
3708
|
-
AuditCommand.paths = [["audit"]];
|
|
3709
|
-
AuditCommand.usage = import_clipanion4.Command.Usage({
|
|
3710
|
-
category: `Commands`,
|
|
3711
|
-
description: `Audit config and content files`
|
|
3712
|
-
});
|
|
3713
3894
|
|
|
3714
3895
|
// src/next/commands/init-command/index.ts
|
|
3715
|
-
|
|
3896
|
+
import { Command as Command6, Option as Option6 } from "clipanion";
|
|
3716
3897
|
|
|
3717
3898
|
// src/cmds/init/detectEnvironment.ts
|
|
3718
|
-
|
|
3719
|
-
|
|
3899
|
+
import fs9 from "fs-extra";
|
|
3900
|
+
import path10 from "path";
|
|
3720
3901
|
var checkGitignoreForItem = async ({
|
|
3721
3902
|
baseDir,
|
|
3722
3903
|
line
|
|
3723
3904
|
}) => {
|
|
3724
|
-
const gitignoreContent =
|
|
3905
|
+
const gitignoreContent = fs9.readFileSync(path10.join(baseDir, ".gitignore")).toString();
|
|
3725
3906
|
return gitignoreContent.split("\n").some((item) => item === line);
|
|
3726
3907
|
};
|
|
3727
3908
|
var makeGeneratedFile = async (name2, generatedFileType, parentPath, opts) => {
|
|
3728
3909
|
const result = {
|
|
3729
|
-
fullPathTS:
|
|
3910
|
+
fullPathTS: path10.join(
|
|
3730
3911
|
parentPath,
|
|
3731
|
-
`${name2}.${
|
|
3912
|
+
`${name2}.${opts?.typescriptSuffix || opts?.extensionOverride || "ts"}`
|
|
3732
3913
|
),
|
|
3733
|
-
fullPathJS:
|
|
3914
|
+
fullPathJS: path10.join(
|
|
3734
3915
|
parentPath,
|
|
3735
|
-
`${name2}.${
|
|
3916
|
+
`${name2}.${opts?.extensionOverride || "js"}`
|
|
3736
3917
|
),
|
|
3737
|
-
fullPathOverride:
|
|
3918
|
+
fullPathOverride: opts?.extensionOverride ? path10.join(parentPath, `${name2}.${opts?.extensionOverride}`) : "",
|
|
3738
3919
|
generatedFileType,
|
|
3739
3920
|
name: name2,
|
|
3740
3921
|
parentPath,
|
|
@@ -3752,8 +3933,8 @@ var makeGeneratedFile = async (name2, generatedFileType, parentPath, opts) => {
|
|
|
3752
3933
|
};
|
|
3753
3934
|
}
|
|
3754
3935
|
};
|
|
3755
|
-
result.typescriptExists = await
|
|
3756
|
-
result.javascriptExists = await
|
|
3936
|
+
result.typescriptExists = await fs9.pathExists(result.fullPathTS);
|
|
3937
|
+
result.javascriptExists = await fs9.pathExists(result.fullPathJS);
|
|
3757
3938
|
return result;
|
|
3758
3939
|
};
|
|
3759
3940
|
var detectEnvironment = async ({
|
|
@@ -3762,22 +3943,21 @@ var detectEnvironment = async ({
|
|
|
3762
3943
|
rootPath,
|
|
3763
3944
|
debug = false
|
|
3764
3945
|
}) => {
|
|
3765
|
-
|
|
3766
|
-
|
|
3767
|
-
import_path7.default.join(pathToForestryConfig, ".forestry", "settings.yml")
|
|
3946
|
+
const hasForestryConfig = await fs9.pathExists(
|
|
3947
|
+
path10.join(pathToForestryConfig, ".forestry", "settings.yml")
|
|
3768
3948
|
);
|
|
3769
|
-
const sampleContentPath =
|
|
3949
|
+
const sampleContentPath = path10.join(
|
|
3770
3950
|
baseDir,
|
|
3771
3951
|
"content",
|
|
3772
3952
|
"posts",
|
|
3773
3953
|
"hello-world.md"
|
|
3774
3954
|
);
|
|
3775
|
-
const usingSrc =
|
|
3776
|
-
const tinaFolder =
|
|
3955
|
+
const usingSrc = fs9.pathExistsSync(path10.join(baseDir, "src")) && (fs9.pathExistsSync(path10.join(baseDir, "src", "app")) || fs9.pathExistsSync(path10.join(baseDir, "src", "pages")));
|
|
3956
|
+
const tinaFolder = path10.join(baseDir, "tina");
|
|
3777
3957
|
const tinaConfigExists = Boolean(
|
|
3778
3958
|
// Does the tina folder exist?
|
|
3779
|
-
await
|
|
3780
|
-
(await
|
|
3959
|
+
await fs9.pathExists(tinaFolder) && // Does the tina folder contain a config file?
|
|
3960
|
+
(await fs9.readdir(tinaFolder)).find((x) => x.includes("config"))
|
|
3781
3961
|
);
|
|
3782
3962
|
const pagesDir = [baseDir, usingSrc ? "src" : false, "pages"].filter(
|
|
3783
3963
|
Boolean
|
|
@@ -3789,12 +3969,12 @@ var detectEnvironment = async ({
|
|
|
3789
3969
|
"next-api-handler": await makeGeneratedFile(
|
|
3790
3970
|
"[...routes]",
|
|
3791
3971
|
"next-api-handler",
|
|
3792
|
-
|
|
3972
|
+
path10.join(...pagesDir, "api", "tina")
|
|
3793
3973
|
),
|
|
3794
3974
|
"reactive-example": await makeGeneratedFile(
|
|
3795
3975
|
"[filename]",
|
|
3796
3976
|
"reactive-example",
|
|
3797
|
-
|
|
3977
|
+
path10.join(...pagesDir, "demo", "blog"),
|
|
3798
3978
|
{
|
|
3799
3979
|
typescriptSuffix: "tsx"
|
|
3800
3980
|
}
|
|
@@ -3802,27 +3982,27 @@ var detectEnvironment = async ({
|
|
|
3802
3982
|
"users-json": await makeGeneratedFile(
|
|
3803
3983
|
"index",
|
|
3804
3984
|
"users-json",
|
|
3805
|
-
|
|
3985
|
+
path10.join(baseDir, "content", "users"),
|
|
3806
3986
|
{ extensionOverride: "json" }
|
|
3807
3987
|
),
|
|
3808
3988
|
"sample-content": await makeGeneratedFile(
|
|
3809
3989
|
"hello-world",
|
|
3810
3990
|
"sample-content",
|
|
3811
|
-
|
|
3991
|
+
path10.join(baseDir, "content", "posts"),
|
|
3812
3992
|
{ extensionOverride: "md" }
|
|
3813
3993
|
)
|
|
3814
3994
|
};
|
|
3815
|
-
const hasSampleContent = await
|
|
3816
|
-
const hasPackageJSON = await
|
|
3995
|
+
const hasSampleContent = await fs9.pathExists(sampleContentPath);
|
|
3996
|
+
const hasPackageJSON = await fs9.pathExists("package.json");
|
|
3817
3997
|
let hasTinaDeps = false;
|
|
3818
3998
|
if (hasPackageJSON) {
|
|
3819
3999
|
try {
|
|
3820
|
-
const packageJSON = await
|
|
4000
|
+
const packageJSON = await fs9.readJSON("package.json");
|
|
3821
4001
|
const deps = [];
|
|
3822
|
-
if (packageJSON
|
|
4002
|
+
if (packageJSON?.dependencies) {
|
|
3823
4003
|
deps.push(...Object.keys(packageJSON.dependencies));
|
|
3824
4004
|
}
|
|
3825
|
-
if (packageJSON
|
|
4005
|
+
if (packageJSON?.devDependencies) {
|
|
3826
4006
|
deps.push(...Object.keys(packageJSON.devDependencies));
|
|
3827
4007
|
}
|
|
3828
4008
|
if (deps.includes("@tinacms/cli") && deps.includes("tinacms")) {
|
|
@@ -3834,16 +4014,16 @@ var detectEnvironment = async ({
|
|
|
3834
4014
|
);
|
|
3835
4015
|
}
|
|
3836
4016
|
}
|
|
3837
|
-
const hasGitIgnore = await
|
|
4017
|
+
const hasGitIgnore = await fs9.pathExists(path10.join(".gitignore"));
|
|
3838
4018
|
const hasGitIgnoreNodeModules = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: "node_modules" });
|
|
3839
4019
|
const hasEnvTina = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: ".env.tina" });
|
|
3840
4020
|
const hasGitIgnoreEnv = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: ".env" });
|
|
3841
4021
|
let frontMatterFormat;
|
|
3842
4022
|
if (hasForestryConfig) {
|
|
3843
|
-
const hugoConfigPath =
|
|
3844
|
-
if (await
|
|
3845
|
-
const hugoConfig = await
|
|
3846
|
-
const metaDataFormat =
|
|
4023
|
+
const hugoConfigPath = path10.join(rootPath, "config.toml");
|
|
4024
|
+
if (await fs9.pathExists(hugoConfigPath)) {
|
|
4025
|
+
const hugoConfig = await fs9.readFile(hugoConfigPath, "utf8");
|
|
4026
|
+
const metaDataFormat = hugoConfig.toString().match(/metaDataFormat = "(.*)"/)?.[1];
|
|
3847
4027
|
if (metaDataFormat && (metaDataFormat === "yaml" || metaDataFormat === "toml" || metaDataFormat === "json")) {
|
|
3848
4028
|
frontMatterFormat = metaDataFormat;
|
|
3849
4029
|
}
|
|
@@ -3873,10 +4053,10 @@ var detectEnvironment = async ({
|
|
|
3873
4053
|
var detectEnvironment_default = detectEnvironment;
|
|
3874
4054
|
|
|
3875
4055
|
// src/cmds/init/prompts/index.ts
|
|
3876
|
-
|
|
4056
|
+
import prompts6 from "prompts";
|
|
3877
4057
|
|
|
3878
4058
|
// src/cmds/init/prompts/askTinaCloudSetup.ts
|
|
3879
|
-
|
|
4059
|
+
import prompts2 from "prompts";
|
|
3880
4060
|
var tinaCloudSetupQuestions = [
|
|
3881
4061
|
{
|
|
3882
4062
|
name: "clientId",
|
|
@@ -3898,7 +4078,7 @@ ${logText(
|
|
|
3898
4078
|
}
|
|
3899
4079
|
];
|
|
3900
4080
|
var askTinaCloudSetup = async ({ config: config2 }) => {
|
|
3901
|
-
const { clientId, token } = await (
|
|
4081
|
+
const { clientId, token } = await prompts2(tinaCloudSetupQuestions);
|
|
3902
4082
|
config2.envVars.push(
|
|
3903
4083
|
{
|
|
3904
4084
|
key: "NEXT_PUBLIC_TINA_CLIENT_ID",
|
|
@@ -3912,7 +4092,7 @@ var askTinaCloudSetup = async ({ config: config2 }) => {
|
|
|
3912
4092
|
};
|
|
3913
4093
|
|
|
3914
4094
|
// src/cmds/init/prompts/gitProvider.ts
|
|
3915
|
-
|
|
4095
|
+
import prompts3 from "prompts";
|
|
3916
4096
|
var supportedGitProviders = {
|
|
3917
4097
|
github: {
|
|
3918
4098
|
imports: [
|
|
@@ -3934,7 +4114,7 @@ var supportedGitProviders = {
|
|
|
3934
4114
|
}
|
|
3935
4115
|
};
|
|
3936
4116
|
var chooseGitProvider = async ({ config: config2 }) => {
|
|
3937
|
-
const result = await (
|
|
4117
|
+
const result = await prompts3([
|
|
3938
4118
|
{
|
|
3939
4119
|
name: "githubToken",
|
|
3940
4120
|
type: "text",
|
|
@@ -3942,7 +4122,7 @@ var chooseGitProvider = async ({ config: config2 }) => {
|
|
|
3942
4122
|
${logText(
|
|
3943
4123
|
"Learn more here: "
|
|
3944
4124
|
)}${linkText(
|
|
3945
|
-
"https://tina.io/docs/self-
|
|
4125
|
+
"https://tina.io/docs/r/self-hosting-nextjs/#github-personal-access-token"
|
|
3946
4126
|
)}`,
|
|
3947
4127
|
initial: process.env.GITHUB_PERSONAL_ACCESS_TOKEN
|
|
3948
4128
|
},
|
|
@@ -3979,7 +4159,7 @@ ${logText(
|
|
|
3979
4159
|
};
|
|
3980
4160
|
|
|
3981
4161
|
// src/cmds/init/prompts/databaseAdapter.ts
|
|
3982
|
-
|
|
4162
|
+
import prompts4 from "prompts";
|
|
3983
4163
|
var supportedDatabaseAdapters = {
|
|
3984
4164
|
["upstash-redis"]: {
|
|
3985
4165
|
databaseAdapterClassText: `new RedisLevel({
|
|
@@ -4025,7 +4205,7 @@ var databaseAdapterUpdateConfig = {
|
|
|
4025
4205
|
other: async (_args) => {
|
|
4026
4206
|
},
|
|
4027
4207
|
mongodb: async ({ config: config2 }) => {
|
|
4028
|
-
const result = await (
|
|
4208
|
+
const result = await prompts4([
|
|
4029
4209
|
{
|
|
4030
4210
|
name: "mongoDBUri",
|
|
4031
4211
|
type: "text",
|
|
@@ -4040,7 +4220,7 @@ var databaseAdapterUpdateConfig = {
|
|
|
4040
4220
|
});
|
|
4041
4221
|
},
|
|
4042
4222
|
"upstash-redis": async ({ config: config2 }) => {
|
|
4043
|
-
const result = await (
|
|
4223
|
+
const result = await prompts4([
|
|
4044
4224
|
{
|
|
4045
4225
|
name: "kvRestApiUrl",
|
|
4046
4226
|
type: "text",
|
|
@@ -4071,7 +4251,7 @@ var chooseDatabaseAdapter = async ({
|
|
|
4071
4251
|
framework,
|
|
4072
4252
|
config: config2
|
|
4073
4253
|
}) => {
|
|
4074
|
-
const answers = await (
|
|
4254
|
+
const answers = await prompts4([
|
|
4075
4255
|
{
|
|
4076
4256
|
name: "dataLayerAdapter",
|
|
4077
4257
|
message: "Select a self-hosted Database Adapter",
|
|
@@ -4101,8 +4281,8 @@ var chooseDatabaseAdapter = async ({
|
|
|
4101
4281
|
};
|
|
4102
4282
|
|
|
4103
4283
|
// src/cmds/init/prompts/authProvider.ts
|
|
4104
|
-
|
|
4105
|
-
|
|
4284
|
+
import crypto2 from "crypto-js";
|
|
4285
|
+
import prompts5 from "prompts";
|
|
4106
4286
|
var supportedAuthProviders = {
|
|
4107
4287
|
other: {
|
|
4108
4288
|
name: "other"
|
|
@@ -4151,12 +4331,12 @@ var authProviderUpdateConfig = {
|
|
|
4151
4331
|
},
|
|
4152
4332
|
"tina-cloud": askTinaCloudSetup,
|
|
4153
4333
|
"next-auth": async ({ config: config2 }) => {
|
|
4154
|
-
const result = await (
|
|
4334
|
+
const result = await prompts5([
|
|
4155
4335
|
{
|
|
4156
4336
|
name: "nextAuthSecret",
|
|
4157
4337
|
type: "text",
|
|
4158
4338
|
message: `What is the NextAuth.js Secret? (Hit enter to use a randomly generated secret)`,
|
|
4159
|
-
initial: process.env.NEXTAUTH_SECRET ||
|
|
4339
|
+
initial: process.env.NEXTAUTH_SECRET || crypto2.lib.WordArray.random(16).toString()
|
|
4160
4340
|
}
|
|
4161
4341
|
]);
|
|
4162
4342
|
config2.envVars.push({
|
|
@@ -4181,7 +4361,7 @@ var forestryDisclaimer = logText(
|
|
|
4181
4361
|
`Note: This migration will update some of your content to match tina. Please save a backup of your content before doing this migration. (This can be done with git)`
|
|
4182
4362
|
);
|
|
4183
4363
|
var askCommonSetUp = async () => {
|
|
4184
|
-
const answers = await (
|
|
4364
|
+
const answers = await prompts6([
|
|
4185
4365
|
{
|
|
4186
4366
|
name: "framework",
|
|
4187
4367
|
type: "select",
|
|
@@ -4203,7 +4383,8 @@ var askCommonSetUp = async () => {
|
|
|
4203
4383
|
choices: [
|
|
4204
4384
|
{ title: "PNPM", value: "pnpm" },
|
|
4205
4385
|
{ title: "Yarn", value: "yarn" },
|
|
4206
|
-
{ title: "NPM", value: "npm" }
|
|
4386
|
+
{ title: "NPM", value: "npm" },
|
|
4387
|
+
{ title: "Bun", value: "bun" }
|
|
4207
4388
|
]
|
|
4208
4389
|
}
|
|
4209
4390
|
]);
|
|
@@ -4244,7 +4425,7 @@ ${forestryDisclaimer}`
|
|
|
4244
4425
|
message: `What format are you using in your frontmatter?`
|
|
4245
4426
|
});
|
|
4246
4427
|
}
|
|
4247
|
-
const answers = await (
|
|
4428
|
+
const answers = await prompts6(questions);
|
|
4248
4429
|
return answers;
|
|
4249
4430
|
};
|
|
4250
4431
|
var askTinaSetupPrompts = async (params) => {
|
|
@@ -4264,16 +4445,16 @@ var askTinaSetupPrompts = async (params) => {
|
|
|
4264
4445
|
message: `Where are public assets stored? (default: "public")
|
|
4265
4446
|
` + logText(
|
|
4266
4447
|
`Not sure what value to use? Refer to our "Frameworks" doc: ${linkText(
|
|
4267
|
-
"https://tina.io/docs/
|
|
4448
|
+
"https://tina.io/docs/r/framework-guides-overview"
|
|
4268
4449
|
)}`
|
|
4269
4450
|
)
|
|
4270
4451
|
});
|
|
4271
4452
|
}
|
|
4272
|
-
const answers = await (
|
|
4453
|
+
const answers = await prompts6(questions);
|
|
4273
4454
|
return answers;
|
|
4274
4455
|
};
|
|
4275
4456
|
var askIfUsingSelfHosted = async () => {
|
|
4276
|
-
const answers = await (
|
|
4457
|
+
const answers = await prompts6([
|
|
4277
4458
|
{
|
|
4278
4459
|
name: "hosting",
|
|
4279
4460
|
type: "select",
|
|
@@ -4306,20 +4487,20 @@ var makeImportString = (imports) => {
|
|
|
4306
4487
|
};
|
|
4307
4488
|
|
|
4308
4489
|
// src/cmds/init/prompts/generatedFiles.ts
|
|
4309
|
-
|
|
4490
|
+
import prompts7 from "prompts";
|
|
4310
4491
|
var askIfOverride = async ({
|
|
4311
4492
|
generatedFile,
|
|
4312
4493
|
usingTypescript
|
|
4313
4494
|
}) => {
|
|
4314
4495
|
if (usingTypescript) {
|
|
4315
|
-
const result = await (
|
|
4496
|
+
const result = await prompts7({
|
|
4316
4497
|
name: `override`,
|
|
4317
4498
|
type: "confirm",
|
|
4318
4499
|
message: `Found existing file at ${generatedFile.fullPathTS}. Would you like to overwrite?`
|
|
4319
4500
|
});
|
|
4320
4501
|
return Boolean(result.override);
|
|
4321
4502
|
} else {
|
|
4322
|
-
const result = await (
|
|
4503
|
+
const result = await prompts7({
|
|
4323
4504
|
name: `override`,
|
|
4324
4505
|
type: "confirm",
|
|
4325
4506
|
message: `Found existing file at ${generatedFile.fullPathJS}. Would you like to overwrite?`
|
|
@@ -4454,23 +4635,25 @@ var CLICommand = class {
|
|
|
4454
4635
|
};
|
|
4455
4636
|
|
|
4456
4637
|
// src/cmds/init/apply.ts
|
|
4457
|
-
|
|
4638
|
+
import path14 from "path";
|
|
4458
4639
|
|
|
4459
4640
|
// src/cmds/forestry-migrate/index.ts
|
|
4460
|
-
|
|
4461
|
-
|
|
4462
|
-
|
|
4463
|
-
|
|
4464
|
-
|
|
4641
|
+
import fs11 from "fs-extra";
|
|
4642
|
+
import path12 from "path";
|
|
4643
|
+
import yaml2 from "js-yaml";
|
|
4644
|
+
import pkg from "minimatch";
|
|
4645
|
+
import { parseFile, stringifyFile } from "@tinacms/graphql";
|
|
4646
|
+
import { CONTENT_FORMATS } from "@tinacms/schema-tools";
|
|
4465
4647
|
|
|
4466
4648
|
// src/cmds/forestry-migrate/util/index.ts
|
|
4467
|
-
|
|
4468
|
-
|
|
4469
|
-
|
|
4470
|
-
|
|
4649
|
+
import fs10 from "fs-extra";
|
|
4650
|
+
import path11 from "path";
|
|
4651
|
+
import yaml from "js-yaml";
|
|
4652
|
+
import z from "zod";
|
|
4471
4653
|
|
|
4472
4654
|
// src/cmds/forestry-migrate/util/errorSingleton.ts
|
|
4473
4655
|
var ErrorSingleton = class _ErrorSingleton {
|
|
4656
|
+
static instance;
|
|
4474
4657
|
/**
|
|
4475
4658
|
* The Singleton's constructor should always be private to prevent direct
|
|
4476
4659
|
* construction calls with the `new` operator.
|
|
@@ -4490,12 +4673,12 @@ var ErrorSingleton = class _ErrorSingleton {
|
|
|
4490
4673
|
}
|
|
4491
4674
|
return _ErrorSingleton.instance;
|
|
4492
4675
|
}
|
|
4676
|
+
collectionNameErrors;
|
|
4493
4677
|
addErrorName(error) {
|
|
4494
4678
|
this.collectionNameErrors.push(error);
|
|
4495
4679
|
}
|
|
4496
4680
|
printCollectionNameErrors() {
|
|
4497
|
-
|
|
4498
|
-
if ((_a = this.collectionNameErrors) == null ? void 0 : _a.length) {
|
|
4681
|
+
if (this.collectionNameErrors?.length) {
|
|
4499
4682
|
logger.error(
|
|
4500
4683
|
dangerText("ERROR: TinaCMS only supports alphanumeric template names")
|
|
4501
4684
|
);
|
|
@@ -4513,8 +4696,8 @@ var ErrorSingleton = class _ErrorSingleton {
|
|
|
4513
4696
|
};
|
|
4514
4697
|
|
|
4515
4698
|
// src/cmds/forestry-migrate/util/codeTransformer.ts
|
|
4516
|
-
|
|
4517
|
-
|
|
4699
|
+
import { format } from "prettier";
|
|
4700
|
+
import TsParser from "prettier/parser-typescript.js";
|
|
4518
4701
|
var addVariablesToCode = (codeWithTinaPrefix) => {
|
|
4519
4702
|
const code = codeWithTinaPrefix.replace(
|
|
4520
4703
|
/"__TINA_INTERNAL__:::(.*?):::"/g,
|
|
@@ -4551,7 +4734,7 @@ var makeTemplateFile = async ({
|
|
|
4551
4734
|
`export function ${stringifyLabelWithField(
|
|
4552
4735
|
template.templateObj.label
|
|
4553
4736
|
)} (){
|
|
4554
|
-
return ${addVariablesToCode(JSON.stringify(template.fields, null, 2)).code} ${usingTypescript ? "as TinaField[]" : ""}
|
|
4737
|
+
return ${addVariablesToCode(JSON.stringify(template.fields, null, 2)).code} ${usingTypescript ? "as TinaField[]" : ""}
|
|
4555
4738
|
} `
|
|
4556
4739
|
);
|
|
4557
4740
|
}
|
|
@@ -4559,9 +4742,9 @@ var makeTemplateFile = async ({
|
|
|
4559
4742
|
${usingTypescript ? "import type { TinaField } from 'tinacms'" : ""}
|
|
4560
4743
|
${templateCodeText.join("\n")}
|
|
4561
4744
|
`;
|
|
4562
|
-
const formattedCode =
|
|
4745
|
+
const formattedCode = format(templateCode, {
|
|
4563
4746
|
parser: "typescript",
|
|
4564
|
-
plugins: [
|
|
4747
|
+
plugins: [TsParser]
|
|
4565
4748
|
});
|
|
4566
4749
|
return { importStatements, templateCodeText: formattedCode };
|
|
4567
4750
|
};
|
|
@@ -4593,82 +4776,82 @@ var stringifyTemplateName = (name2, template) => {
|
|
|
4593
4776
|
return newName;
|
|
4594
4777
|
}
|
|
4595
4778
|
};
|
|
4596
|
-
var forestryConfigSchema =
|
|
4597
|
-
sections:
|
|
4598
|
-
|
|
4599
|
-
type:
|
|
4600
|
-
|
|
4601
|
-
|
|
4602
|
-
|
|
4603
|
-
|
|
4604
|
-
|
|
4779
|
+
var forestryConfigSchema = z.object({
|
|
4780
|
+
sections: z.array(
|
|
4781
|
+
z.object({
|
|
4782
|
+
type: z.union([
|
|
4783
|
+
z.literal("directory"),
|
|
4784
|
+
z.literal("document"),
|
|
4785
|
+
z.literal("heading"),
|
|
4786
|
+
z.literal("jekyll-pages"),
|
|
4787
|
+
z.literal("jekyll-posts")
|
|
4605
4788
|
]),
|
|
4606
|
-
label:
|
|
4607
|
-
path:
|
|
4608
|
-
match:
|
|
4609
|
-
exclude:
|
|
4610
|
-
create:
|
|
4611
|
-
templates:
|
|
4612
|
-
new_doc_ext:
|
|
4613
|
-
read_only:
|
|
4789
|
+
label: z.string(),
|
|
4790
|
+
path: z.string().optional().nullable(),
|
|
4791
|
+
match: z.string().optional().nullable(),
|
|
4792
|
+
exclude: z.string().optional().nullable(),
|
|
4793
|
+
create: z.union([z.literal("all"), z.literal("documents"), z.literal("none")]).optional(),
|
|
4794
|
+
templates: z.array(z.string()).optional().nullable(),
|
|
4795
|
+
new_doc_ext: z.string().optional().nullable(),
|
|
4796
|
+
read_only: z.boolean().optional().nullable()
|
|
4614
4797
|
})
|
|
4615
4798
|
)
|
|
4616
4799
|
});
|
|
4617
|
-
var forestryFieldWithoutField =
|
|
4800
|
+
var forestryFieldWithoutField = z.object({
|
|
4618
4801
|
// TODO: maybe better type this?
|
|
4619
|
-
type:
|
|
4620
|
-
|
|
4621
|
-
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
|
|
4626
|
-
|
|
4627
|
-
|
|
4628
|
-
|
|
4629
|
-
|
|
4630
|
-
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
4802
|
+
type: z.union([
|
|
4803
|
+
z.literal("text"),
|
|
4804
|
+
z.literal("datetime"),
|
|
4805
|
+
z.literal("list"),
|
|
4806
|
+
z.literal("file"),
|
|
4807
|
+
z.literal("image_gallery"),
|
|
4808
|
+
z.literal("textarea"),
|
|
4809
|
+
z.literal("tag_list"),
|
|
4810
|
+
z.literal("number"),
|
|
4811
|
+
z.literal("boolean"),
|
|
4812
|
+
z.literal("field_group"),
|
|
4813
|
+
z.literal("field_group_list"),
|
|
4814
|
+
z.literal("select"),
|
|
4815
|
+
z.literal("include"),
|
|
4816
|
+
z.literal("blocks"),
|
|
4817
|
+
z.literal("color")
|
|
4635
4818
|
]),
|
|
4636
|
-
template_types:
|
|
4637
|
-
name:
|
|
4638
|
-
label:
|
|
4639
|
-
default:
|
|
4640
|
-
template:
|
|
4641
|
-
config:
|
|
4819
|
+
template_types: z.array(z.string()).optional().nullable(),
|
|
4820
|
+
name: z.string(),
|
|
4821
|
+
label: z.string(),
|
|
4822
|
+
default: z.any().optional(),
|
|
4823
|
+
template: z.string().optional(),
|
|
4824
|
+
config: z.object({
|
|
4642
4825
|
// min and max are used for lists
|
|
4643
|
-
min:
|
|
4644
|
-
max:
|
|
4645
|
-
required:
|
|
4646
|
-
use_select:
|
|
4647
|
-
date_format:
|
|
4648
|
-
time_format:
|
|
4649
|
-
options:
|
|
4650
|
-
source:
|
|
4651
|
-
type:
|
|
4652
|
-
|
|
4653
|
-
|
|
4654
|
-
|
|
4655
|
-
|
|
4826
|
+
min: z.number().optional().nullable(),
|
|
4827
|
+
max: z.number().optional().nullable(),
|
|
4828
|
+
required: z.boolean().optional().nullable(),
|
|
4829
|
+
use_select: z.boolean().optional().nullable(),
|
|
4830
|
+
date_format: z.string().optional().nullable(),
|
|
4831
|
+
time_format: z.string().optional().nullable(),
|
|
4832
|
+
options: z.array(z.string()).optional().nullable(),
|
|
4833
|
+
source: z.object({
|
|
4834
|
+
type: z.union([
|
|
4835
|
+
z.literal("custom"),
|
|
4836
|
+
z.literal("pages"),
|
|
4837
|
+
z.literal("documents"),
|
|
4838
|
+
z.literal("simple"),
|
|
4656
4839
|
// TODO: I want to ignore this key if its invalid
|
|
4657
|
-
|
|
4840
|
+
z.string()
|
|
4658
4841
|
]).optional().nullable(),
|
|
4659
|
-
section:
|
|
4842
|
+
section: z.string().optional().nullable()
|
|
4660
4843
|
}).optional()
|
|
4661
4844
|
}).optional()
|
|
4662
4845
|
});
|
|
4663
|
-
var forestryField =
|
|
4846
|
+
var forestryField = z.lazy(
|
|
4664
4847
|
() => forestryFieldWithoutField.extend({
|
|
4665
|
-
fields:
|
|
4848
|
+
fields: z.array(forestryField).optional()
|
|
4666
4849
|
})
|
|
4667
4850
|
);
|
|
4668
|
-
var FrontmatterTemplateSchema =
|
|
4669
|
-
label:
|
|
4670
|
-
hide_body:
|
|
4671
|
-
fields:
|
|
4851
|
+
var FrontmatterTemplateSchema = z.object({
|
|
4852
|
+
label: z.string(),
|
|
4853
|
+
hide_body: z.boolean().optional(),
|
|
4854
|
+
fields: z.array(forestryField).optional()
|
|
4672
4855
|
});
|
|
4673
4856
|
var transformForestryFieldsToTinaFields = ({
|
|
4674
4857
|
fields,
|
|
@@ -4677,8 +4860,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4677
4860
|
skipBlocks = false
|
|
4678
4861
|
}) => {
|
|
4679
4862
|
const tinaFields = [];
|
|
4680
|
-
fields
|
|
4681
|
-
var _a, _b, _c, _d;
|
|
4863
|
+
fields?.forEach((forestryField2) => {
|
|
4682
4864
|
if (forestryField2.name === "menu") {
|
|
4683
4865
|
logger.info(
|
|
4684
4866
|
warnText(
|
|
@@ -4754,12 +4936,12 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4754
4936
|
};
|
|
4755
4937
|
break;
|
|
4756
4938
|
case "select":
|
|
4757
|
-
if (
|
|
4939
|
+
if (forestryField2.config?.options) {
|
|
4758
4940
|
field = {
|
|
4759
4941
|
type: "string",
|
|
4760
4942
|
...getTinaFieldsFromName(forestryField2.name),
|
|
4761
4943
|
label: forestryField2.label,
|
|
4762
|
-
options:
|
|
4944
|
+
options: forestryField2.config?.options || []
|
|
4763
4945
|
};
|
|
4764
4946
|
} else {
|
|
4765
4947
|
logger.info(
|
|
@@ -4777,7 +4959,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4777
4959
|
label: forestryField2.label,
|
|
4778
4960
|
list: true
|
|
4779
4961
|
};
|
|
4780
|
-
if (
|
|
4962
|
+
if (forestryField2.config?.options) {
|
|
4781
4963
|
field.options = forestryField2.config.options;
|
|
4782
4964
|
}
|
|
4783
4965
|
break;
|
|
@@ -4825,7 +5007,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4825
5007
|
break;
|
|
4826
5008
|
}
|
|
4827
5009
|
const templates2 = [];
|
|
4828
|
-
forestryField2
|
|
5010
|
+
forestryField2?.template_types.forEach((tem) => {
|
|
4829
5011
|
const { template: template2 } = getFieldsFromTemplates({
|
|
4830
5012
|
tem,
|
|
4831
5013
|
skipBlocks: true,
|
|
@@ -4883,7 +5065,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4883
5065
|
);
|
|
4884
5066
|
}
|
|
4885
5067
|
if (field) {
|
|
4886
|
-
if (
|
|
5068
|
+
if (forestryField2.config?.required) {
|
|
4887
5069
|
field = { ...field, required: true };
|
|
4888
5070
|
}
|
|
4889
5071
|
tinaFields.push(field);
|
|
@@ -4892,7 +5074,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4892
5074
|
return tinaFields;
|
|
4893
5075
|
};
|
|
4894
5076
|
var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false }) => {
|
|
4895
|
-
const templatePath =
|
|
5077
|
+
const templatePath = path11.join(
|
|
4896
5078
|
pathToForestryConfig,
|
|
4897
5079
|
".forestry",
|
|
4898
5080
|
"front_matter",
|
|
@@ -4901,7 +5083,7 @@ var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false })
|
|
|
4901
5083
|
);
|
|
4902
5084
|
let templateString = "";
|
|
4903
5085
|
try {
|
|
4904
|
-
templateString =
|
|
5086
|
+
templateString = fs10.readFileSync(templatePath).toString();
|
|
4905
5087
|
} catch {
|
|
4906
5088
|
throw new Error(
|
|
4907
5089
|
`Could not find template ${tem} at ${templatePath}
|
|
@@ -4909,7 +5091,7 @@ var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false })
|
|
|
4909
5091
|
This will require manual migration.`
|
|
4910
5092
|
);
|
|
4911
5093
|
}
|
|
4912
|
-
const templateObj =
|
|
5094
|
+
const templateObj = yaml.load(templateString);
|
|
4913
5095
|
const template = parseTemplates({ val: templateObj });
|
|
4914
5096
|
const fields = transformForestryFieldsToTinaFields({
|
|
4915
5097
|
fields: template.fields,
|
|
@@ -4929,6 +5111,7 @@ var parseSections = ({ val }) => {
|
|
|
4929
5111
|
};
|
|
4930
5112
|
|
|
4931
5113
|
// src/cmds/forestry-migrate/index.ts
|
|
5114
|
+
var { minimatch } = pkg;
|
|
4932
5115
|
var BODY_FIELD = {
|
|
4933
5116
|
// This is the body field
|
|
4934
5117
|
type: "rich-text",
|
|
@@ -4945,8 +5128,7 @@ var stringifyLabelWithField = (label) => {
|
|
|
4945
5128
|
return `${labelString}Fields`;
|
|
4946
5129
|
};
|
|
4947
5130
|
var transformForestryMatchToTinaMatch = (match) => {
|
|
4948
|
-
|
|
4949
|
-
const newMatch = (_b = (_a = match.replace(" ", "").replace(/\.?(mdx|md|json|yaml|yml|toml)/g, "")) == null ? void 0 : _a.replace(/\..*$/g, "")) == null ? void 0 : _b.replace("{}", "");
|
|
5131
|
+
const newMatch = match.replace(" ", "").replace(/\.?(mdx|md|json|yaml|yml|toml)/g, "")?.replace(/\..*$/g, "")?.replace("{}", "");
|
|
4950
5132
|
if (match !== newMatch) {
|
|
4951
5133
|
logger.info(
|
|
4952
5134
|
`Info: Match ${match} was transformed to ${newMatch}. See ${linkText(
|
|
@@ -4958,7 +5140,7 @@ var transformForestryMatchToTinaMatch = (match) => {
|
|
|
4958
5140
|
};
|
|
4959
5141
|
function checkExt(ext) {
|
|
4960
5142
|
const extReal = ext.replace(".", "");
|
|
4961
|
-
if (
|
|
5143
|
+
if (CONTENT_FORMATS.includes(extReal)) {
|
|
4962
5144
|
return extReal;
|
|
4963
5145
|
} else {
|
|
4964
5146
|
return false;
|
|
@@ -4967,9 +5149,9 @@ function checkExt(ext) {
|
|
|
4967
5149
|
var generateAllTemplates = async ({
|
|
4968
5150
|
pathToForestryConfig
|
|
4969
5151
|
}) => {
|
|
4970
|
-
const allTemplates = (await
|
|
4971
|
-
|
|
4972
|
-
)).map((tem) =>
|
|
5152
|
+
const allTemplates = (await fs11.readdir(
|
|
5153
|
+
path12.join(pathToForestryConfig, ".forestry", "front_matter", "templates")
|
|
5154
|
+
)).map((tem) => path12.basename(tem, ".yml"));
|
|
4973
5155
|
const templateMap = /* @__PURE__ */ new Map();
|
|
4974
5156
|
const proms = allTemplates.map(async (tem) => {
|
|
4975
5157
|
try {
|
|
@@ -4979,7 +5161,7 @@ var generateAllTemplates = async ({
|
|
|
4979
5161
|
});
|
|
4980
5162
|
templateMap.set(tem, { fields, templateObj });
|
|
4981
5163
|
} catch (e) {
|
|
4982
|
-
logger.
|
|
5164
|
+
logger.warn(`Error parsing template frontmatter template, ${tem}.yml`);
|
|
4983
5165
|
console.error(e);
|
|
4984
5166
|
templateMap.set(tem, { fields: [], templateObj: {} });
|
|
4985
5167
|
}
|
|
@@ -5011,19 +5193,19 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5011
5193
|
}
|
|
5012
5194
|
if (section.match) {
|
|
5013
5195
|
baseCollection.match = {
|
|
5014
|
-
...
|
|
5196
|
+
...baseCollection?.match || {},
|
|
5015
5197
|
include: transformForestryMatchToTinaMatch(section.match)
|
|
5016
5198
|
};
|
|
5017
5199
|
}
|
|
5018
5200
|
if (section.exclude) {
|
|
5019
5201
|
baseCollection.match = {
|
|
5020
|
-
...
|
|
5202
|
+
...baseCollection?.match || {},
|
|
5021
5203
|
exclude: transformForestryMatchToTinaMatch(section.exclude)
|
|
5022
5204
|
};
|
|
5023
5205
|
}
|
|
5024
5206
|
if (section.type === "directory") {
|
|
5025
|
-
if (!
|
|
5026
|
-
logger.
|
|
5207
|
+
if (!section?.path || section.path === "/" || section.path === "./" || section.path === ".") {
|
|
5208
|
+
logger.warn(
|
|
5027
5209
|
warnText(
|
|
5028
5210
|
`Warning: Section ${section.label} is using a Root Path. Currently, Tina Does not support Root paths see ${linkText(
|
|
5029
5211
|
"https://github.com/tinacms/tinacms/issues/3768"
|
|
@@ -5032,11 +5214,11 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5032
5214
|
);
|
|
5033
5215
|
return;
|
|
5034
5216
|
}
|
|
5035
|
-
const forestryTemplates =
|
|
5217
|
+
const forestryTemplates = section?.templates || [];
|
|
5036
5218
|
if (forestryTemplates.length === 0 && section.create === "all") {
|
|
5037
5219
|
for (const templateKey of templateMap.keys()) {
|
|
5038
5220
|
const { templateObj } = templateMap.get(templateKey);
|
|
5039
|
-
const pages = templateObj
|
|
5221
|
+
const pages = templateObj?.pages;
|
|
5040
5222
|
if (pages) {
|
|
5041
5223
|
let glob = section.match;
|
|
5042
5224
|
const skipPath = section.path === "" || section.path === "/" || !section.path;
|
|
@@ -5044,7 +5226,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5044
5226
|
glob = section.path + "/" + section.match;
|
|
5045
5227
|
}
|
|
5046
5228
|
if (pages.some((page) => {
|
|
5047
|
-
return (
|
|
5229
|
+
return minimatch(page, glob);
|
|
5048
5230
|
})) {
|
|
5049
5231
|
forestryTemplates.push(templateKey);
|
|
5050
5232
|
}
|
|
@@ -5053,7 +5235,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5053
5235
|
}
|
|
5054
5236
|
const hasBody = ["md", "mdx", "markdown"].includes(format3);
|
|
5055
5237
|
let c;
|
|
5056
|
-
if ((
|
|
5238
|
+
if ((forestryTemplates?.length || 0) > 1) {
|
|
5057
5239
|
c = {
|
|
5058
5240
|
...baseCollection,
|
|
5059
5241
|
// @ts-expect-error
|
|
@@ -5075,7 +5257,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5075
5257
|
})
|
|
5076
5258
|
};
|
|
5077
5259
|
}
|
|
5078
|
-
if (
|
|
5260
|
+
if (forestryTemplates?.length === 1) {
|
|
5079
5261
|
const tem = forestryTemplates[0];
|
|
5080
5262
|
const template = templateMap.get(tem);
|
|
5081
5263
|
const fieldsString = stringifyLabelWithField(template.templateObj.label);
|
|
@@ -5090,7 +5272,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5090
5272
|
})
|
|
5091
5273
|
};
|
|
5092
5274
|
}
|
|
5093
|
-
if (
|
|
5275
|
+
if (forestryTemplates?.length === 0) {
|
|
5094
5276
|
logger.warn(
|
|
5095
5277
|
warnText(
|
|
5096
5278
|
`No templates found for section ${section.label}. Please see ${linkText(
|
|
@@ -5103,7 +5285,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5103
5285
|
fields: [BODY_FIELD]
|
|
5104
5286
|
};
|
|
5105
5287
|
}
|
|
5106
|
-
if (
|
|
5288
|
+
if (section?.create === "none") {
|
|
5107
5289
|
c.ui = {
|
|
5108
5290
|
...c.ui,
|
|
5109
5291
|
allowedActions: {
|
|
@@ -5114,9 +5296,9 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5114
5296
|
return c;
|
|
5115
5297
|
} else if (section.type === "document") {
|
|
5116
5298
|
const filePath = section.path;
|
|
5117
|
-
const extname =
|
|
5118
|
-
const fileName =
|
|
5119
|
-
const dir =
|
|
5299
|
+
const extname = path12.extname(filePath);
|
|
5300
|
+
const fileName = path12.basename(filePath, extname);
|
|
5301
|
+
const dir = path12.dirname(filePath);
|
|
5120
5302
|
const ext = checkExt(extname);
|
|
5121
5303
|
if (ext) {
|
|
5122
5304
|
const fields = [];
|
|
@@ -5125,7 +5307,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5125
5307
|
}
|
|
5126
5308
|
for (const currentTemplateName of templateMap.keys()) {
|
|
5127
5309
|
const { templateObj, fields: additionalFields } = templateMap.get(currentTemplateName);
|
|
5128
|
-
const pages =
|
|
5310
|
+
const pages = templateObj?.pages || [];
|
|
5129
5311
|
if (pages.includes(section.path)) {
|
|
5130
5312
|
fields.push(...additionalFields);
|
|
5131
5313
|
break;
|
|
@@ -5136,7 +5318,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5136
5318
|
name: "dummy",
|
|
5137
5319
|
label: "Dummy field",
|
|
5138
5320
|
type: "string",
|
|
5139
|
-
description: "This is a dummy field, please replace it with the fields you want to edit. See https://tina.io/docs/
|
|
5321
|
+
description: "This is a dummy field, please replace it with the fields you want to edit. See https://tina.io/docs/r/content-modelling-collections/ for more info"
|
|
5140
5322
|
});
|
|
5141
5323
|
logger.warn(
|
|
5142
5324
|
warnText(
|
|
@@ -5160,7 +5342,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5160
5342
|
fields
|
|
5161
5343
|
};
|
|
5162
5344
|
} else {
|
|
5163
|
-
logger.
|
|
5345
|
+
logger.warn(
|
|
5164
5346
|
warnText(
|
|
5165
5347
|
`Error: document section has an unsupported file extension: ${extname} in ${section.path}`
|
|
5166
5348
|
)
|
|
@@ -5178,8 +5360,8 @@ var generateCollections = async ({
|
|
|
5178
5360
|
templateMap,
|
|
5179
5361
|
usingTypescript
|
|
5180
5362
|
});
|
|
5181
|
-
const forestryConfig = await
|
|
5182
|
-
|
|
5363
|
+
const forestryConfig = await fs11.readFile(
|
|
5364
|
+
path12.join(pathToForestryConfig, ".forestry", "settings.yml")
|
|
5183
5365
|
);
|
|
5184
5366
|
rewriteTemplateKeysInDocs({
|
|
5185
5367
|
templateMap,
|
|
@@ -5189,7 +5371,7 @@ var generateCollections = async ({
|
|
|
5189
5371
|
}
|
|
5190
5372
|
});
|
|
5191
5373
|
const collections = parseSections({
|
|
5192
|
-
val:
|
|
5374
|
+
val: yaml2.load(forestryConfig.toString())
|
|
5193
5375
|
}).sections.map(
|
|
5194
5376
|
(section) => generateCollectionFromForestrySection({
|
|
5195
5377
|
section,
|
|
@@ -5204,19 +5386,18 @@ var generateCollections = async ({
|
|
|
5204
5386
|
};
|
|
5205
5387
|
};
|
|
5206
5388
|
var rewriteTemplateKeysInDocs = (args) => {
|
|
5207
|
-
var _a;
|
|
5208
5389
|
const { templateMap, markdownParseConfig } = args;
|
|
5209
5390
|
for (const templateKey of templateMap.keys()) {
|
|
5210
5391
|
const { templateObj } = templateMap.get(templateKey);
|
|
5211
|
-
|
|
5392
|
+
templateObj?.pages?.forEach((page) => {
|
|
5212
5393
|
try {
|
|
5213
|
-
const filePath =
|
|
5214
|
-
if (
|
|
5394
|
+
const filePath = path12.join(page);
|
|
5395
|
+
if (fs11.lstatSync(filePath).isDirectory()) {
|
|
5215
5396
|
return;
|
|
5216
5397
|
}
|
|
5217
|
-
const extname =
|
|
5218
|
-
const fileContent =
|
|
5219
|
-
const content =
|
|
5398
|
+
const extname = path12.extname(filePath);
|
|
5399
|
+
const fileContent = fs11.readFileSync(filePath).toString();
|
|
5400
|
+
const content = parseFile(
|
|
5220
5401
|
fileContent,
|
|
5221
5402
|
extname,
|
|
5222
5403
|
(yup) => yup.object({}),
|
|
@@ -5226,9 +5407,9 @@ var rewriteTemplateKeysInDocs = (args) => {
|
|
|
5226
5407
|
_template: stringifyLabel(templateKey),
|
|
5227
5408
|
...content
|
|
5228
5409
|
};
|
|
5229
|
-
|
|
5410
|
+
fs11.writeFileSync(
|
|
5230
5411
|
filePath,
|
|
5231
|
-
|
|
5412
|
+
stringifyFile(newContent, extname, true, markdownParseConfig)
|
|
5232
5413
|
);
|
|
5233
5414
|
} catch (error) {
|
|
5234
5415
|
console.log(
|
|
@@ -5240,23 +5421,25 @@ var rewriteTemplateKeysInDocs = (args) => {
|
|
|
5240
5421
|
};
|
|
5241
5422
|
|
|
5242
5423
|
// src/cmds/init/apply.ts
|
|
5243
|
-
|
|
5244
|
-
|
|
5424
|
+
import { Telemetry as Telemetry2 } from "@tinacms/metrics";
|
|
5425
|
+
import fs14 from "fs-extra";
|
|
5245
5426
|
|
|
5246
5427
|
// src/next/commands/codemod-command/index.ts
|
|
5247
|
-
|
|
5248
|
-
|
|
5249
|
-
|
|
5250
|
-
var CodemodCommand = class extends
|
|
5251
|
-
|
|
5252
|
-
|
|
5253
|
-
|
|
5254
|
-
|
|
5255
|
-
|
|
5256
|
-
|
|
5257
|
-
|
|
5258
|
-
|
|
5259
|
-
|
|
5428
|
+
import { Command as Command5, Option as Option5 } from "clipanion";
|
|
5429
|
+
import fs12 from "fs-extra";
|
|
5430
|
+
import path13 from "path";
|
|
5431
|
+
var CodemodCommand = class extends Command5 {
|
|
5432
|
+
static paths = [["codemod"], ["codemod", "move-tina-folder"]];
|
|
5433
|
+
rootPath = Option5.String("--rootPath", {
|
|
5434
|
+
description: "Specify the root directory to run the CLI from"
|
|
5435
|
+
});
|
|
5436
|
+
verbose = Option5.Boolean("-v,--verbose", false, {
|
|
5437
|
+
description: "increase verbosity of logged output"
|
|
5438
|
+
});
|
|
5439
|
+
static usage = Command5.Usage({
|
|
5440
|
+
category: `Commands`,
|
|
5441
|
+
description: `Use codemods for various Tina tasks`
|
|
5442
|
+
});
|
|
5260
5443
|
async catch(error) {
|
|
5261
5444
|
console.log(error);
|
|
5262
5445
|
}
|
|
@@ -5277,11 +5460,6 @@ var CodemodCommand = class extends import_clipanion5.Command {
|
|
|
5277
5460
|
await command2();
|
|
5278
5461
|
}
|
|
5279
5462
|
};
|
|
5280
|
-
CodemodCommand.paths = [["codemod"], ["codemod", "move-tina-folder"]];
|
|
5281
|
-
CodemodCommand.usage = import_clipanion5.Command.Usage({
|
|
5282
|
-
category: `Commands`,
|
|
5283
|
-
description: `Use codemods for various Tina tasks`
|
|
5284
|
-
});
|
|
5285
5463
|
var moveTinaFolder = async (rootPath = process.cwd()) => {
|
|
5286
5464
|
const configManager = new ConfigManager({ rootPath });
|
|
5287
5465
|
try {
|
|
@@ -5290,13 +5468,13 @@ var moveTinaFolder = async (rootPath = process.cwd()) => {
|
|
|
5290
5468
|
logger.error(e.message);
|
|
5291
5469
|
process.exit(1);
|
|
5292
5470
|
}
|
|
5293
|
-
const tinaDestination =
|
|
5294
|
-
if (await
|
|
5471
|
+
const tinaDestination = path13.join(configManager.rootPath, "tina");
|
|
5472
|
+
if (await fs12.existsSync(tinaDestination)) {
|
|
5295
5473
|
logger.info(
|
|
5296
5474
|
`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.`
|
|
5297
5475
|
);
|
|
5298
5476
|
} else {
|
|
5299
|
-
await
|
|
5477
|
+
await fs12.moveSync(configManager.tinaFolderPath, tinaDestination);
|
|
5300
5478
|
await writeGitignore(configManager.rootPath);
|
|
5301
5479
|
logger.info(
|
|
5302
5480
|
"Move to 'tina' folder complete. Be sure to update any imports of the autogenerated client!"
|
|
@@ -5304,8 +5482,8 @@ var moveTinaFolder = async (rootPath = process.cwd()) => {
|
|
|
5304
5482
|
}
|
|
5305
5483
|
};
|
|
5306
5484
|
var writeGitignore = async (rootPath) => {
|
|
5307
|
-
await
|
|
5308
|
-
|
|
5485
|
+
await fs12.outputFileSync(
|
|
5486
|
+
path13.join(rootPath, "tina", ".gitignore"),
|
|
5309
5487
|
"__generated__"
|
|
5310
5488
|
);
|
|
5311
5489
|
};
|
|
@@ -5358,7 +5536,7 @@ const BlogPage = (props) => {
|
|
|
5358
5536
|
<div className='bg-green-100 text-center'>
|
|
5359
5537
|
Lost and looking for a place to start?
|
|
5360
5538
|
<a
|
|
5361
|
-
href='https://tina.io/
|
|
5539
|
+
href='https://tina.io/docs/r/beginner-series'
|
|
5362
5540
|
className='text-blue-500 underline'
|
|
5363
5541
|
>
|
|
5364
5542
|
{' '}
|
|
@@ -5561,11 +5739,10 @@ var baseFields = `[
|
|
|
5561
5739
|
},
|
|
5562
5740
|
]`;
|
|
5563
5741
|
var generateCollectionString = (args) => {
|
|
5564
|
-
var _a, _b, _c, _d;
|
|
5565
5742
|
if (args.collections) {
|
|
5566
5743
|
return args.collections;
|
|
5567
5744
|
}
|
|
5568
|
-
let extraTinaCollections =
|
|
5745
|
+
let extraTinaCollections = args.config.authProvider?.extraTinaCollections?.join(",\n");
|
|
5569
5746
|
if (extraTinaCollections) {
|
|
5570
5747
|
extraTinaCollections = extraTinaCollections + ",";
|
|
5571
5748
|
}
|
|
@@ -5591,18 +5768,17 @@ var generateCollectionString = (args) => {
|
|
|
5591
5768
|
},
|
|
5592
5769
|
},
|
|
5593
5770
|
]`;
|
|
5594
|
-
if (
|
|
5771
|
+
if (args.config?.framework?.name === "next") {
|
|
5595
5772
|
return nextExampleCollection;
|
|
5596
5773
|
}
|
|
5597
5774
|
return baseCollections;
|
|
5598
5775
|
};
|
|
5599
5776
|
var generateConfig = (args) => {
|
|
5600
|
-
|
|
5601
|
-
const isUsingTinaCloud = !args.selfHosted || ((_a = args.config.authProvider) == null ? void 0 : _a.name) === "tina-cloud";
|
|
5777
|
+
const isUsingTinaCloud = !args.selfHosted || args.config.authProvider?.name === "tina-cloud";
|
|
5602
5778
|
let extraImports = "";
|
|
5603
5779
|
if (args.selfHosted) {
|
|
5604
5780
|
if (args.config.authProvider) {
|
|
5605
|
-
extraImports = extraImports + makeImportString(
|
|
5781
|
+
extraImports = extraImports + makeImportString(args.config.authProvider?.configImports);
|
|
5606
5782
|
}
|
|
5607
5783
|
if (!isUsingTinaCloud) {
|
|
5608
5784
|
extraImports = extraImports + `
|
|
@@ -5625,7 +5801,7 @@ import { LocalAuthProvider } from "tinacms";`;
|
|
|
5625
5801
|
branch,
|
|
5626
5802
|
${args.selfHosted && !isUsingTinaCloud ? `authProvider: isLocal
|
|
5627
5803
|
? new LocalAuthProvider()
|
|
5628
|
-
:${
|
|
5804
|
+
:${args.config?.authProvider.configAuthProviderClass},` : ""}
|
|
5629
5805
|
${isUsingTinaCloud ? `// Get this from tina.io
|
|
5630
5806
|
clientId: process.env.NEXT_PUBLIC_TINA_CLIENT_ID,` : ""}
|
|
5631
5807
|
${isUsingTinaCloud ? `// Get this from tina.io
|
|
@@ -5642,7 +5818,7 @@ import { LocalAuthProvider } from "tinacms";`;
|
|
|
5642
5818
|
publicFolder: "${args.publicFolder}",
|
|
5643
5819
|
},
|
|
5644
5820
|
},
|
|
5645
|
-
// See docs on content modeling for more info on how to setup new content models: https://tina.io/docs/
|
|
5821
|
+
// See docs on content modeling for more info on how to setup new content models: https://tina.io/docs/r/content-modelling-collections/
|
|
5646
5822
|
schema: {
|
|
5647
5823
|
collections: ${generateCollectionString(args)},
|
|
5648
5824
|
},
|
|
@@ -5652,11 +5828,10 @@ import { LocalAuthProvider } from "tinacms";`;
|
|
|
5652
5828
|
|
|
5653
5829
|
// src/cmds/init/templates/database.ts
|
|
5654
5830
|
var databaseTemplate = ({ config: config2 }) => {
|
|
5655
|
-
var _a, _b, _c, _d;
|
|
5656
5831
|
return `
|
|
5657
5832
|
import { createDatabase, createLocalDatabase } from '@tinacms/datalayer'
|
|
5658
|
-
${makeImportString(
|
|
5659
|
-
${makeImportString(
|
|
5833
|
+
${makeImportString(config2.gitProvider?.imports)}
|
|
5834
|
+
${makeImportString(config2.databaseAdapter?.imports)}
|
|
5660
5835
|
|
|
5661
5836
|
const branch = (process.env.GITHUB_BRANCH ||
|
|
5662
5837
|
process.env.VERCEL_GIT_COMMIT_REF ||
|
|
@@ -5668,8 +5843,8 @@ const isLocal = process.env.${config2.isLocalEnvVarName} === 'true'
|
|
|
5668
5843
|
export default isLocal
|
|
5669
5844
|
? createLocalDatabase()
|
|
5670
5845
|
: createDatabase({
|
|
5671
|
-
gitProvider: ${
|
|
5672
|
-
databaseAdapter: ${
|
|
5846
|
+
gitProvider: ${config2.gitProvider?.gitProviderClassText},
|
|
5847
|
+
databaseAdapter: ${config2.databaseAdapter?.databaseAdapterClassText},
|
|
5673
5848
|
namespace: branch,
|
|
5674
5849
|
})
|
|
5675
5850
|
`;
|
|
@@ -5680,10 +5855,9 @@ var nextApiRouteTemplate = ({
|
|
|
5680
5855
|
config: config2,
|
|
5681
5856
|
env
|
|
5682
5857
|
}) => {
|
|
5683
|
-
var _a, _b;
|
|
5684
5858
|
const extraPath = env.usingSrc ? "../" : "";
|
|
5685
5859
|
return `import { TinaNodeBackend, LocalBackendAuthProvider } from '@tinacms/datalayer'
|
|
5686
|
-
${makeImportString(
|
|
5860
|
+
${makeImportString(config2.authProvider?.backendAuthProviderImports)}
|
|
5687
5861
|
|
|
5688
5862
|
|
|
5689
5863
|
|
|
@@ -5694,7 +5868,7 @@ var nextApiRouteTemplate = ({
|
|
|
5694
5868
|
const handler = TinaNodeBackend({
|
|
5695
5869
|
authProvider: isLocal
|
|
5696
5870
|
? LocalBackendAuthProvider()
|
|
5697
|
-
: ${
|
|
5871
|
+
: ${config2.authProvider?.backendAuthProvider || ""},
|
|
5698
5872
|
databaseClient,
|
|
5699
5873
|
})
|
|
5700
5874
|
|
|
@@ -5717,62 +5891,61 @@ Suspendisse facilisis, mi ac scelerisque interdum, ligula ex imperdiet felis, a
|
|
|
5717
5891
|
`;
|
|
5718
5892
|
|
|
5719
5893
|
// src/cmds/init/apply.ts
|
|
5720
|
-
|
|
5894
|
+
import { format as format2 } from "prettier";
|
|
5721
5895
|
|
|
5722
5896
|
// src/utils/script-helpers.ts
|
|
5723
5897
|
function generateGqlScript(scriptValue, opts) {
|
|
5724
5898
|
const cmd = `tinacms dev -c "${scriptValue}"`;
|
|
5725
|
-
if (opts
|
|
5899
|
+
if (opts?.isLocalEnvVarName) {
|
|
5726
5900
|
return `${opts.isLocalEnvVarName}=true ${cmd}`;
|
|
5727
5901
|
}
|
|
5728
5902
|
return cmd;
|
|
5729
5903
|
}
|
|
5730
5904
|
function extendNextScripts(scripts, opts) {
|
|
5731
|
-
var _a, _b;
|
|
5732
5905
|
const result = {
|
|
5733
5906
|
...scripts,
|
|
5734
|
-
dev: !
|
|
5735
|
-
build: !
|
|
5907
|
+
dev: !scripts?.dev || scripts?.dev?.indexOf("tinacms dev -c") === -1 ? generateGqlScript(scripts?.dev || "next dev", opts) : scripts?.dev,
|
|
5908
|
+
build: !scripts?.build || !scripts?.build?.startsWith("tinacms build &&") ? `tinacms build && ${scripts?.build || "next build"}` : scripts?.build
|
|
5736
5909
|
};
|
|
5737
|
-
if (
|
|
5910
|
+
if (opts?.addSetupUsers && !scripts["setup:users"]) {
|
|
5738
5911
|
result["setup:users"] = "tinacms-next-auth setup";
|
|
5739
5912
|
}
|
|
5740
5913
|
return result;
|
|
5741
5914
|
}
|
|
5742
5915
|
|
|
5743
5916
|
// src/cmds/init/codegen/index.ts
|
|
5744
|
-
|
|
5745
|
-
|
|
5917
|
+
import ts2 from "typescript";
|
|
5918
|
+
import fs13 from "fs-extra";
|
|
5746
5919
|
|
|
5747
5920
|
// src/cmds/init/codegen/util.ts
|
|
5748
|
-
|
|
5749
|
-
var makeTransformer = (makeVisitor) => (ctx) => (node) =>
|
|
5921
|
+
import ts from "typescript";
|
|
5922
|
+
var makeTransformer = (makeVisitor) => (ctx) => (node) => ts.visitNode(node, makeVisitor(ctx));
|
|
5750
5923
|
function parseExpression(expression) {
|
|
5751
|
-
const sourceFile =
|
|
5924
|
+
const sourceFile = ts.createSourceFile(
|
|
5752
5925
|
"temp.ts",
|
|
5753
5926
|
expression,
|
|
5754
|
-
|
|
5927
|
+
ts.ScriptTarget.Latest
|
|
5755
5928
|
);
|
|
5756
5929
|
if (sourceFile.statements.length !== 1) {
|
|
5757
5930
|
throw new Error("Expected one statement");
|
|
5758
5931
|
}
|
|
5759
5932
|
const statement = sourceFile.statements[0];
|
|
5760
|
-
if (!
|
|
5933
|
+
if (!ts.isExpressionStatement(statement)) {
|
|
5761
5934
|
throw new Error("Expected an expression statement");
|
|
5762
5935
|
}
|
|
5763
5936
|
return [sourceFile, statement.expression];
|
|
5764
5937
|
}
|
|
5765
5938
|
function parseVariableStatement(stmt) {
|
|
5766
|
-
const sourceFile =
|
|
5939
|
+
const sourceFile = ts.createSourceFile(
|
|
5767
5940
|
"temp.ts",
|
|
5768
5941
|
stmt,
|
|
5769
|
-
|
|
5942
|
+
ts.ScriptTarget.Latest
|
|
5770
5943
|
);
|
|
5771
5944
|
if (sourceFile.statements.length !== 1) {
|
|
5772
5945
|
throw new Error("Expected one statement");
|
|
5773
5946
|
}
|
|
5774
5947
|
const statement = sourceFile.statements[0];
|
|
5775
|
-
if (!
|
|
5948
|
+
if (!ts.isVariableStatement(statement)) {
|
|
5776
5949
|
throw new Error("Expected a variable statement");
|
|
5777
5950
|
}
|
|
5778
5951
|
return [sourceFile, statement];
|
|
@@ -5780,7 +5953,7 @@ function parseVariableStatement(stmt) {
|
|
|
5780
5953
|
|
|
5781
5954
|
// src/cmds/init/codegen/index.ts
|
|
5782
5955
|
var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variableStmt) => (ctx) => (node) => {
|
|
5783
|
-
if (
|
|
5956
|
+
if (ts2.isSourceFile(node)) {
|
|
5784
5957
|
const newStatements = [...node.statements];
|
|
5785
5958
|
let encounteredImports = false;
|
|
5786
5959
|
let firstNonImportStatementIdx = -1;
|
|
@@ -5788,7 +5961,7 @@ var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variable
|
|
|
5788
5961
|
const [newVarDec] = variableStmt.declarationList.declarations;
|
|
5789
5962
|
const newVarDecName = newVarDec.name.getText(variableStmtSourceFile);
|
|
5790
5963
|
for (let i = 0; i < newStatements.length; i++) {
|
|
5791
|
-
const isImport =
|
|
5964
|
+
const isImport = ts2.isImportDeclaration(newStatements[i]);
|
|
5792
5965
|
if (isImport && !encounteredImports) {
|
|
5793
5966
|
encounteredImports = true;
|
|
5794
5967
|
}
|
|
@@ -5796,9 +5969,9 @@ var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variable
|
|
|
5796
5969
|
firstNonImportStatementIdx = i;
|
|
5797
5970
|
}
|
|
5798
5971
|
const stmt = newStatements[i];
|
|
5799
|
-
if (
|
|
5972
|
+
if (ts2.isVariableStatement(stmt)) {
|
|
5800
5973
|
const [dec] = stmt.declarationList.declarations;
|
|
5801
|
-
if (dec.name &&
|
|
5974
|
+
if (dec.name && ts2.isIdentifier(dec.name) && dec.name.getText(sourceFile) === newVarDecName) {
|
|
5802
5975
|
existingStatementIdx = i;
|
|
5803
5976
|
}
|
|
5804
5977
|
}
|
|
@@ -5812,20 +5985,19 @@ var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variable
|
|
|
5812
5985
|
if (existingStatementIdx === -1) {
|
|
5813
5986
|
newStatements.splice(firstNonImportStatementIdx, 0, variableStmt);
|
|
5814
5987
|
}
|
|
5815
|
-
return
|
|
5988
|
+
return ts2.factory.updateSourceFile(node, newStatements);
|
|
5816
5989
|
}
|
|
5817
5990
|
};
|
|
5818
5991
|
var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
5819
|
-
|
|
5820
|
-
if (import_typescript3.default.isSourceFile(node)) {
|
|
5992
|
+
if (ts2.isSourceFile(node)) {
|
|
5821
5993
|
const newStatements = [...node.statements];
|
|
5822
5994
|
let changed = false;
|
|
5823
5995
|
for (const [moduleName, imports] of Object.entries(importMap)) {
|
|
5824
5996
|
let foundImportStatement = false;
|
|
5825
5997
|
for (const statement of newStatements) {
|
|
5826
|
-
if (
|
|
5998
|
+
if (ts2.isImportDeclaration(statement) && ts2.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text === moduleName) {
|
|
5827
5999
|
foundImportStatement = true;
|
|
5828
|
-
const existingImports =
|
|
6000
|
+
const existingImports = statement.importClause?.namedBindings && ts2.isNamedImports(statement.importClause.namedBindings) ? statement.importClause.namedBindings.elements.map(
|
|
5829
6001
|
(e) => e.name.text
|
|
5830
6002
|
) : [];
|
|
5831
6003
|
const newImports = [
|
|
@@ -5836,22 +6008,22 @@ var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
|
5836
6008
|
])
|
|
5837
6009
|
];
|
|
5838
6010
|
const importSpecifiers = newImports.map(
|
|
5839
|
-
(i) =>
|
|
6011
|
+
(i) => ts2.factory.createImportSpecifier(
|
|
5840
6012
|
void 0,
|
|
5841
|
-
|
|
5842
|
-
|
|
6013
|
+
ts2.factory.createIdentifier(i),
|
|
6014
|
+
ts2.factory.createIdentifier(i)
|
|
5843
6015
|
)
|
|
5844
6016
|
);
|
|
5845
|
-
const namedImports =
|
|
5846
|
-
const importClause =
|
|
6017
|
+
const namedImports = ts2.factory.createNamedImports(importSpecifiers);
|
|
6018
|
+
const importClause = ts2.factory.createImportClause(
|
|
5847
6019
|
false,
|
|
5848
6020
|
void 0,
|
|
5849
6021
|
namedImports
|
|
5850
6022
|
);
|
|
5851
|
-
const importDec =
|
|
6023
|
+
const importDec = ts2.factory.createImportDeclaration(
|
|
5852
6024
|
void 0,
|
|
5853
6025
|
importClause,
|
|
5854
|
-
|
|
6026
|
+
ts2.factory.createStringLiteral(moduleName)
|
|
5855
6027
|
);
|
|
5856
6028
|
newStatements[newStatements.indexOf(statement)] = importDec;
|
|
5857
6029
|
changed = true;
|
|
@@ -5859,45 +6031,45 @@ var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
|
5859
6031
|
}
|
|
5860
6032
|
if (!foundImportStatement) {
|
|
5861
6033
|
const importSpecifiers = imports.map(
|
|
5862
|
-
(i) =>
|
|
6034
|
+
(i) => ts2.factory.createImportSpecifier(
|
|
5863
6035
|
void 0,
|
|
5864
|
-
|
|
5865
|
-
|
|
6036
|
+
ts2.factory.createIdentifier(i),
|
|
6037
|
+
ts2.factory.createIdentifier(i)
|
|
5866
6038
|
)
|
|
5867
6039
|
);
|
|
5868
|
-
const namedImports =
|
|
5869
|
-
const importClause =
|
|
6040
|
+
const namedImports = ts2.factory.createNamedImports(importSpecifiers);
|
|
6041
|
+
const importClause = ts2.factory.createImportClause(
|
|
5870
6042
|
false,
|
|
5871
6043
|
void 0,
|
|
5872
6044
|
namedImports
|
|
5873
6045
|
);
|
|
5874
|
-
const importDec =
|
|
6046
|
+
const importDec = ts2.factory.createImportDeclaration(
|
|
5875
6047
|
void 0,
|
|
5876
6048
|
importClause,
|
|
5877
|
-
|
|
6049
|
+
ts2.factory.createStringLiteral(moduleName)
|
|
5878
6050
|
);
|
|
5879
6051
|
newStatements.unshift(importDec);
|
|
5880
6052
|
changed = true;
|
|
5881
6053
|
}
|
|
5882
6054
|
}
|
|
5883
6055
|
if (changed) {
|
|
5884
|
-
return
|
|
6056
|
+
return ts2.factory.updateSourceFile(node, newStatements);
|
|
5885
6057
|
}
|
|
5886
6058
|
}
|
|
5887
6059
|
};
|
|
5888
6060
|
var makeAddExpressionToSchemaCollectionVisitor = (sourceFile, functionName, newExpressionSourceFile, newExpression) => (ctx) => {
|
|
5889
6061
|
const visit2 = (node) => {
|
|
5890
|
-
if (
|
|
6062
|
+
if (ts2.isCallExpression(node) && ts2.isIdentifier(node.expression) && node.expression.text === functionName && node.arguments.length > 0 && ts2.isObjectLiteralExpression(node.arguments[0])) {
|
|
5891
6063
|
const configObject = node.arguments[0];
|
|
5892
6064
|
const updateProperties = configObject.properties.map((property) => {
|
|
5893
|
-
if (
|
|
6065
|
+
if (ts2.isPropertyAssignment(property)) {
|
|
5894
6066
|
const thisPropertyName = property.name.getText(sourceFile);
|
|
5895
|
-
if (thisPropertyName === "schema" &&
|
|
6067
|
+
if (thisPropertyName === "schema" && ts2.isPropertyAssignment(property) && ts2.isObjectLiteralExpression(property.initializer)) {
|
|
5896
6068
|
const schemaObject = property.initializer;
|
|
5897
6069
|
const collectionsProperty = schemaObject.properties.find(
|
|
5898
|
-
(p) =>
|
|
6070
|
+
(p) => ts2.isPropertyAssignment(p) && p.name.getText(sourceFile) === "collections"
|
|
5899
6071
|
);
|
|
5900
|
-
if (collectionsProperty &&
|
|
6072
|
+
if (collectionsProperty && ts2.isPropertyAssignment(collectionsProperty) && ts2.isArrayLiteralExpression(collectionsProperty.initializer)) {
|
|
5901
6073
|
const collectionsArray = collectionsProperty.initializer;
|
|
5902
6074
|
const collectionItems = collectionsArray.elements.map(
|
|
5903
6075
|
(e) => e.getText(sourceFile)
|
|
@@ -5907,16 +6079,16 @@ var makeAddExpressionToSchemaCollectionVisitor = (sourceFile, functionName, newE
|
|
|
5907
6079
|
)) {
|
|
5908
6080
|
return property;
|
|
5909
6081
|
}
|
|
5910
|
-
return
|
|
6082
|
+
return ts2.factory.updatePropertyAssignment(
|
|
5911
6083
|
property,
|
|
5912
6084
|
property.name,
|
|
5913
|
-
|
|
6085
|
+
ts2.factory.createObjectLiteralExpression(
|
|
5914
6086
|
schemaObject.properties.map((subProp) => {
|
|
5915
|
-
if (
|
|
5916
|
-
return
|
|
6087
|
+
if (ts2.isPropertyAssignment(subProp) && subProp.name.getText(sourceFile) === "collections" && ts2.isArrayLiteralExpression(subProp.initializer)) {
|
|
6088
|
+
return ts2.factory.updatePropertyAssignment(
|
|
5917
6089
|
subProp,
|
|
5918
6090
|
subProp.name,
|
|
5919
|
-
|
|
6091
|
+
ts2.factory.createArrayLiteralExpression(
|
|
5920
6092
|
[newExpression, ...subProp.initializer.elements],
|
|
5921
6093
|
true
|
|
5922
6094
|
)
|
|
@@ -5932,56 +6104,56 @@ var makeAddExpressionToSchemaCollectionVisitor = (sourceFile, functionName, newE
|
|
|
5932
6104
|
}
|
|
5933
6105
|
return property;
|
|
5934
6106
|
});
|
|
5935
|
-
return
|
|
6107
|
+
return ts2.factory.createCallExpression(
|
|
5936
6108
|
node.expression,
|
|
5937
6109
|
node.typeArguments,
|
|
5938
|
-
[
|
|
6110
|
+
[ts2.factory.createObjectLiteralExpression(updateProperties, true)]
|
|
5939
6111
|
);
|
|
5940
6112
|
}
|
|
5941
|
-
return
|
|
6113
|
+
return ts2.visitEachChild(node, visit2, ctx);
|
|
5942
6114
|
};
|
|
5943
6115
|
return (sourceFile2) => {
|
|
5944
|
-
return
|
|
6116
|
+
return ts2.visitEachChild(sourceFile2, visit2, ctx);
|
|
5945
6117
|
};
|
|
5946
6118
|
};
|
|
5947
6119
|
var makeUpdateObjectLiteralPropertyVisitor = (sourceFile, functionName, propertyName, propertyValueExpressionSourceFile, propertyValue) => (ctx) => {
|
|
5948
6120
|
const visitor = (node) => {
|
|
5949
|
-
if (
|
|
6121
|
+
if (ts2.isCallExpression(node) && ts2.isIdentifier(node.expression) && node.expression.text === functionName && node.arguments.length > 0 && ts2.isObjectLiteralExpression(node.arguments[0])) {
|
|
5950
6122
|
let foundProperty = false;
|
|
5951
6123
|
const configObject = node.arguments[0];
|
|
5952
6124
|
const updateProperties = configObject.properties.map((property) => {
|
|
5953
|
-
if (
|
|
6125
|
+
if (ts2.isPropertyAssignment(property) || ts2.isShorthandPropertyAssignment(property)) {
|
|
5954
6126
|
const name2 = property.name.getText(sourceFile);
|
|
5955
6127
|
if (name2 === propertyName) {
|
|
5956
6128
|
foundProperty = true;
|
|
5957
|
-
return
|
|
6129
|
+
return ts2.factory.createPropertyAssignment(name2, propertyValue);
|
|
5958
6130
|
}
|
|
5959
6131
|
}
|
|
5960
6132
|
return property;
|
|
5961
6133
|
});
|
|
5962
6134
|
if (!foundProperty) {
|
|
5963
6135
|
updateProperties.unshift(
|
|
5964
|
-
|
|
6136
|
+
ts2.factory.createPropertyAssignment(propertyName, propertyValue)
|
|
5965
6137
|
);
|
|
5966
6138
|
}
|
|
5967
|
-
return
|
|
6139
|
+
return ts2.factory.createCallExpression(
|
|
5968
6140
|
node.expression,
|
|
5969
6141
|
node.typeArguments,
|
|
5970
|
-
[
|
|
6142
|
+
[ts2.factory.createObjectLiteralExpression(updateProperties, true)]
|
|
5971
6143
|
);
|
|
5972
6144
|
}
|
|
5973
|
-
return
|
|
6145
|
+
return ts2.visitEachChild(node, visitor, ctx);
|
|
5974
6146
|
};
|
|
5975
6147
|
return (sourceFile2) => {
|
|
5976
|
-
return
|
|
6148
|
+
return ts2.visitNode(sourceFile2, visitor);
|
|
5977
6149
|
};
|
|
5978
6150
|
};
|
|
5979
6151
|
var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
5980
6152
|
const pathToConfig = configFile.resolve(config2.typescript).path;
|
|
5981
|
-
const sourceFile =
|
|
6153
|
+
const sourceFile = ts2.createSourceFile(
|
|
5982
6154
|
pathToConfig,
|
|
5983
|
-
|
|
5984
|
-
config2.typescript ?
|
|
6155
|
+
fs13.readFileSync(pathToConfig, "utf8"),
|
|
6156
|
+
config2.typescript ? ts2.ScriptTarget.Latest : ts2.ScriptTarget.ESNext
|
|
5985
6157
|
);
|
|
5986
6158
|
const { configImports, configAuthProviderClass, extraTinaCollections } = config2.authProvider;
|
|
5987
6159
|
const importMap = {
|
|
@@ -5994,7 +6166,7 @@ var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
|
5994
6166
|
{}
|
|
5995
6167
|
)
|
|
5996
6168
|
};
|
|
5997
|
-
const transformedSourceFileResult =
|
|
6169
|
+
const transformedSourceFileResult = ts2.transform(
|
|
5998
6170
|
sourceFile,
|
|
5999
6171
|
[
|
|
6000
6172
|
makeImportsVisitor(sourceFile, {
|
|
@@ -6030,19 +6202,19 @@ var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
|
6030
6202
|
)
|
|
6031
6203
|
].map((visitor) => makeTransformer(visitor))
|
|
6032
6204
|
);
|
|
6033
|
-
return
|
|
6205
|
+
return fs13.writeFile(
|
|
6034
6206
|
pathToConfig,
|
|
6035
|
-
|
|
6207
|
+
ts2.createPrinter({ omitTrailingSemicolon: true }).printFile(transformedSourceFileResult.transformed[0])
|
|
6036
6208
|
);
|
|
6037
6209
|
};
|
|
6038
6210
|
|
|
6039
6211
|
// src/cmds/init/apply.ts
|
|
6212
|
+
import { exec } from "child_process";
|
|
6040
6213
|
async function apply({
|
|
6041
6214
|
env,
|
|
6042
6215
|
params,
|
|
6043
6216
|
config: config2
|
|
6044
6217
|
}) {
|
|
6045
|
-
var _a;
|
|
6046
6218
|
if (config2.framework.name === "other" && config2.hosting === "self-host") {
|
|
6047
6219
|
logger.error(
|
|
6048
6220
|
logText(
|
|
@@ -6148,8 +6320,8 @@ async function apply({
|
|
|
6148
6320
|
await addConfigFile({
|
|
6149
6321
|
configArgs: {
|
|
6150
6322
|
config: config2,
|
|
6151
|
-
publicFolder:
|
|
6152
|
-
|
|
6323
|
+
publicFolder: path14.join(
|
|
6324
|
+
path14.relative(process.cwd(), pathToForestryConfig),
|
|
6153
6325
|
config2.publicFolder
|
|
6154
6326
|
),
|
|
6155
6327
|
collections,
|
|
@@ -6168,7 +6340,7 @@ async function apply({
|
|
|
6168
6340
|
env.tinaConfigExists && // Are we running tinacms init backend
|
|
6169
6341
|
params.isBackendInit && // Do the user choose the 'self-host' option
|
|
6170
6342
|
config2.hosting === "self-host" && // the user did not choose the 'tina-cloud' auth provider
|
|
6171
|
-
(
|
|
6343
|
+
(config2.authProvider?.name || "") !== "tina-cloud"
|
|
6172
6344
|
) {
|
|
6173
6345
|
await addSelfHostedTinaAuthToConfig(config2, env.generatedFiles["config"]);
|
|
6174
6346
|
}
|
|
@@ -6206,7 +6378,7 @@ var reportTelemetry = async ({
|
|
|
6206
6378
|
if (noTelemetry) {
|
|
6207
6379
|
logger.info(logText("Telemetry disabled"));
|
|
6208
6380
|
}
|
|
6209
|
-
const telemetry = new
|
|
6381
|
+
const telemetry = new Telemetry2({ disabled: noTelemetry });
|
|
6210
6382
|
const schemaFileType = usingTypescript ? "ts" : "js";
|
|
6211
6383
|
await telemetry.submitRecord({
|
|
6212
6384
|
event: {
|
|
@@ -6222,21 +6394,20 @@ var createPackageJSON = async () => {
|
|
|
6222
6394
|
};
|
|
6223
6395
|
var createGitignore = async ({ baseDir }) => {
|
|
6224
6396
|
logger.info(logText("No .gitignore found, creating one"));
|
|
6225
|
-
|
|
6397
|
+
fs14.outputFileSync(path14.join(baseDir, ".gitignore"), "node_modules");
|
|
6226
6398
|
};
|
|
6227
6399
|
var updateGitIgnore = async ({
|
|
6228
6400
|
baseDir,
|
|
6229
6401
|
items
|
|
6230
6402
|
}) => {
|
|
6231
6403
|
logger.info(logText(`Adding ${items.join(",")} to .gitignore`));
|
|
6232
|
-
const gitignoreContent =
|
|
6404
|
+
const gitignoreContent = fs14.readFileSync(path14.join(baseDir, ".gitignore")).toString();
|
|
6233
6405
|
const newGitignoreContent = [...gitignoreContent.split("\n"), ...items].join(
|
|
6234
6406
|
"\n"
|
|
6235
6407
|
);
|
|
6236
|
-
await
|
|
6408
|
+
await fs14.writeFile(path14.join(baseDir, ".gitignore"), newGitignoreContent);
|
|
6237
6409
|
};
|
|
6238
6410
|
var addDependencies = async (config2, env, params) => {
|
|
6239
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
6240
6411
|
const { packageManager } = config2;
|
|
6241
6412
|
const tagVersion = params.tinaVersion ? `@${params.tinaVersion}` : "";
|
|
6242
6413
|
let deps = [];
|
|
@@ -6252,18 +6423,18 @@ var addDependencies = async (config2, env, params) => {
|
|
|
6252
6423
|
deps.push("@tinacms/datalayer");
|
|
6253
6424
|
}
|
|
6254
6425
|
deps.push(
|
|
6255
|
-
...
|
|
6426
|
+
...config2.databaseAdapter?.imports?.map((x) => x.packageName) || []
|
|
6256
6427
|
);
|
|
6257
|
-
deps.push(...
|
|
6428
|
+
deps.push(...config2.authProvider?.peerDependencies || []);
|
|
6258
6429
|
deps.push(
|
|
6259
|
-
...
|
|
6430
|
+
...config2.authProvider?.backendAuthProviderImports?.map(
|
|
6260
6431
|
(x) => x.packageName
|
|
6261
|
-
)
|
|
6432
|
+
) || []
|
|
6262
6433
|
);
|
|
6263
6434
|
deps.push(
|
|
6264
|
-
...
|
|
6435
|
+
...config2.authProvider?.configImports?.map((x) => x.packageName) || []
|
|
6265
6436
|
);
|
|
6266
|
-
deps.push(...
|
|
6437
|
+
deps.push(...config2.gitProvider?.imports?.map((x) => x.packageName) || []);
|
|
6267
6438
|
if (tagVersion) {
|
|
6268
6439
|
deps = deps.map(
|
|
6269
6440
|
(dep) => dep.indexOf("tina") >= 0 ? `${dep}${tagVersion}` : dep
|
|
@@ -6275,7 +6446,8 @@ var addDependencies = async (config2, env, params) => {
|
|
|
6275
6446
|
let packageManagers = {
|
|
6276
6447
|
pnpm: process.env.USE_WORKSPACE ? `pnpm add ${deps.join(" ")} --workspace` : `pnpm add ${deps.join(" ")}`,
|
|
6277
6448
|
npm: `npm install ${deps.join(" ")}`,
|
|
6278
|
-
yarn: `yarn add ${deps.join(" ")}
|
|
6449
|
+
yarn: `yarn add ${deps.join(" ")}`,
|
|
6450
|
+
bun: `bun add ${deps.join(" ")}`
|
|
6279
6451
|
};
|
|
6280
6452
|
if (packageManagers[packageManager] && deps.length > 0) {
|
|
6281
6453
|
logger.info(logText("Adding dependencies, this might take a moment..."));
|
|
@@ -6286,7 +6458,8 @@ var addDependencies = async (config2, env, params) => {
|
|
|
6286
6458
|
packageManagers = {
|
|
6287
6459
|
pnpm: process.env.USE_WORKSPACE ? `pnpm add -D ${devDeps.join(" ")} --workspace` : `pnpm add -D ${devDeps.join(" ")}`,
|
|
6288
6460
|
npm: `npm install -D ${devDeps.join(" ")}`,
|
|
6289
|
-
yarn: `yarn add -D ${devDeps.join(" ")}
|
|
6461
|
+
yarn: `yarn add -D ${devDeps.join(" ")}`,
|
|
6462
|
+
bun: `bun add -D ${devDeps.join(" ")}`
|
|
6290
6463
|
};
|
|
6291
6464
|
if (packageManagers[packageManager]) {
|
|
6292
6465
|
logger.info(
|
|
@@ -6303,22 +6476,22 @@ var writeGeneratedFile = async ({
|
|
|
6303
6476
|
content,
|
|
6304
6477
|
typescript
|
|
6305
6478
|
}) => {
|
|
6306
|
-
const { exists, path:
|
|
6479
|
+
const { exists, path: path15, parentPath } = generatedFile.resolve(typescript);
|
|
6307
6480
|
if (exists) {
|
|
6308
6481
|
if (overwrite) {
|
|
6309
|
-
logger.info(`Overwriting file at ${
|
|
6310
|
-
|
|
6482
|
+
logger.info(`Overwriting file at ${path15}... \u2705`);
|
|
6483
|
+
fs14.outputFileSync(path15, content);
|
|
6311
6484
|
} else {
|
|
6312
|
-
logger.info(`Not overwriting file at ${
|
|
6485
|
+
logger.info(`Not overwriting file at ${path15}.`);
|
|
6313
6486
|
logger.info(
|
|
6314
|
-
logText(`Please add the following to ${
|
|
6487
|
+
logText(`Please add the following to ${path15}:
|
|
6315
6488
|
${indentText(content)}}`)
|
|
6316
6489
|
);
|
|
6317
6490
|
}
|
|
6318
6491
|
} else {
|
|
6319
|
-
logger.info(`Adding file at ${
|
|
6320
|
-
await
|
|
6321
|
-
|
|
6492
|
+
logger.info(`Adding file at ${path15}... \u2705`);
|
|
6493
|
+
await fs14.ensureDir(parentPath);
|
|
6494
|
+
fs14.outputFileSync(path15, content);
|
|
6322
6495
|
}
|
|
6323
6496
|
};
|
|
6324
6497
|
var addConfigFile = async ({
|
|
@@ -6327,12 +6500,11 @@ var addConfigFile = async ({
|
|
|
6327
6500
|
generatedFile,
|
|
6328
6501
|
config: config2
|
|
6329
6502
|
}) => {
|
|
6330
|
-
|
|
6331
|
-
const content = (0, import_prettier2.format)(generateConfig(configArgs), {
|
|
6503
|
+
const content = format2(generateConfig(configArgs), {
|
|
6332
6504
|
parser: "babel"
|
|
6333
6505
|
});
|
|
6334
6506
|
await writeGeneratedFile({
|
|
6335
|
-
overwrite:
|
|
6507
|
+
overwrite: config2.overwriteList?.includes("config"),
|
|
6336
6508
|
generatedFile,
|
|
6337
6509
|
content,
|
|
6338
6510
|
typescript: config2.typescript
|
|
@@ -6346,10 +6518,9 @@ var addDatabaseFile = async ({
|
|
|
6346
6518
|
config: config2,
|
|
6347
6519
|
generatedFile
|
|
6348
6520
|
}) => {
|
|
6349
|
-
var _a;
|
|
6350
6521
|
await writeGeneratedFile({
|
|
6351
6522
|
generatedFile,
|
|
6352
|
-
overwrite:
|
|
6523
|
+
overwrite: config2.overwriteList?.includes("database"),
|
|
6353
6524
|
content: databaseTemplate({ config: config2 }),
|
|
6354
6525
|
typescript: config2.typescript
|
|
6355
6526
|
});
|
|
@@ -6359,13 +6530,12 @@ var addNextApiRoute = async ({
|
|
|
6359
6530
|
generatedFile,
|
|
6360
6531
|
env
|
|
6361
6532
|
}) => {
|
|
6362
|
-
|
|
6363
|
-
const content = (0, import_prettier2.format)(nextApiRouteTemplate({ config: config2, env }), {
|
|
6533
|
+
const content = format2(nextApiRouteTemplate({ config: config2, env }), {
|
|
6364
6534
|
parser: "babel"
|
|
6365
6535
|
});
|
|
6366
6536
|
await writeGeneratedFile({
|
|
6367
6537
|
generatedFile,
|
|
6368
|
-
overwrite:
|
|
6538
|
+
overwrite: config2.overwriteList?.includes("next-api-handler"),
|
|
6369
6539
|
content,
|
|
6370
6540
|
typescript: config2.typescript
|
|
6371
6541
|
});
|
|
@@ -6375,10 +6545,9 @@ var addTemplateFile = async ({
|
|
|
6375
6545
|
generatedFile,
|
|
6376
6546
|
config: config2
|
|
6377
6547
|
}) => {
|
|
6378
|
-
var _a;
|
|
6379
6548
|
await writeGeneratedFile({
|
|
6380
6549
|
generatedFile,
|
|
6381
|
-
overwrite:
|
|
6550
|
+
overwrite: config2.overwriteList?.includes(generatedFile.generatedFileType),
|
|
6382
6551
|
content,
|
|
6383
6552
|
typescript: config2.typescript
|
|
6384
6553
|
});
|
|
@@ -6387,7 +6556,6 @@ var addContentFile = async ({
|
|
|
6387
6556
|
config: config2,
|
|
6388
6557
|
env
|
|
6389
6558
|
}) => {
|
|
6390
|
-
var _a;
|
|
6391
6559
|
await writeGeneratedFile({
|
|
6392
6560
|
generatedFile: {
|
|
6393
6561
|
javascriptExists: false,
|
|
@@ -6401,11 +6569,11 @@ var addContentFile = async ({
|
|
|
6401
6569
|
return () => ({
|
|
6402
6570
|
exists: env.sampleContentExists,
|
|
6403
6571
|
path: env.sampleContentPath,
|
|
6404
|
-
parentPath:
|
|
6572
|
+
parentPath: path14.dirname(env.sampleContentPath)
|
|
6405
6573
|
});
|
|
6406
6574
|
}
|
|
6407
6575
|
},
|
|
6408
|
-
overwrite:
|
|
6576
|
+
overwrite: config2.overwriteList?.includes("sample-content"),
|
|
6409
6577
|
content: helloWorldPost,
|
|
6410
6578
|
typescript: false
|
|
6411
6579
|
});
|
|
@@ -6424,10 +6592,10 @@ ${titleText(" TinaCMS ")} backend initialized!`));
|
|
|
6424
6592
|
return `${x.key}=${x.value || "***"}`;
|
|
6425
6593
|
}).join("\n") + `
|
|
6426
6594
|
TINA_PUBLIC_IS_LOCAL=true`;
|
|
6427
|
-
const envFile =
|
|
6428
|
-
if (!
|
|
6595
|
+
const envFile = path14.join(process.cwd(), ".env");
|
|
6596
|
+
if (!fs14.existsSync(envFile)) {
|
|
6429
6597
|
logger.info(`Adding .env file to your project... \u2705`);
|
|
6430
|
-
|
|
6598
|
+
fs14.writeFileSync(envFile, envFileText);
|
|
6431
6599
|
} else {
|
|
6432
6600
|
logger.info(
|
|
6433
6601
|
"Please add the following environment variables to your .env file"
|
|
@@ -6449,9 +6617,7 @@ ${titleText(" TinaCMS ")} has been initialized!`));
|
|
|
6449
6617
|
);
|
|
6450
6618
|
if (framework.name === "hugo") {
|
|
6451
6619
|
logger.info(
|
|
6452
|
-
focusText("Hugo is required. ")
|
|
6453
|
-
"Don't have Hugo installed? Follow this guide to set it up: ",
|
|
6454
|
-
linkText("https://gohugo.io/installation/")
|
|
6620
|
+
focusText("Hugo is required. ") + "Don't have Hugo installed? Follow this guide to set it up: " + linkText("https://gohugo.io/installation/")
|
|
6455
6621
|
);
|
|
6456
6622
|
}
|
|
6457
6623
|
logger.info(
|
|
@@ -6470,7 +6636,8 @@ var other = ({ packageManager }) => {
|
|
|
6470
6636
|
pnpm: `pnpm`,
|
|
6471
6637
|
npm: `npx`,
|
|
6472
6638
|
// npx is the way to run executables that aren't in your "scripts"
|
|
6473
|
-
yarn: `yarn
|
|
6639
|
+
yarn: `yarn`,
|
|
6640
|
+
bun: `bun run`
|
|
6474
6641
|
};
|
|
6475
6642
|
return `${packageManagers[packageManager]} tinacms dev -c "<your dev command>"`;
|
|
6476
6643
|
};
|
|
@@ -6483,7 +6650,8 @@ var frameworkDevCmds = {
|
|
|
6483
6650
|
pnpm: `pnpm`,
|
|
6484
6651
|
npm: `npm run`,
|
|
6485
6652
|
// npx is the way to run executables that aren't in your "scripts"
|
|
6486
|
-
yarn: `yarn
|
|
6653
|
+
yarn: `yarn`,
|
|
6654
|
+
bun: `bun run`
|
|
6487
6655
|
};
|
|
6488
6656
|
return `${packageManagers[packageManager]} dev`;
|
|
6489
6657
|
}
|
|
@@ -6496,12 +6664,11 @@ var addReactiveFile = {
|
|
|
6496
6664
|
baseDir,
|
|
6497
6665
|
dataLayer
|
|
6498
6666
|
}) => {
|
|
6499
|
-
|
|
6500
|
-
const packageJsonPath = import_path11.default.join(baseDir, "package.json");
|
|
6667
|
+
const packageJsonPath = path14.join(baseDir, "package.json");
|
|
6501
6668
|
await writeGeneratedFile({
|
|
6502
6669
|
generatedFile,
|
|
6503
6670
|
typescript: config2.typescript,
|
|
6504
|
-
overwrite:
|
|
6671
|
+
overwrite: config2.overwriteList?.includes(
|
|
6505
6672
|
generatedFile.generatedFileType
|
|
6506
6673
|
),
|
|
6507
6674
|
content: templates["demo-post-page"]({
|
|
@@ -6510,24 +6677,23 @@ var addReactiveFile = {
|
|
|
6510
6677
|
})
|
|
6511
6678
|
});
|
|
6512
6679
|
logger.info("Adding a nextjs example... \u2705");
|
|
6513
|
-
const packageJson = JSON.parse(
|
|
6680
|
+
const packageJson = JSON.parse(fs14.readFileSync(packageJsonPath).toString());
|
|
6514
6681
|
const scripts = packageJson.scripts || {};
|
|
6515
6682
|
const updatedPackageJson = JSON.stringify(
|
|
6516
6683
|
{
|
|
6517
6684
|
...packageJson,
|
|
6518
6685
|
scripts: extendNextScripts(scripts, {
|
|
6519
6686
|
isLocalEnvVarName: config2.isLocalEnvVarName,
|
|
6520
|
-
addSetupUsers:
|
|
6687
|
+
addSetupUsers: config2.authProvider?.name === "next-auth"
|
|
6521
6688
|
})
|
|
6522
6689
|
},
|
|
6523
6690
|
null,
|
|
6524
6691
|
2
|
|
6525
6692
|
);
|
|
6526
|
-
|
|
6693
|
+
fs14.writeFileSync(packageJsonPath, updatedPackageJson);
|
|
6527
6694
|
}
|
|
6528
6695
|
};
|
|
6529
6696
|
function execShellCommand(cmd) {
|
|
6530
|
-
const exec = require("child_process").exec;
|
|
6531
6697
|
return new Promise((resolve2, reject) => {
|
|
6532
6698
|
exec(cmd, (error, stdout, stderr) => {
|
|
6533
6699
|
if (error) {
|
|
@@ -6573,25 +6739,27 @@ var command = new CLICommand({
|
|
|
6573
6739
|
});
|
|
6574
6740
|
|
|
6575
6741
|
// src/next/commands/init-command/index.ts
|
|
6576
|
-
var InitCommand = class extends
|
|
6577
|
-
|
|
6578
|
-
|
|
6579
|
-
|
|
6580
|
-
|
|
6581
|
-
|
|
6582
|
-
|
|
6583
|
-
|
|
6584
|
-
|
|
6585
|
-
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6742
|
+
var InitCommand = class extends Command6 {
|
|
6743
|
+
static paths = [["init"], ["init", "backend"]];
|
|
6744
|
+
pathToForestryConfig = Option6.String("--forestryPath", {
|
|
6745
|
+
description: "Specify the relative path to the .forestry directory, if importing an existing forestry site."
|
|
6746
|
+
});
|
|
6747
|
+
rootPath = Option6.String("--rootPath", {
|
|
6748
|
+
description: "Specify the root directory to run the CLI from (defaults to current working directory)"
|
|
6749
|
+
});
|
|
6750
|
+
debug = Option6.Boolean("--debug", false, {
|
|
6751
|
+
description: "Enable debug logging"
|
|
6752
|
+
});
|
|
6753
|
+
noTelemetry = Option6.Boolean("--noTelemetry", false, {
|
|
6754
|
+
description: "Disable anonymous telemetry that is collected"
|
|
6755
|
+
});
|
|
6756
|
+
tinaVersion = Option6.String("--tinaVersion", {
|
|
6757
|
+
description: "Specify a version for tina dependencies"
|
|
6758
|
+
});
|
|
6759
|
+
static usage = Command6.Usage({
|
|
6760
|
+
category: `Commands`,
|
|
6761
|
+
description: `Add Tina to an existing project`
|
|
6762
|
+
});
|
|
6595
6763
|
async catch(error) {
|
|
6596
6764
|
logger.error("Error occured during tinacms init");
|
|
6597
6765
|
console.error(error);
|
|
@@ -6611,33 +6779,32 @@ var InitCommand = class extends import_clipanion6.Command {
|
|
|
6611
6779
|
process.exit();
|
|
6612
6780
|
}
|
|
6613
6781
|
};
|
|
6614
|
-
InitCommand.paths = [["init"], ["init", "backend"]];
|
|
6615
|
-
InitCommand.usage = import_clipanion6.Command.Usage({
|
|
6616
|
-
category: `Commands`,
|
|
6617
|
-
description: `Add Tina to an existing project`
|
|
6618
|
-
});
|
|
6619
6782
|
|
|
6620
6783
|
// src/next/commands/searchindex-command/index.ts
|
|
6621
|
-
|
|
6622
|
-
|
|
6623
|
-
|
|
6624
|
-
|
|
6625
|
-
|
|
6626
|
-
|
|
6627
|
-
|
|
6628
|
-
|
|
6629
|
-
|
|
6630
|
-
|
|
6631
|
-
|
|
6632
|
-
|
|
6633
|
-
|
|
6784
|
+
import { Command as Command7, Option as Option7 } from "clipanion";
|
|
6785
|
+
import { createSchema, FilesystemBridge as FilesystemBridge4 } from "@tinacms/graphql";
|
|
6786
|
+
import {
|
|
6787
|
+
SearchIndexer as SearchIndexer3,
|
|
6788
|
+
TinaCMSSearchIndexClient as TinaCMSSearchIndexClient2
|
|
6789
|
+
} from "@tinacms/search";
|
|
6790
|
+
var SearchIndexCommand = class extends Command7 {
|
|
6791
|
+
static paths = [["search-index"]];
|
|
6792
|
+
rootPath = Option7.String("--rootPath", {
|
|
6793
|
+
description: "Specify the root directory to run the CLI from (defaults to current working directory)"
|
|
6794
|
+
});
|
|
6795
|
+
verbose = Option7.Boolean("-v,--verbose", false, {
|
|
6796
|
+
description: "increase verbosity of logged output"
|
|
6797
|
+
});
|
|
6798
|
+
static usage = Command7.Usage({
|
|
6799
|
+
category: `Commands`,
|
|
6800
|
+
description: `Index the site for search`
|
|
6801
|
+
});
|
|
6634
6802
|
async catch(error) {
|
|
6635
6803
|
logger.error("Error occured during tinacms search-index");
|
|
6636
6804
|
console.error(error);
|
|
6637
6805
|
process.exit(1);
|
|
6638
6806
|
}
|
|
6639
6807
|
async execute() {
|
|
6640
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
|
|
6641
6808
|
const rootPath = this.rootPath || process.cwd();
|
|
6642
6809
|
const configManager = new ConfigManager({ rootPath });
|
|
6643
6810
|
try {
|
|
@@ -6648,18 +6815,18 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6648
6815
|
console.error(e);
|
|
6649
6816
|
}
|
|
6650
6817
|
}
|
|
6651
|
-
if (!
|
|
6818
|
+
if (!configManager.config?.search) {
|
|
6652
6819
|
logger.error("No search config found");
|
|
6653
6820
|
process.exit(1);
|
|
6654
6821
|
}
|
|
6655
6822
|
const { schema } = configManager.config;
|
|
6656
|
-
const tinaSchema = await
|
|
6823
|
+
const tinaSchema = await createSchema({
|
|
6657
6824
|
schema: { ...schema, config: configManager.config }
|
|
6658
6825
|
});
|
|
6659
6826
|
let client;
|
|
6660
|
-
const hasTinaSearch = Boolean(
|
|
6827
|
+
const hasTinaSearch = Boolean(configManager.config?.search?.tina);
|
|
6661
6828
|
if (hasTinaSearch) {
|
|
6662
|
-
if (!
|
|
6829
|
+
if (!configManager.config?.branch) {
|
|
6663
6830
|
logger.error(
|
|
6664
6831
|
`${dangerText(
|
|
6665
6832
|
`ERROR: Branch not configured in tina search configuration.`
|
|
@@ -6667,11 +6834,11 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6667
6834
|
);
|
|
6668
6835
|
throw new Error("Branch not configured in tina search configuration.");
|
|
6669
6836
|
}
|
|
6670
|
-
if (!
|
|
6837
|
+
if (!configManager.config?.clientId) {
|
|
6671
6838
|
logger.error(`${dangerText(`ERROR: clientId not configured.`)}`);
|
|
6672
6839
|
throw new Error("clientId not configured.");
|
|
6673
6840
|
}
|
|
6674
|
-
if (!
|
|
6841
|
+
if (!configManager.config?.search?.tina?.indexerToken) {
|
|
6675
6842
|
logger.error(
|
|
6676
6843
|
`${dangerText(
|
|
6677
6844
|
`ERROR: indexerToken not configured in tina search configuration.`
|
|
@@ -6681,23 +6848,23 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6681
6848
|
"indexerToken not configured in tina search configuration."
|
|
6682
6849
|
);
|
|
6683
6850
|
}
|
|
6684
|
-
client = new
|
|
6685
|
-
apiUrl: `${
|
|
6686
|
-
branch:
|
|
6687
|
-
indexerToken:
|
|
6688
|
-
stopwordLanguages:
|
|
6851
|
+
client = new TinaCMSSearchIndexClient2({
|
|
6852
|
+
apiUrl: `${configManager.config.tinaioConfig?.contentApiUrlOverride || "https://content.tinajs.io"}/searchIndex/${configManager.config?.clientId}`,
|
|
6853
|
+
branch: configManager.config?.branch,
|
|
6854
|
+
indexerToken: configManager.config?.search?.tina?.indexerToken,
|
|
6855
|
+
stopwordLanguages: configManager.config?.search?.tina?.stopwordLanguages
|
|
6689
6856
|
});
|
|
6690
6857
|
} else {
|
|
6691
|
-
client =
|
|
6858
|
+
client = configManager.config?.search?.searchClient;
|
|
6692
6859
|
}
|
|
6693
|
-
const searchIndexer = new
|
|
6694
|
-
batchSize:
|
|
6695
|
-
bridge: new
|
|
6860
|
+
const searchIndexer = new SearchIndexer3({
|
|
6861
|
+
batchSize: configManager.config.search?.indexBatchSize || 100,
|
|
6862
|
+
bridge: new FilesystemBridge4(
|
|
6696
6863
|
configManager.rootPath,
|
|
6697
6864
|
configManager.contentRootPath
|
|
6698
6865
|
),
|
|
6699
6866
|
schema: tinaSchema,
|
|
6700
|
-
textIndexLength:
|
|
6867
|
+
textIndexLength: configManager.config.search?.maxSearchIndexFieldLength || 100,
|
|
6701
6868
|
client
|
|
6702
6869
|
});
|
|
6703
6870
|
let err;
|
|
@@ -6718,14 +6885,9 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6718
6885
|
process.exit(0);
|
|
6719
6886
|
}
|
|
6720
6887
|
};
|
|
6721
|
-
SearchIndexCommand.paths = [["search-index"]];
|
|
6722
|
-
SearchIndexCommand.usage = import_clipanion7.Command.Usage({
|
|
6723
|
-
category: `Commands`,
|
|
6724
|
-
description: `Index the site for search`
|
|
6725
|
-
});
|
|
6726
6888
|
|
|
6727
6889
|
// src/index.ts
|
|
6728
|
-
var cli = new
|
|
6890
|
+
var cli = new Cli({
|
|
6729
6891
|
binaryName: `tinacms`,
|
|
6730
6892
|
binaryLabel: `TinaCMS`,
|
|
6731
6893
|
binaryVersion: version
|
|
@@ -6736,7 +6898,10 @@ cli.register(AuditCommand);
|
|
|
6736
6898
|
cli.register(InitCommand);
|
|
6737
6899
|
cli.register(CodemodCommand);
|
|
6738
6900
|
cli.register(SearchIndexCommand);
|
|
6739
|
-
cli.register(
|
|
6740
|
-
cli.register(
|
|
6741
|
-
cli.register(
|
|
6901
|
+
cli.register(Builtins.DefinitionsCommand);
|
|
6902
|
+
cli.register(Builtins.HelpCommand);
|
|
6903
|
+
cli.register(Builtins.VersionCommand);
|
|
6742
6904
|
var index_default = cli;
|
|
6905
|
+
export {
|
|
6906
|
+
index_default as default
|
|
6907
|
+
};
|