@tinacms/cli 0.0.0-e024aec-20250526035050 → 0.0.0-e0bbd2e-20251203224419
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/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 +912 -849
- package/dist/next/codegen/index.d.ts +3 -9
- package/dist/server/server.d.ts +1 -1
- package/dist/utils/path.d.ts +3 -0
- package/package.json +10 -9
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.0";
|
|
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,9 +28,9 @@ function isUnicodeSupported() {
|
|
|
61
28
|
}
|
|
62
29
|
|
|
63
30
|
// src/logger/index.ts
|
|
64
|
-
|
|
65
|
-
var logger =
|
|
66
|
-
|
|
31
|
+
import log4js from "log4js";
|
|
32
|
+
var logger = log4js.getLogger();
|
|
33
|
+
log4js.configure({
|
|
67
34
|
appenders: {
|
|
68
35
|
out: { type: "stdout", layout: { type: "messagePassThrough" } }
|
|
69
36
|
},
|
|
@@ -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
|
);
|
|
@@ -601,7 +591,7 @@ var Codegen = class {
|
|
|
601
591
|
throw new Error(
|
|
602
592
|
`Client not configured properly. Missing ${missing.join(
|
|
603
593
|
", "
|
|
604
|
-
)}. Please visit https://tina.io/docs/
|
|
594
|
+
)}. Please visit https://tina.io/docs/r/what-is-tinacloud for more information`
|
|
605
595
|
);
|
|
606
596
|
}
|
|
607
597
|
let localUrl = `http://localhost:${this.port}/graphql`;
|
|
@@ -623,7 +613,7 @@ var Codegen = class {
|
|
|
623
613
|
const authCollection = this.tinaSchema.getCollections().find((c) => c.isAuthCollection);
|
|
624
614
|
let authFields = [];
|
|
625
615
|
if (authCollection) {
|
|
626
|
-
const usersFields =
|
|
616
|
+
const usersFields = mapUserFields(authCollection, []);
|
|
627
617
|
if (usersFields.length === 0) {
|
|
628
618
|
throw new Error("No user field found");
|
|
629
619
|
}
|
|
@@ -713,7 +703,7 @@ export default databaseClient;
|
|
|
713
703
|
const apiURL = this.getApiURL();
|
|
714
704
|
const clientString = `import { createClient } from "tinacms/dist/client";
|
|
715
705
|
import { queries } from "./types";
|
|
716
|
-
export const client = createClient({ ${this.noClientBuildCache === false ? `cacheDir: '${(
|
|
706
|
+
export const client = createClient({ ${this.noClientBuildCache === false ? `cacheDir: '${normalizePath(
|
|
717
707
|
this.configManager.generatedCachePath
|
|
718
708
|
)}', ` : ""}url: '${apiURL}', token: '${token}', queries, ${errorPolicy ? `errorPolicy: '${errorPolicy}'` : ""} });
|
|
719
709
|
export default client;
|
|
@@ -739,7 +729,7 @@ export default client;
|
|
|
739
729
|
${typescriptTypes}
|
|
740
730
|
`;
|
|
741
731
|
const schemaString = `# DO NOT MODIFY THIS FILE. This file is automatically generated by Tina
|
|
742
|
-
${(
|
|
732
|
+
${printSchema2(this.schema)}
|
|
743
733
|
schema {
|
|
744
734
|
query: Query
|
|
745
735
|
mutation: Mutation
|
|
@@ -751,7 +741,7 @@ schema {
|
|
|
751
741
|
var maybeWarnFragmentSize = async (filepath) => {
|
|
752
742
|
if (
|
|
753
743
|
// is the file bigger than 100kb?
|
|
754
|
-
(await
|
|
744
|
+
(await fs.stat(filepath)).size > // convert to 100 kb to bytes
|
|
755
745
|
100 * 1024
|
|
756
746
|
) {
|
|
757
747
|
console.warn(
|
|
@@ -768,19 +758,34 @@ var maybeWarnFragmentSize = async (filepath) => {
|
|
|
768
758
|
}
|
|
769
759
|
};
|
|
770
760
|
var unlinkIfExists = async (filepath) => {
|
|
771
|
-
if (
|
|
772
|
-
|
|
761
|
+
if (fs.existsSync(filepath)) {
|
|
762
|
+
fs.unlinkSync(filepath);
|
|
773
763
|
}
|
|
774
764
|
};
|
|
775
765
|
|
|
776
766
|
// src/next/config-manager.ts
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
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
|
|
784
789
|
var TINA_FOLDER = "tina";
|
|
785
790
|
var LEGACY_TINA_FOLDER = ".tina";
|
|
786
791
|
var GENERATED_FOLDER = "__generated__";
|
|
@@ -789,17 +794,57 @@ var GRAPHQL_GQL_FILE = "schema.gql";
|
|
|
789
794
|
var SCHEMA_JSON_FILE = "_schema.json";
|
|
790
795
|
var LOOKUP_JSON_FILE = "_lookup.json";
|
|
791
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;
|
|
792
837
|
constructor({
|
|
793
838
|
rootPath = process.cwd(),
|
|
794
839
|
tinaGraphQLVersion,
|
|
795
840
|
legacyNoSDK
|
|
796
841
|
}) {
|
|
797
|
-
this.rootPath = (
|
|
842
|
+
this.rootPath = normalizePath2(rootPath);
|
|
798
843
|
this.tinaGraphQLVersionFromCLI = tinaGraphQLVersion;
|
|
799
844
|
this.legacyNoSDK = legacyNoSDK;
|
|
800
845
|
}
|
|
801
846
|
isUsingTs() {
|
|
802
|
-
return [".ts", ".tsx"].includes(
|
|
847
|
+
return [".ts", ".tsx"].includes(path3.extname(this.tinaConfigFilePath));
|
|
803
848
|
}
|
|
804
849
|
hasSelfHostedConfig() {
|
|
805
850
|
return !!this.selfHostedDatabaseFilePath;
|
|
@@ -814,13 +859,14 @@ var ConfigManager = class {
|
|
|
814
859
|
return this.config.client?.skip || false;
|
|
815
860
|
}
|
|
816
861
|
async processConfig() {
|
|
862
|
+
const require2 = createRequire(import.meta.url);
|
|
817
863
|
this.tinaFolderPath = await this.getTinaFolderPath(this.rootPath);
|
|
818
|
-
this.envFilePath =
|
|
819
|
-
|
|
864
|
+
this.envFilePath = path3.resolve(
|
|
865
|
+
path3.join(this.tinaFolderPath, "..", ".env")
|
|
820
866
|
);
|
|
821
867
|
dotenv.config({ path: this.envFilePath });
|
|
822
868
|
this.tinaConfigFilePath = await this.getPathWithExtension(
|
|
823
|
-
|
|
869
|
+
path3.join(this.tinaFolderPath, "config")
|
|
824
870
|
);
|
|
825
871
|
if (!this.tinaConfigFilePath) {
|
|
826
872
|
throw new Error(
|
|
@@ -828,89 +874,89 @@ var ConfigManager = class {
|
|
|
828
874
|
);
|
|
829
875
|
}
|
|
830
876
|
this.selfHostedDatabaseFilePath = await this.getPathWithExtension(
|
|
831
|
-
|
|
877
|
+
path3.join(this.tinaFolderPath, "database")
|
|
832
878
|
);
|
|
833
|
-
this.generatedFolderPath =
|
|
834
|
-
this.generatedCachePath =
|
|
879
|
+
this.generatedFolderPath = path3.join(this.tinaFolderPath, GENERATED_FOLDER);
|
|
880
|
+
this.generatedCachePath = path3.join(
|
|
835
881
|
this.generatedFolderPath,
|
|
836
882
|
".cache",
|
|
837
883
|
String((/* @__PURE__ */ new Date()).getTime())
|
|
838
884
|
);
|
|
839
|
-
this.generatedGraphQLGQLPath =
|
|
885
|
+
this.generatedGraphQLGQLPath = path3.join(
|
|
840
886
|
this.generatedFolderPath,
|
|
841
887
|
GRAPHQL_GQL_FILE
|
|
842
888
|
);
|
|
843
|
-
this.generatedGraphQLJSONPath =
|
|
889
|
+
this.generatedGraphQLJSONPath = path3.join(
|
|
844
890
|
this.generatedFolderPath,
|
|
845
891
|
GRAPHQL_JSON_FILE
|
|
846
892
|
);
|
|
847
|
-
this.generatedSchemaJSONPath =
|
|
893
|
+
this.generatedSchemaJSONPath = path3.join(
|
|
848
894
|
this.generatedFolderPath,
|
|
849
895
|
SCHEMA_JSON_FILE
|
|
850
896
|
);
|
|
851
|
-
this.generatedLookupJSONPath =
|
|
897
|
+
this.generatedLookupJSONPath = path3.join(
|
|
852
898
|
this.generatedFolderPath,
|
|
853
899
|
LOOKUP_JSON_FILE
|
|
854
900
|
);
|
|
855
|
-
this.generatedQueriesFilePath =
|
|
901
|
+
this.generatedQueriesFilePath = path3.join(
|
|
856
902
|
this.generatedFolderPath,
|
|
857
903
|
"queries.gql"
|
|
858
904
|
);
|
|
859
|
-
this.generatedFragmentsFilePath =
|
|
905
|
+
this.generatedFragmentsFilePath = path3.join(
|
|
860
906
|
this.generatedFolderPath,
|
|
861
907
|
"frags.gql"
|
|
862
908
|
);
|
|
863
|
-
this.generatedTypesTSFilePath =
|
|
909
|
+
this.generatedTypesTSFilePath = path3.join(
|
|
864
910
|
this.generatedFolderPath,
|
|
865
911
|
"types.ts"
|
|
866
912
|
);
|
|
867
|
-
this.generatedTypesJSFilePath =
|
|
913
|
+
this.generatedTypesJSFilePath = path3.join(
|
|
868
914
|
this.generatedFolderPath,
|
|
869
915
|
"types.js"
|
|
870
916
|
);
|
|
871
|
-
this.generatedTypesDFilePath =
|
|
917
|
+
this.generatedTypesDFilePath = path3.join(
|
|
872
918
|
this.generatedFolderPath,
|
|
873
919
|
"types.d.ts"
|
|
874
920
|
);
|
|
875
|
-
this.userQueriesAndFragmentsGlob =
|
|
921
|
+
this.userQueriesAndFragmentsGlob = path3.join(
|
|
876
922
|
this.tinaFolderPath,
|
|
877
923
|
"queries/**/*.{graphql,gql}"
|
|
878
924
|
);
|
|
879
|
-
this.generatedQueriesAndFragmentsGlob =
|
|
925
|
+
this.generatedQueriesAndFragmentsGlob = path3.join(
|
|
880
926
|
this.generatedFolderPath,
|
|
881
927
|
"*.{graphql,gql}"
|
|
882
928
|
);
|
|
883
|
-
this.generatedClientTSFilePath =
|
|
929
|
+
this.generatedClientTSFilePath = path3.join(
|
|
884
930
|
this.generatedFolderPath,
|
|
885
931
|
"client.ts"
|
|
886
932
|
);
|
|
887
|
-
this.generatedClientJSFilePath =
|
|
933
|
+
this.generatedClientJSFilePath = path3.join(
|
|
888
934
|
this.generatedFolderPath,
|
|
889
935
|
"client.js"
|
|
890
936
|
);
|
|
891
|
-
this.generatedClientDFilePath =
|
|
937
|
+
this.generatedClientDFilePath = path3.join(
|
|
892
938
|
this.generatedFolderPath,
|
|
893
939
|
"client.d.ts"
|
|
894
940
|
);
|
|
895
|
-
this.generatedDatabaseClientDFilePath =
|
|
941
|
+
this.generatedDatabaseClientDFilePath = path3.join(
|
|
896
942
|
this.generatedFolderPath,
|
|
897
943
|
"databaseClient.d.ts"
|
|
898
944
|
);
|
|
899
|
-
this.generatedDatabaseClientTSFilePath =
|
|
945
|
+
this.generatedDatabaseClientTSFilePath = path3.join(
|
|
900
946
|
this.generatedFolderPath,
|
|
901
947
|
"databaseClient.ts"
|
|
902
948
|
);
|
|
903
|
-
this.generatedDatabaseClientJSFilePath =
|
|
949
|
+
this.generatedDatabaseClientJSFilePath = path3.join(
|
|
904
950
|
this.generatedFolderPath,
|
|
905
951
|
"databaseClient.js"
|
|
906
952
|
);
|
|
907
|
-
const clientExists = this.isUsingTs() ? await
|
|
953
|
+
const clientExists = this.isUsingTs() ? await fs2.pathExists(this.generatedClientTSFilePath) : await fs2.pathExists(this.generatedClientJSFilePath);
|
|
908
954
|
if (!clientExists) {
|
|
909
955
|
const file = "export default ()=>({})\nexport const client = ()=>({})";
|
|
910
956
|
if (this.isUsingTs()) {
|
|
911
|
-
await
|
|
957
|
+
await fs2.outputFile(this.generatedClientTSFilePath, file);
|
|
912
958
|
} else {
|
|
913
|
-
await
|
|
959
|
+
await fs2.outputFile(this.generatedClientJSFilePath, file);
|
|
914
960
|
}
|
|
915
961
|
}
|
|
916
962
|
const { config: config2, prebuildPath, watchList } = await this.loadConfigFile(
|
|
@@ -920,30 +966,29 @@ var ConfigManager = class {
|
|
|
920
966
|
this.watchList = watchList;
|
|
921
967
|
this.config = config2;
|
|
922
968
|
this.prebuildFilePath = prebuildPath;
|
|
923
|
-
this.publicFolderPath =
|
|
969
|
+
this.publicFolderPath = path3.join(
|
|
924
970
|
this.rootPath,
|
|
925
971
|
this.config.build.publicFolder
|
|
926
972
|
);
|
|
927
|
-
this.outputFolderPath =
|
|
973
|
+
this.outputFolderPath = path3.join(
|
|
928
974
|
this.publicFolderPath,
|
|
929
975
|
this.config.build.outputFolder
|
|
930
976
|
);
|
|
931
|
-
this.outputHTMLFilePath =
|
|
932
|
-
this.outputGitignorePath =
|
|
933
|
-
const fullLocalContentPath =
|
|
934
|
-
this.tinaFolderPath,
|
|
935
|
-
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 || "")
|
|
936
981
|
);
|
|
937
982
|
if (this.config.localContentPath) {
|
|
938
|
-
const localContentPathExists = await
|
|
983
|
+
const localContentPathExists = await fs2.pathExists(fullLocalContentPath);
|
|
939
984
|
if (localContentPathExists) {
|
|
940
985
|
logger.info(`Using separate content repo at ${fullLocalContentPath}`);
|
|
941
986
|
this.contentRootPath = fullLocalContentPath;
|
|
942
987
|
} else {
|
|
943
988
|
logger.warn(
|
|
944
|
-
`${
|
|
989
|
+
`${chalk3.yellow("Warning:")} The localContentPath ${chalk3.cyan(
|
|
945
990
|
fullLocalContentPath
|
|
946
|
-
)} 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(
|
|
947
992
|
this.tinaConfigFilePath
|
|
948
993
|
)}`
|
|
949
994
|
);
|
|
@@ -952,22 +997,22 @@ var ConfigManager = class {
|
|
|
952
997
|
if (!this.contentRootPath) {
|
|
953
998
|
this.contentRootPath = this.rootPath;
|
|
954
999
|
}
|
|
955
|
-
this.generatedFolderPathContentRepo =
|
|
1000
|
+
this.generatedFolderPathContentRepo = path3.join(
|
|
956
1001
|
await this.getTinaFolderPath(this.contentRootPath),
|
|
957
1002
|
GENERATED_FOLDER
|
|
958
1003
|
);
|
|
959
|
-
this.spaMainPath =
|
|
960
|
-
this.spaRootPath =
|
|
1004
|
+
this.spaMainPath = require2.resolve("@tinacms/app");
|
|
1005
|
+
this.spaRootPath = path3.join(this.spaMainPath, "..", "..");
|
|
961
1006
|
}
|
|
962
1007
|
async getTinaFolderPath(rootPath) {
|
|
963
|
-
const tinaFolderPath =
|
|
964
|
-
const tinaFolderExists = await
|
|
1008
|
+
const tinaFolderPath = path3.join(rootPath, TINA_FOLDER);
|
|
1009
|
+
const tinaFolderExists = await fs2.pathExists(tinaFolderPath);
|
|
965
1010
|
if (tinaFolderExists) {
|
|
966
1011
|
this.isUsingLegacyFolder = false;
|
|
967
1012
|
return tinaFolderPath;
|
|
968
1013
|
}
|
|
969
|
-
const legacyFolderPath =
|
|
970
|
-
const legacyFolderExists = await
|
|
1014
|
+
const legacyFolderPath = path3.join(rootPath, LEGACY_TINA_FOLDER);
|
|
1015
|
+
const legacyFolderExists = await fs2.pathExists(legacyFolderPath);
|
|
971
1016
|
if (legacyFolderExists) {
|
|
972
1017
|
this.isUsingLegacyFolder = true;
|
|
973
1018
|
return legacyFolderPath;
|
|
@@ -986,7 +1031,7 @@ var ConfigManager = class {
|
|
|
986
1031
|
patch: version2[2] || "x"
|
|
987
1032
|
};
|
|
988
1033
|
}
|
|
989
|
-
const generatedSchema =
|
|
1034
|
+
const generatedSchema = fs2.readJSONSync(this.generatedSchemaJSONPath);
|
|
990
1035
|
if (!generatedSchema || !(typeof generatedSchema?.version !== "undefined")) {
|
|
991
1036
|
throw new Error(
|
|
992
1037
|
`Can not find Tina GraphQL version in ${this.generatedSchemaJSONPath}`
|
|
@@ -1033,7 +1078,7 @@ var ConfigManager = class {
|
|
|
1033
1078
|
return;
|
|
1034
1079
|
}
|
|
1035
1080
|
const filepathWithExtension = `${filepath}.${ext}`;
|
|
1036
|
-
const exists =
|
|
1081
|
+
const exists = fs2.existsSync(filepathWithExtension);
|
|
1037
1082
|
if (exists) {
|
|
1038
1083
|
result = filepathWithExtension;
|
|
1039
1084
|
}
|
|
@@ -1042,33 +1087,53 @@ var ConfigManager = class {
|
|
|
1042
1087
|
return result;
|
|
1043
1088
|
}
|
|
1044
1089
|
async loadDatabaseFile() {
|
|
1045
|
-
const tmpdir =
|
|
1046
|
-
const outfile =
|
|
1090
|
+
const tmpdir = path3.join(os.tmpdir(), Date.now().toString());
|
|
1091
|
+
const outfile = path3.join(tmpdir, "database.build.mjs");
|
|
1047
1092
|
await esbuild.build({
|
|
1048
1093
|
entryPoints: [this.selfHostedDatabaseFilePath],
|
|
1049
1094
|
bundle: true,
|
|
1050
1095
|
platform: "node",
|
|
1096
|
+
format: "esm",
|
|
1051
1097
|
outfile,
|
|
1052
|
-
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
|
+
}
|
|
1053
1107
|
});
|
|
1054
|
-
const result =
|
|
1055
|
-
|
|
1108
|
+
const result = await import(pathToFileURL(outfile).href);
|
|
1109
|
+
fs2.removeSync(outfile);
|
|
1056
1110
|
return result.default;
|
|
1057
1111
|
}
|
|
1058
1112
|
async loadConfigFile(generatedFolderPath, configFilePath) {
|
|
1059
|
-
const tmpdir =
|
|
1060
|
-
const preBuildConfigPath =
|
|
1113
|
+
const tmpdir = path3.join(os.tmpdir(), Date.now().toString());
|
|
1114
|
+
const preBuildConfigPath = path3.join(
|
|
1061
1115
|
this.generatedFolderPath,
|
|
1062
1116
|
"config.prebuild.jsx"
|
|
1063
1117
|
);
|
|
1064
|
-
const
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1118
|
+
const nativeNodeModulesPlugin = {
|
|
1119
|
+
name: "native-node-modules",
|
|
1120
|
+
setup(build3) {
|
|
1121
|
+
build3.onResolve({ filter: /^node:.*/ }, (args) => {
|
|
1122
|
+
return {
|
|
1123
|
+
path: args.path,
|
|
1124
|
+
external: true
|
|
1125
|
+
};
|
|
1126
|
+
});
|
|
1127
|
+
}
|
|
1128
|
+
};
|
|
1129
|
+
const outfile = path3.join(tmpdir, "config.build.jsx");
|
|
1130
|
+
const outfile2 = path3.join(tmpdir, "config.build.mjs");
|
|
1131
|
+
const tempTSConfigFile = path3.join(tmpdir, "tsconfig.json");
|
|
1132
|
+
fs2.outputFileSync(tempTSConfigFile, "{}");
|
|
1068
1133
|
const result2 = await esbuild.build({
|
|
1069
1134
|
entryPoints: [configFilePath],
|
|
1070
1135
|
bundle: true,
|
|
1071
|
-
target: ["
|
|
1136
|
+
target: ["esnext"],
|
|
1072
1137
|
platform: "browser",
|
|
1073
1138
|
format: "esm",
|
|
1074
1139
|
logLevel: "silent",
|
|
@@ -1088,9 +1153,10 @@ var ConfigManager = class {
|
|
|
1088
1153
|
await esbuild.build({
|
|
1089
1154
|
entryPoints: [configFilePath],
|
|
1090
1155
|
bundle: true,
|
|
1091
|
-
target: ["
|
|
1156
|
+
target: ["esnext"],
|
|
1092
1157
|
logLevel: "silent",
|
|
1093
1158
|
platform: "node",
|
|
1159
|
+
format: "esm",
|
|
1094
1160
|
outfile,
|
|
1095
1161
|
loader: loaders
|
|
1096
1162
|
});
|
|
@@ -1100,19 +1166,21 @@ var ConfigManager = class {
|
|
|
1100
1166
|
// Suppress warning about comparison with -0 from client module
|
|
1101
1167
|
logLevel: "silent",
|
|
1102
1168
|
platform: "node",
|
|
1169
|
+
target: ["esnext"],
|
|
1170
|
+
format: "esm",
|
|
1103
1171
|
outfile: outfile2,
|
|
1104
1172
|
loader: loaders
|
|
1105
1173
|
});
|
|
1106
1174
|
let result;
|
|
1107
1175
|
try {
|
|
1108
|
-
result =
|
|
1176
|
+
result = await import(pathToFileURL(outfile2).href);
|
|
1109
1177
|
} catch (e) {
|
|
1110
1178
|
console.error("Unexpected error loading config");
|
|
1111
1179
|
console.error(e);
|
|
1112
1180
|
throw e;
|
|
1113
1181
|
}
|
|
1114
|
-
|
|
1115
|
-
|
|
1182
|
+
fs2.removeSync(outfile);
|
|
1183
|
+
fs2.removeSync(outfile2);
|
|
1116
1184
|
return {
|
|
1117
1185
|
config: result.default,
|
|
1118
1186
|
prebuildPath: preBuildConfigPath,
|
|
@@ -1147,20 +1215,24 @@ var loaders = {
|
|
|
1147
1215
|
};
|
|
1148
1216
|
|
|
1149
1217
|
// src/next/database.ts
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1218
|
+
import {
|
|
1219
|
+
createDatabaseInternal,
|
|
1220
|
+
FilesystemBridge,
|
|
1221
|
+
TinaLevelClient
|
|
1222
|
+
} from "@tinacms/graphql";
|
|
1223
|
+
import { pipeline } from "readable-stream";
|
|
1224
|
+
import { createServer } from "net";
|
|
1225
|
+
import { ManyLevelHost } from "many-level";
|
|
1226
|
+
import { MemoryLevel } from "memory-level";
|
|
1155
1227
|
var createDBServer = (port) => {
|
|
1156
|
-
const levelHost = new
|
|
1228
|
+
const levelHost = new ManyLevelHost(
|
|
1157
1229
|
// @ts-ignore
|
|
1158
|
-
new
|
|
1230
|
+
new MemoryLevel({
|
|
1159
1231
|
valueEncoding: "json"
|
|
1160
1232
|
})
|
|
1161
1233
|
);
|
|
1162
|
-
const dbServer =
|
|
1163
|
-
return
|
|
1234
|
+
const dbServer = createServer(function(socket) {
|
|
1235
|
+
return pipeline(socket, levelHost.createRpcStream(), socket, () => {
|
|
1164
1236
|
});
|
|
1165
1237
|
});
|
|
1166
1238
|
dbServer.once("error", (err) => {
|
|
@@ -1174,7 +1246,7 @@ var createDBServer = (port) => {
|
|
|
1174
1246
|
};
|
|
1175
1247
|
async function createAndInitializeDatabase(configManager, datalayerPort, bridgeOverride) {
|
|
1176
1248
|
let database;
|
|
1177
|
-
const bridge = bridgeOverride || new
|
|
1249
|
+
const bridge = bridgeOverride || new FilesystemBridge(configManager.rootPath, configManager.contentRootPath);
|
|
1178
1250
|
if (configManager.hasSelfHostedConfig() && configManager.config.contentApiUrlOverride) {
|
|
1179
1251
|
database = await configManager.loadDatabaseFile();
|
|
1180
1252
|
database.bridge = bridge;
|
|
@@ -1186,9 +1258,9 @@ async function createAndInitializeDatabase(configManager, datalayerPort, bridgeO
|
|
|
1186
1258
|
)} but there was no "contentApiUrlOverride" set. Falling back to built-in datalayer`
|
|
1187
1259
|
);
|
|
1188
1260
|
}
|
|
1189
|
-
const level = new
|
|
1261
|
+
const level = new TinaLevelClient(datalayerPort);
|
|
1190
1262
|
level.openConnection();
|
|
1191
|
-
database =
|
|
1263
|
+
database = createDatabaseInternal({
|
|
1192
1264
|
bridge,
|
|
1193
1265
|
level,
|
|
1194
1266
|
tinaDirectory: configManager.isUsingLegacyFolder ? LEGACY_TINA_FOLDER : TINA_FOLDER
|
|
@@ -1198,17 +1270,17 @@ async function createAndInitializeDatabase(configManager, datalayerPort, bridgeO
|
|
|
1198
1270
|
}
|
|
1199
1271
|
|
|
1200
1272
|
// src/next/commands/baseCommands.ts
|
|
1201
|
-
|
|
1202
|
-
|
|
1273
|
+
import { Command, Option } from "clipanion";
|
|
1274
|
+
import chalk4 from "chalk";
|
|
1203
1275
|
|
|
1204
1276
|
// src/utils/start-subprocess.ts
|
|
1205
|
-
|
|
1277
|
+
import childProcess from "child_process";
|
|
1206
1278
|
var startSubprocess2 = async ({ command: command2 }) => {
|
|
1207
1279
|
if (typeof command2 === "string") {
|
|
1208
1280
|
const commands = command2.split(" ");
|
|
1209
1281
|
const firstCommand = commands[0];
|
|
1210
1282
|
const args = commands.slice(1) || [];
|
|
1211
|
-
const ps =
|
|
1283
|
+
const ps = childProcess.spawn(firstCommand, args, {
|
|
1212
1284
|
stdio: "inherit",
|
|
1213
1285
|
shell: true
|
|
1214
1286
|
});
|
|
@@ -1232,45 +1304,42 @@ stack: ${code.stack || "No stack was provided"}`);
|
|
|
1232
1304
|
};
|
|
1233
1305
|
|
|
1234
1306
|
// src/next/commands/baseCommands.ts
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
var BaseCommand = class extends
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
description: "Disable anonymous telemetry that is collected"
|
|
1266
|
-
});
|
|
1267
|
-
}
|
|
1307
|
+
import { getChangedFiles, getSha, shaExists } from "@tinacms/graphql";
|
|
1308
|
+
import fs3 from "fs-extra";
|
|
1309
|
+
var BaseCommand = class extends Command {
|
|
1310
|
+
experimentalDataLayer = Option.Boolean("--experimentalData", {
|
|
1311
|
+
description: "DEPRECATED - Build the server with additional data querying capabilities"
|
|
1312
|
+
});
|
|
1313
|
+
isomorphicGitBridge = Option.Boolean("--isomorphicGitBridge", {
|
|
1314
|
+
description: "DEPRECATED - Enable Isomorphic Git Bridge Implementation"
|
|
1315
|
+
});
|
|
1316
|
+
port = Option.String("-p,--port", "4001", {
|
|
1317
|
+
description: "Specify a port to run the server on. (default 4001)"
|
|
1318
|
+
});
|
|
1319
|
+
datalayerPort = Option.String("--datalayer-port", "9000", {
|
|
1320
|
+
description: "Specify a port to run the datalayer server on. (default 9000)"
|
|
1321
|
+
});
|
|
1322
|
+
subCommand = Option.String("-c,--command", {
|
|
1323
|
+
description: "The sub-command to run"
|
|
1324
|
+
});
|
|
1325
|
+
rootPath = Option.String("--rootPath", {
|
|
1326
|
+
description: "Specify the root directory to run the CLI from (defaults to current working directory)"
|
|
1327
|
+
});
|
|
1328
|
+
verbose = Option.Boolean("-v,--verbose", false, {
|
|
1329
|
+
description: "increase verbosity of logged output"
|
|
1330
|
+
});
|
|
1331
|
+
noSDK = Option.Boolean("--noSDK", false, {
|
|
1332
|
+
description: "DEPRECATED - This should now be set in the config at client.skip = true'. Don't generate the generated client SDK"
|
|
1333
|
+
});
|
|
1334
|
+
noTelemetry = Option.Boolean("--noTelemetry", false, {
|
|
1335
|
+
description: "Disable anonymous telemetry that is collected"
|
|
1336
|
+
});
|
|
1268
1337
|
async startSubCommand() {
|
|
1269
1338
|
let subProc;
|
|
1270
1339
|
if (this.subCommand) {
|
|
1271
1340
|
subProc = await startSubprocess2({ command: this.subCommand });
|
|
1272
1341
|
logger.info(
|
|
1273
|
-
`Running web application with command: ${
|
|
1342
|
+
`Running web application with command: ${chalk4.cyan(this.subCommand)}`
|
|
1274
1343
|
);
|
|
1275
1344
|
}
|
|
1276
1345
|
function exitHandler(options, exitCode) {
|
|
@@ -1318,7 +1387,7 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1318
1387
|
const rootPath = configManager.rootPath;
|
|
1319
1388
|
let sha;
|
|
1320
1389
|
try {
|
|
1321
|
-
sha = await
|
|
1390
|
+
sha = await getSha({ fs: fs3, dir: rootPath });
|
|
1322
1391
|
} catch (e) {
|
|
1323
1392
|
if (partialReindex) {
|
|
1324
1393
|
console.error(
|
|
@@ -1328,7 +1397,7 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1328
1397
|
}
|
|
1329
1398
|
}
|
|
1330
1399
|
const lastSha = await database.getMetadata("lastSha");
|
|
1331
|
-
const exists = lastSha && await
|
|
1400
|
+
const exists = lastSha && await shaExists({ fs: fs3, dir: rootPath, sha: lastSha });
|
|
1332
1401
|
let res;
|
|
1333
1402
|
if (partialReindex && lastSha && exists && sha) {
|
|
1334
1403
|
const pathFilter = {};
|
|
@@ -1342,15 +1411,15 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1342
1411
|
matches: collection.match?.exclude || collection.match?.include ? tinaSchema.getMatches({ collection }) : void 0
|
|
1343
1412
|
};
|
|
1344
1413
|
}
|
|
1345
|
-
const { added, modified, deleted } = await
|
|
1346
|
-
fs:
|
|
1414
|
+
const { added, modified, deleted } = await getChangedFiles({
|
|
1415
|
+
fs: fs3,
|
|
1347
1416
|
dir: rootPath,
|
|
1348
1417
|
from: lastSha,
|
|
1349
1418
|
to: sha,
|
|
1350
1419
|
pathFilter
|
|
1351
1420
|
});
|
|
1352
1421
|
const tinaPathUpdates = modified.filter(
|
|
1353
|
-
(
|
|
1422
|
+
(path15) => path15.startsWith(".tina/__generated__/_schema.json") || path15.startsWith("tina/tina-lock.json")
|
|
1354
1423
|
);
|
|
1355
1424
|
if (tinaPathUpdates.length > 0) {
|
|
1356
1425
|
res = await database.indexContent({
|
|
@@ -1428,7 +1497,7 @@ var errorHTML = `<style type="text/css">
|
|
|
1428
1497
|
the assets for this page.
|
|
1429
1498
|
</p>
|
|
1430
1499
|
<p>
|
|
1431
|
-
Please visit <a href="https://tina.io/docs/
|
|
1500
|
+
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.
|
|
1432
1501
|
</p>
|
|
1433
1502
|
</div>
|
|
1434
1503
|
</div>`.trim().replace(/[\r\n\s]+/g, " ");
|
|
@@ -1466,34 +1535,38 @@ var devHTML = (port) => `<!DOCTYPE html>
|
|
|
1466
1535
|
</html>`;
|
|
1467
1536
|
|
|
1468
1537
|
// src/next/commands/dev-command/server/index.ts
|
|
1469
|
-
|
|
1538
|
+
import { createServer as createViteServer } from "vite";
|
|
1470
1539
|
|
|
1471
1540
|
// src/next/vite/index.ts
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1541
|
+
import path5 from "node:path";
|
|
1542
|
+
import react from "@vitejs/plugin-react";
|
|
1543
|
+
import fs4 from "fs-extra";
|
|
1544
|
+
import normalizePath3 from "normalize-path";
|
|
1545
|
+
import {
|
|
1546
|
+
splitVendorChunkPlugin
|
|
1547
|
+
} from "vite";
|
|
1477
1548
|
|
|
1478
1549
|
// src/next/vite/tailwind.ts
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1550
|
+
import path4 from "node:path";
|
|
1551
|
+
import aspectRatio from "@tailwindcss/aspect-ratio";
|
|
1552
|
+
import containerQueries from "@tailwindcss/container-queries";
|
|
1553
|
+
import twTypography from "@tailwindcss/typography";
|
|
1554
|
+
import tailwind from "tailwindcss";
|
|
1555
|
+
import defaultTheme from "tailwindcss/defaultTheme.js";
|
|
1556
|
+
import { createRequire as createRequire2 } from "module";
|
|
1485
1557
|
var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
1486
1558
|
return {
|
|
1487
1559
|
name: "vite-plugin-tina",
|
|
1488
1560
|
// @ts-ignore
|
|
1489
1561
|
config: (viteConfig) => {
|
|
1562
|
+
const require2 = createRequire2(import.meta.url);
|
|
1490
1563
|
const plugins = [];
|
|
1491
1564
|
const content = [
|
|
1492
|
-
|
|
1565
|
+
path4.join(spaPath, "src/**/*.{vue,js,ts,jsx,tsx,svelte}"),
|
|
1493
1566
|
prebuildFilePath,
|
|
1494
|
-
|
|
1567
|
+
require2.resolve("tinacms")
|
|
1495
1568
|
];
|
|
1496
|
-
const tw = (
|
|
1569
|
+
const tw = tailwind({
|
|
1497
1570
|
theme: {
|
|
1498
1571
|
columns: {
|
|
1499
1572
|
auto: "auto",
|
|
@@ -1681,6 +1754,9 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1681
1754
|
500: "#EC4815",
|
|
1682
1755
|
600: "#DC4419"
|
|
1683
1756
|
},
|
|
1757
|
+
"tina-orange": "#EC4815",
|
|
1758
|
+
"tina-orange-dark": "#C2410C",
|
|
1759
|
+
"tina-orange-light": "#FFF7ED",
|
|
1684
1760
|
background: "#FFFFFF",
|
|
1685
1761
|
foreground: "#0A0A0A",
|
|
1686
1762
|
muted: "#F5F5F5",
|
|
@@ -1702,7 +1778,7 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1702
1778
|
ring: "#0A0A0A"
|
|
1703
1779
|
},
|
|
1704
1780
|
fontFamily: {
|
|
1705
|
-
sans: ["Inter", ...
|
|
1781
|
+
sans: ["Inter", ...defaultTheme.fontFamily.sans]
|
|
1706
1782
|
},
|
|
1707
1783
|
lineHeight: {
|
|
1708
1784
|
3: "12px",
|
|
@@ -1727,9 +1803,9 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1727
1803
|
},
|
|
1728
1804
|
content,
|
|
1729
1805
|
plugins: [
|
|
1730
|
-
(
|
|
1731
|
-
|
|
1732
|
-
|
|
1806
|
+
twTypography({ className: "tina-prose" }),
|
|
1807
|
+
aspectRatio,
|
|
1808
|
+
containerQueries
|
|
1733
1809
|
]
|
|
1734
1810
|
});
|
|
1735
1811
|
plugins.push(tw);
|
|
@@ -1750,35 +1826,35 @@ async function listFilesRecursively({
|
|
|
1750
1826
|
config: config2,
|
|
1751
1827
|
roothPath
|
|
1752
1828
|
}) {
|
|
1753
|
-
const fullDirectoryPath =
|
|
1829
|
+
const fullDirectoryPath = path5.join(
|
|
1754
1830
|
roothPath,
|
|
1755
1831
|
config2.publicFolder,
|
|
1756
1832
|
directoryPath
|
|
1757
1833
|
);
|
|
1758
|
-
const exists = await
|
|
1834
|
+
const exists = await fs4.pathExists(fullDirectoryPath);
|
|
1759
1835
|
if (!exists) {
|
|
1760
1836
|
return { "0": [] };
|
|
1761
1837
|
}
|
|
1762
|
-
const items = await
|
|
1838
|
+
const items = await fs4.readdir(fullDirectoryPath);
|
|
1763
1839
|
const staticMediaItems = [];
|
|
1764
1840
|
for (const item of items) {
|
|
1765
|
-
const itemPath =
|
|
1766
|
-
const stats = await
|
|
1841
|
+
const itemPath = path5.join(fullDirectoryPath, item);
|
|
1842
|
+
const stats = await fs4.promises.lstat(itemPath);
|
|
1767
1843
|
const staticMediaItem = {
|
|
1768
1844
|
id: item,
|
|
1769
1845
|
filename: item,
|
|
1770
1846
|
type: stats.isDirectory() ? "dir" : "file",
|
|
1771
1847
|
directory: `${directoryPath.replace(config2.mediaRoot, "")}`,
|
|
1772
|
-
src: `/${
|
|
1848
|
+
src: `/${path5.join(directoryPath, item)}`,
|
|
1773
1849
|
thumbnails: {
|
|
1774
|
-
"75x75": `/${
|
|
1775
|
-
"400x400": `/${
|
|
1776
|
-
"1000x1000": `/${
|
|
1850
|
+
"75x75": `/${path5.join(directoryPath, item)}`,
|
|
1851
|
+
"400x400": `/${path5.join(directoryPath, item)}`,
|
|
1852
|
+
"1000x1000": `/${path5.join(directoryPath, item)}`
|
|
1777
1853
|
}
|
|
1778
1854
|
};
|
|
1779
1855
|
if (stats.isDirectory()) {
|
|
1780
1856
|
staticMediaItem.children = await listFilesRecursively({
|
|
1781
|
-
directoryPath:
|
|
1857
|
+
directoryPath: path5.join(directoryPath, item),
|
|
1782
1858
|
config: config2,
|
|
1783
1859
|
roothPath
|
|
1784
1860
|
});
|
|
@@ -1819,7 +1895,7 @@ var createConfig = async ({
|
|
|
1819
1895
|
}
|
|
1820
1896
|
}
|
|
1821
1897
|
});
|
|
1822
|
-
const staticMediaPath =
|
|
1898
|
+
const staticMediaPath = path5.join(
|
|
1823
1899
|
configManager.generatedFolderPath,
|
|
1824
1900
|
"static-media.json"
|
|
1825
1901
|
);
|
|
@@ -1829,21 +1905,21 @@ var createConfig = async ({
|
|
|
1829
1905
|
config: configManager.config.media.tina,
|
|
1830
1906
|
roothPath: configManager.rootPath
|
|
1831
1907
|
});
|
|
1832
|
-
await
|
|
1908
|
+
await fs4.outputFile(staticMediaPath, JSON.stringify(staticMedia, null, 2));
|
|
1833
1909
|
} else {
|
|
1834
|
-
await
|
|
1910
|
+
await fs4.outputFile(staticMediaPath, `[]`);
|
|
1835
1911
|
}
|
|
1836
1912
|
const alias = {
|
|
1837
1913
|
TINA_IMPORT: configManager.prebuildFilePath,
|
|
1838
1914
|
SCHEMA_IMPORT: configManager.generatedGraphQLJSONPath,
|
|
1839
1915
|
STATIC_MEDIA_IMPORT: staticMediaPath,
|
|
1840
|
-
crypto:
|
|
1841
|
-
fs:
|
|
1842
|
-
os:
|
|
1843
|
-
path:
|
|
1916
|
+
crypto: path5.join(configManager.spaRootPath, "src", "dummy-client.ts"),
|
|
1917
|
+
fs: path5.join(configManager.spaRootPath, "src", "dummy-client.ts"),
|
|
1918
|
+
os: path5.join(configManager.spaRootPath, "src", "dummy-client.ts"),
|
|
1919
|
+
path: path5.join(configManager.spaRootPath, "src", "dummy-client.ts")
|
|
1844
1920
|
};
|
|
1845
1921
|
if (configManager.shouldSkipSDK()) {
|
|
1846
|
-
alias["CLIENT_IMPORT"] =
|
|
1922
|
+
alias["CLIENT_IMPORT"] = path5.join(
|
|
1847
1923
|
configManager.spaRootPath,
|
|
1848
1924
|
"src",
|
|
1849
1925
|
"dummy-client.ts"
|
|
@@ -1859,7 +1935,7 @@ var createConfig = async ({
|
|
|
1859
1935
|
const version2 = `${fullVersion.major}.${fullVersion.minor}`;
|
|
1860
1936
|
const config2 = {
|
|
1861
1937
|
root: configManager.spaRootPath,
|
|
1862
|
-
base: `/${basePath ? `${(
|
|
1938
|
+
base: `/${basePath ? `${normalizePath3(basePath)}/` : ""}${normalizePath3(
|
|
1863
1939
|
configManager.config.build.outputFolder
|
|
1864
1940
|
)}/`,
|
|
1865
1941
|
appType: "spa",
|
|
@@ -1922,13 +1998,14 @@ var createConfig = async ({
|
|
|
1922
1998
|
* `splitVendorChunkPlugin` is needed because `tinacms` is quite large,
|
|
1923
1999
|
* Vite's chunking strategy chokes on memory issues for smaller machines (ie. on CI).
|
|
1924
2000
|
*/
|
|
1925
|
-
(
|
|
2001
|
+
react({
|
|
1926
2002
|
babel: {
|
|
1927
2003
|
// Supresses the warning [NOTE] babel The code generator has deoptimised the styling of
|
|
1928
2004
|
compact: true
|
|
1929
|
-
}
|
|
2005
|
+
},
|
|
2006
|
+
fastRefresh: false
|
|
1930
2007
|
}),
|
|
1931
|
-
|
|
2008
|
+
splitVendorChunkPlugin(),
|
|
1932
2009
|
tinaTailwind(configManager.spaRootPath, configManager.prebuildFilePath),
|
|
1933
2010
|
...plugins
|
|
1934
2011
|
]
|
|
@@ -1937,21 +2014,21 @@ var createConfig = async ({
|
|
|
1937
2014
|
};
|
|
1938
2015
|
|
|
1939
2016
|
// src/next/vite/plugins.ts
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
2017
|
+
import { createFilter } from "@rollup/pluginutils";
|
|
2018
|
+
import fs6 from "fs";
|
|
2019
|
+
import { transformWithEsbuild } from "vite";
|
|
2020
|
+
import { transform as esbuildTransform } from "esbuild";
|
|
2021
|
+
import path7 from "path";
|
|
2022
|
+
import bodyParser from "body-parser";
|
|
2023
|
+
import cors from "cors";
|
|
2024
|
+
import { resolve as gqlResolve } from "@tinacms/graphql";
|
|
1948
2025
|
|
|
1949
2026
|
// src/next/commands/dev-command/server/media.ts
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
2027
|
+
import fs5 from "fs-extra";
|
|
2028
|
+
import path6, { join } from "path";
|
|
2029
|
+
import busboy from "busboy";
|
|
1953
2030
|
var createMediaRouter = (config2) => {
|
|
1954
|
-
const mediaFolder =
|
|
2031
|
+
const mediaFolder = path6.join(
|
|
1955
2032
|
config2.rootPath,
|
|
1956
2033
|
config2.publicFolder,
|
|
1957
2034
|
config2.mediaRoot
|
|
@@ -1975,12 +2052,12 @@ var createMediaRouter = (config2) => {
|
|
|
1975
2052
|
res.end(JSON.stringify(didDelete));
|
|
1976
2053
|
};
|
|
1977
2054
|
const handlePost = async function(req, res) {
|
|
1978
|
-
const bb = (
|
|
2055
|
+
const bb = busboy({ headers: req.headers });
|
|
1979
2056
|
bb.on("file", async (_name, file, _info) => {
|
|
1980
2057
|
const fullPath = decodeURI(req.url?.slice("/media/upload/".length));
|
|
1981
|
-
const saveTo =
|
|
1982
|
-
await
|
|
1983
|
-
file.pipe(
|
|
2058
|
+
const saveTo = path6.join(mediaFolder, ...fullPath.split("/"));
|
|
2059
|
+
await fs5.ensureDir(path6.dirname(saveTo));
|
|
2060
|
+
file.pipe(fs5.createWriteStream(saveTo));
|
|
1984
2061
|
});
|
|
1985
2062
|
bb.on("error", (error) => {
|
|
1986
2063
|
res.statusCode = 500;
|
|
@@ -2006,6 +2083,9 @@ var parseMediaFolder = (str) => {
|
|
|
2006
2083
|
return returnString;
|
|
2007
2084
|
};
|
|
2008
2085
|
var MediaModel = class {
|
|
2086
|
+
rootPath;
|
|
2087
|
+
publicFolder;
|
|
2088
|
+
mediaRoot;
|
|
2009
2089
|
constructor({ rootPath, publicFolder, mediaRoot }) {
|
|
2010
2090
|
this.rootPath = rootPath;
|
|
2011
2091
|
this.mediaRoot = mediaRoot;
|
|
@@ -2013,23 +2093,23 @@ var MediaModel = class {
|
|
|
2013
2093
|
}
|
|
2014
2094
|
async listMedia(args) {
|
|
2015
2095
|
try {
|
|
2016
|
-
const folderPath =
|
|
2096
|
+
const folderPath = join(
|
|
2017
2097
|
this.rootPath,
|
|
2018
2098
|
this.publicFolder,
|
|
2019
2099
|
this.mediaRoot,
|
|
2020
2100
|
decodeURIComponent(args.searchPath)
|
|
2021
2101
|
);
|
|
2022
2102
|
const searchPath = parseMediaFolder(args.searchPath);
|
|
2023
|
-
if (!await
|
|
2103
|
+
if (!await fs5.pathExists(folderPath)) {
|
|
2024
2104
|
return {
|
|
2025
2105
|
files: [],
|
|
2026
2106
|
directories: []
|
|
2027
2107
|
};
|
|
2028
2108
|
}
|
|
2029
|
-
const filesStr = await
|
|
2109
|
+
const filesStr = await fs5.readdir(folderPath);
|
|
2030
2110
|
const filesProm = filesStr.map(async (file) => {
|
|
2031
|
-
const filePath =
|
|
2032
|
-
const stat = await
|
|
2111
|
+
const filePath = join(folderPath, file);
|
|
2112
|
+
const stat = await fs5.stat(filePath);
|
|
2033
2113
|
let src = `/${file}`;
|
|
2034
2114
|
const isFile = stat.isFile();
|
|
2035
2115
|
if (!isFile) {
|
|
@@ -2085,14 +2165,14 @@ var MediaModel = class {
|
|
|
2085
2165
|
}
|
|
2086
2166
|
async deleteMedia(args) {
|
|
2087
2167
|
try {
|
|
2088
|
-
const file =
|
|
2168
|
+
const file = join(
|
|
2089
2169
|
this.rootPath,
|
|
2090
2170
|
this.publicFolder,
|
|
2091
2171
|
this.mediaRoot,
|
|
2092
2172
|
decodeURIComponent(args.searchPath)
|
|
2093
2173
|
);
|
|
2094
|
-
await
|
|
2095
|
-
await
|
|
2174
|
+
await fs5.stat(file);
|
|
2175
|
+
await fs5.remove(file);
|
|
2096
2176
|
return { ok: true };
|
|
2097
2177
|
} catch (error) {
|
|
2098
2178
|
console.error(error);
|
|
@@ -2150,9 +2230,9 @@ var transformTsxPlugin = ({
|
|
|
2150
2230
|
const plug = {
|
|
2151
2231
|
name: "transform-tsx",
|
|
2152
2232
|
async transform(code, id) {
|
|
2153
|
-
const extName =
|
|
2233
|
+
const extName = path7.extname(id);
|
|
2154
2234
|
if (extName.startsWith(".tsx") || extName.startsWith(".ts")) {
|
|
2155
|
-
const result = await (
|
|
2235
|
+
const result = await esbuildTransform(code, { loader: "tsx" });
|
|
2156
2236
|
return {
|
|
2157
2237
|
code: result.code
|
|
2158
2238
|
};
|
|
@@ -2171,8 +2251,8 @@ var devServerEndPointsPlugin = ({
|
|
|
2171
2251
|
const plug = {
|
|
2172
2252
|
name: "graphql-endpoints",
|
|
2173
2253
|
configureServer(server) {
|
|
2174
|
-
server.middlewares.use((
|
|
2175
|
-
server.middlewares.use(
|
|
2254
|
+
server.middlewares.use(cors());
|
|
2255
|
+
server.middlewares.use(bodyParser.json({ limit: "5mb" }));
|
|
2176
2256
|
server.middlewares.use(async (req, res, next) => {
|
|
2177
2257
|
const mediaPaths = configManager.config.media?.tina;
|
|
2178
2258
|
const mediaRouter = createMediaRouter({
|
|
@@ -2211,7 +2291,7 @@ var devServerEndPointsPlugin = ({
|
|
|
2211
2291
|
const { query, variables } = req.body;
|
|
2212
2292
|
let result;
|
|
2213
2293
|
await databaseLock(async () => {
|
|
2214
|
-
result = await (
|
|
2294
|
+
result = await gqlResolve({
|
|
2215
2295
|
config: {
|
|
2216
2296
|
useRelativeMedia: true
|
|
2217
2297
|
},
|
|
@@ -2247,13 +2327,13 @@ function viteTransformExtension({
|
|
|
2247
2327
|
include = "**/*.svg",
|
|
2248
2328
|
exclude
|
|
2249
2329
|
} = {}) {
|
|
2250
|
-
const filter =
|
|
2330
|
+
const filter = createFilter(include, exclude);
|
|
2251
2331
|
return {
|
|
2252
2332
|
name: "vite-plugin-svgr",
|
|
2253
2333
|
async transform(code, id) {
|
|
2254
2334
|
if (filter(id)) {
|
|
2255
2335
|
const { transform: transform2 } = await import("@svgr/core");
|
|
2256
|
-
const svgCode = await
|
|
2336
|
+
const svgCode = await fs6.promises.readFile(
|
|
2257
2337
|
id.replace(/\?.*$/, ""),
|
|
2258
2338
|
"utf8"
|
|
2259
2339
|
);
|
|
@@ -2263,7 +2343,7 @@ function viteTransformExtension({
|
|
|
2263
2343
|
previousExport: exportAsDefault ? null : code
|
|
2264
2344
|
}
|
|
2265
2345
|
});
|
|
2266
|
-
const res = await
|
|
2346
|
+
const res = await transformWithEsbuild(componentCode, id, {
|
|
2267
2347
|
loader: "jsx",
|
|
2268
2348
|
...esbuildOptions
|
|
2269
2349
|
});
|
|
@@ -2290,7 +2370,7 @@ var createDevServer = async (configManager, database, searchIndex, apiURL, noWat
|
|
|
2290
2370
|
}),
|
|
2291
2371
|
viteTransformExtension()
|
|
2292
2372
|
];
|
|
2293
|
-
return (
|
|
2373
|
+
return createViteServer(
|
|
2294
2374
|
await createConfig({
|
|
2295
2375
|
configManager,
|
|
2296
2376
|
database,
|
|
@@ -2320,37 +2400,30 @@ var createDevServer = async (configManager, database, searchIndex, apiURL, noWat
|
|
|
2320
2400
|
|
|
2321
2401
|
// src/next/commands/dev-command/index.ts
|
|
2322
2402
|
var DevCommand = class extends BaseCommand {
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
this
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
description: `Builds Tina and starts the dev server`,
|
|
2348
|
-
examples: [
|
|
2349
|
-
[`A basic example`, `$0 dev`],
|
|
2350
|
-
[`A second example`, `$0 dev --rootPath`]
|
|
2351
|
-
]
|
|
2352
|
-
});
|
|
2353
|
-
}
|
|
2403
|
+
static paths = [["dev"], ["server:start"]];
|
|
2404
|
+
// NOTE: camelCase commands for string options don't work if there's an `=` used https://github.com/arcanis/clipanion/issues/141
|
|
2405
|
+
watchFolders = Option2.String("-w,--watchFolders", {
|
|
2406
|
+
description: "DEPRECATED - a list of folders (relative to where this is being run) that the cli will watch for changes"
|
|
2407
|
+
});
|
|
2408
|
+
noWatch = Option2.Boolean("--noWatch", false, {
|
|
2409
|
+
description: "Don't regenerate config on file changes"
|
|
2410
|
+
});
|
|
2411
|
+
outputSearchIndexPath = Option2.String("--outputSearchIndexPath", {
|
|
2412
|
+
description: "Path to write the search index to"
|
|
2413
|
+
});
|
|
2414
|
+
noServer = Option2.Boolean("--no-server", false, {
|
|
2415
|
+
description: "Do not start the dev server"
|
|
2416
|
+
});
|
|
2417
|
+
indexingLock = new AsyncLock();
|
|
2418
|
+
// Prevent indexes and reads occurring at once
|
|
2419
|
+
static usage = Command2.Usage({
|
|
2420
|
+
category: `Commands`,
|
|
2421
|
+
description: `Builds Tina and starts the dev server`,
|
|
2422
|
+
examples: [
|
|
2423
|
+
[`A basic example`, `$0 dev`],
|
|
2424
|
+
[`A second example`, `$0 dev --rootPath`]
|
|
2425
|
+
]
|
|
2426
|
+
});
|
|
2354
2427
|
async catch(error) {
|
|
2355
2428
|
logger.error("Error occured during tinacms dev");
|
|
2356
2429
|
console.error(error);
|
|
@@ -2387,7 +2460,7 @@ var DevCommand = class extends BaseCommand {
|
|
|
2387
2460
|
} else {
|
|
2388
2461
|
database.clearCache();
|
|
2389
2462
|
}
|
|
2390
|
-
const { tinaSchema: tinaSchema2, graphQLSchema: graphQLSchema2, lookup, queryDoc, fragDoc } = await
|
|
2463
|
+
const { tinaSchema: tinaSchema2, graphQLSchema: graphQLSchema2, lookup, queryDoc, fragDoc } = await buildSchema(configManager.config);
|
|
2391
2464
|
const codegen2 = new Codegen({
|
|
2392
2465
|
isLocal: true,
|
|
2393
2466
|
configManager,
|
|
@@ -2401,29 +2474,32 @@ var DevCommand = class extends BaseCommand {
|
|
|
2401
2474
|
});
|
|
2402
2475
|
const apiURL2 = await codegen2.execute();
|
|
2403
2476
|
if (!configManager.isUsingLegacyFolder) {
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
const
|
|
2408
|
-
|
|
2409
|
-
|
|
2477
|
+
const schemaObject = await fs7.readJSON(
|
|
2478
|
+
configManager.generatedSchemaJSONPath
|
|
2479
|
+
);
|
|
2480
|
+
const lookupObject = await fs7.readJSON(
|
|
2481
|
+
configManager.generatedLookupJSONPath
|
|
2482
|
+
);
|
|
2483
|
+
const graphqlSchemaObject = await fs7.readJSON(
|
|
2484
|
+
configManager.generatedGraphQLJSONPath
|
|
2485
|
+
);
|
|
2410
2486
|
const tinaLockFilename = "tina-lock.json";
|
|
2411
2487
|
const tinaLockContent = JSON.stringify({
|
|
2412
2488
|
schema: schemaObject,
|
|
2413
2489
|
lookup: lookupObject,
|
|
2414
2490
|
graphql: graphqlSchemaObject
|
|
2415
2491
|
});
|
|
2416
|
-
|
|
2417
|
-
|
|
2492
|
+
fs7.writeFileSync(
|
|
2493
|
+
path8.join(configManager.tinaFolderPath, tinaLockFilename),
|
|
2418
2494
|
tinaLockContent
|
|
2419
2495
|
);
|
|
2420
2496
|
if (configManager.hasSeparateContentRoot()) {
|
|
2421
2497
|
const rootPath = await configManager.getTinaFolderPath(
|
|
2422
2498
|
configManager.contentRootPath
|
|
2423
2499
|
);
|
|
2424
|
-
const filePath =
|
|
2425
|
-
await
|
|
2426
|
-
await
|
|
2500
|
+
const filePath = path8.join(rootPath, tinaLockFilename);
|
|
2501
|
+
await fs7.ensureFile(filePath);
|
|
2502
|
+
await fs7.outputFile(filePath, tinaLockContent);
|
|
2427
2503
|
}
|
|
2428
2504
|
}
|
|
2429
2505
|
await this.indexContentWithSpinner({
|
|
@@ -2466,19 +2542,19 @@ ${dangerText(e.message)}
|
|
|
2466
2542
|
const { apiURL, graphQLSchema, tinaSchema } = await setup({
|
|
2467
2543
|
firstTime: true
|
|
2468
2544
|
});
|
|
2469
|
-
await
|
|
2470
|
-
await
|
|
2545
|
+
await fs7.outputFile(configManager.outputHTMLFilePath, devHTML(this.port));
|
|
2546
|
+
await fs7.outputFile(
|
|
2471
2547
|
configManager.outputGitignorePath,
|
|
2472
2548
|
"index.html\nassets/"
|
|
2473
2549
|
);
|
|
2474
|
-
const searchIndexClient = new
|
|
2550
|
+
const searchIndexClient = new LocalSearchIndexClient({
|
|
2475
2551
|
stopwordLanguages: configManager.config.search?.tina?.stopwordLanguages,
|
|
2476
2552
|
tokenSplitRegex: configManager.config.search?.tina?.tokenSplitRegex
|
|
2477
2553
|
});
|
|
2478
2554
|
await searchIndexClient.onStartIndexing();
|
|
2479
|
-
const searchIndexer = new
|
|
2555
|
+
const searchIndexer = new SearchIndexer({
|
|
2480
2556
|
batchSize: configManager.config.search?.indexBatchSize || 100,
|
|
2481
|
-
bridge: new
|
|
2557
|
+
bridge: new FilesystemBridge2(
|
|
2482
2558
|
configManager.rootPath,
|
|
2483
2559
|
configManager.contentRootPath
|
|
2484
2560
|
),
|
|
@@ -2519,7 +2595,7 @@ ${dangerText(e.message)}
|
|
|
2519
2595
|
);
|
|
2520
2596
|
await server.listen(Number(this.port));
|
|
2521
2597
|
if (!this.noWatch) {
|
|
2522
|
-
|
|
2598
|
+
chokidar.watch(configManager.watchList).on("change", async () => {
|
|
2523
2599
|
await dbLock(async () => {
|
|
2524
2600
|
logger.info(`Tina config change detected, rebuilding`);
|
|
2525
2601
|
await setup({ firstTime: false });
|
|
@@ -2581,11 +2657,11 @@ ${dangerText(e.message)}
|
|
|
2581
2657
|
// subItems: [
|
|
2582
2658
|
// {
|
|
2583
2659
|
// key: 'Custom queries',
|
|
2584
|
-
// value: 'https://tina.io/
|
|
2660
|
+
// value: 'https://tina.io/docs/r/content-api-overview',
|
|
2585
2661
|
// },
|
|
2586
2662
|
// {
|
|
2587
2663
|
// key: 'Visual editing',
|
|
2588
|
-
// value: 'https://tina.io/visual-editing',
|
|
2664
|
+
// value: 'https://tina.io/docs/r/visual-editing-setup',
|
|
2589
2665
|
// },
|
|
2590
2666
|
// ],
|
|
2591
2667
|
// },
|
|
@@ -2596,14 +2672,14 @@ ${dangerText(e.message)}
|
|
|
2596
2672
|
watchContentFiles(configManager, database, databaseLock, searchIndexer) {
|
|
2597
2673
|
const collectionContentFiles = [];
|
|
2598
2674
|
configManager.config.schema.collections.forEach((collection) => {
|
|
2599
|
-
const collectionGlob = `${
|
|
2675
|
+
const collectionGlob = `${path8.join(
|
|
2600
2676
|
configManager.contentRootPath,
|
|
2601
2677
|
collection.path
|
|
2602
2678
|
)}/**/*.${collection.format || "md"}`;
|
|
2603
2679
|
collectionContentFiles.push(collectionGlob);
|
|
2604
2680
|
});
|
|
2605
2681
|
let ready = false;
|
|
2606
|
-
|
|
2682
|
+
chokidar.watch(collectionContentFiles).on("ready", () => {
|
|
2607
2683
|
ready = true;
|
|
2608
2684
|
}).on("add", async (addedFile) => {
|
|
2609
2685
|
if (!ready) {
|
|
@@ -2640,28 +2716,35 @@ ${dangerText(e.message)}
|
|
|
2640
2716
|
await callback();
|
|
2641
2717
|
});
|
|
2642
2718
|
};
|
|
2643
|
-
|
|
2719
|
+
chokidar.watch(configManager.userQueriesAndFragmentsGlob).on("add", executeCallback).on("change", executeCallback).on("unlink", executeCallback);
|
|
2644
2720
|
}
|
|
2645
2721
|
};
|
|
2646
2722
|
|
|
2647
2723
|
// src/next/commands/build-command/index.ts
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2724
|
+
import crypto from "crypto";
|
|
2725
|
+
import path9 from "path";
|
|
2726
|
+
import { diff } from "@graphql-inspector/core";
|
|
2727
|
+
import { FilesystemBridge as FilesystemBridge3, buildSchema as buildSchema2 } from "@tinacms/graphql";
|
|
2728
|
+
import { parseURL as parseURL2 } from "@tinacms/schema-tools";
|
|
2729
|
+
import {
|
|
2730
|
+
SearchIndexer as SearchIndexer2,
|
|
2731
|
+
TinaCMSSearchIndexClient
|
|
2732
|
+
} from "@tinacms/search";
|
|
2733
|
+
import { Command as Command3, Option as Option3 } from "clipanion";
|
|
2734
|
+
import fs8 from "fs-extra";
|
|
2735
|
+
import {
|
|
2736
|
+
buildASTSchema as buildASTSchema2,
|
|
2737
|
+
buildClientSchema,
|
|
2738
|
+
getIntrospectionQuery
|
|
2739
|
+
} from "graphql";
|
|
2740
|
+
import Progress2 from "progress";
|
|
2658
2741
|
|
|
2659
2742
|
// src/utils/index.ts
|
|
2660
|
-
|
|
2743
|
+
import { ChangeType } from "@graphql-inspector/core";
|
|
2661
2744
|
var getFaqLink = (type) => {
|
|
2662
2745
|
switch (type) {
|
|
2663
|
-
case
|
|
2664
|
-
return "https://tina.io/docs/
|
|
2746
|
+
case ChangeType.FieldRemoved: {
|
|
2747
|
+
return "https://tina.io/docs/r/FAQ/#2-how-do-i-resolve-the-local-graphql-schema-doesnt-match-the-remote-graphql-schema-error";
|
|
2665
2748
|
}
|
|
2666
2749
|
default:
|
|
2667
2750
|
return null;
|
|
@@ -2682,7 +2765,7 @@ async function sleepAndCallFunc({
|
|
|
2682
2765
|
}
|
|
2683
2766
|
|
|
2684
2767
|
// src/next/commands/build-command/server.ts
|
|
2685
|
-
|
|
2768
|
+
import { build as build2 } from "vite";
|
|
2686
2769
|
var buildProductionSpa = async (configManager, database, apiURL) => {
|
|
2687
2770
|
const publicEnv = {};
|
|
2688
2771
|
Object.keys(process.env).forEach((key) => {
|
|
@@ -2716,12 +2799,12 @@ var buildProductionSpa = async (configManager, database, apiURL) => {
|
|
|
2716
2799
|
}
|
|
2717
2800
|
}
|
|
2718
2801
|
});
|
|
2719
|
-
return (
|
|
2802
|
+
return build2(config2);
|
|
2720
2803
|
};
|
|
2721
2804
|
|
|
2722
2805
|
// src/next/commands/build-command/waitForDB.ts
|
|
2723
|
-
|
|
2724
|
-
|
|
2806
|
+
import { parseURL } from "@tinacms/schema-tools";
|
|
2807
|
+
import Progress from "progress";
|
|
2725
2808
|
var POLLING_INTERVAL = 5e3;
|
|
2726
2809
|
var STATUS_INPROGRESS = "inprogress";
|
|
2727
2810
|
var STATUS_COMPLETE = "complete";
|
|
@@ -2734,14 +2817,14 @@ var IndexFailedError = class extends Error {
|
|
|
2734
2817
|
};
|
|
2735
2818
|
var waitForDB = async (config2, apiUrl, previewName, verbose) => {
|
|
2736
2819
|
const token = config2.token;
|
|
2737
|
-
const { clientId, branch, isLocalClient, host } =
|
|
2820
|
+
const { clientId, branch, isLocalClient, host } = parseURL(apiUrl);
|
|
2738
2821
|
if (isLocalClient || !host || !clientId || !branch) {
|
|
2739
2822
|
if (verbose) {
|
|
2740
2823
|
logger.info(logText("Not using TinaCloud, skipping DB check"));
|
|
2741
2824
|
}
|
|
2742
2825
|
return;
|
|
2743
2826
|
}
|
|
2744
|
-
const bar2 = new
|
|
2827
|
+
const bar2 = new Progress(
|
|
2745
2828
|
"Checking indexing process in TinaCloud... :prog",
|
|
2746
2829
|
1
|
|
2747
2830
|
);
|
|
@@ -2804,51 +2887,44 @@ var waitForDB = async (config2, apiUrl, previewName, verbose) => {
|
|
|
2804
2887
|
|
|
2805
2888
|
// src/next/commands/build-command/index.ts
|
|
2806
2889
|
var BuildCommand = class extends BaseCommand {
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
|
|
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
|
-
static {
|
|
2847
|
-
this.usage = import_clipanion3.Command.Usage({
|
|
2848
|
-
category: `Commands`,
|
|
2849
|
-
description: `Build the CMS and autogenerated modules for usage with TinaCloud`
|
|
2850
|
-
});
|
|
2851
|
-
}
|
|
2890
|
+
static paths = [["build"]];
|
|
2891
|
+
localOption = Option3.Boolean("--local", {
|
|
2892
|
+
description: "Starts local Graphql server and builds the local client instead of production client"
|
|
2893
|
+
});
|
|
2894
|
+
skipIndexing = Option3.Boolean("--skip-indexing", false, {
|
|
2895
|
+
description: "Skips indexing the content. This can be used for building the site without indexing the content (defaults to false)"
|
|
2896
|
+
});
|
|
2897
|
+
partialReindex = Option3.Boolean("--partial-reindex", false, {
|
|
2898
|
+
description: "Re-indexes only the content that has changed since the last build (defaults to false). Not currently supported for separate content repos."
|
|
2899
|
+
});
|
|
2900
|
+
tinaGraphQLVersion = Option3.String("--tina-graphql-version", {
|
|
2901
|
+
description: "Specify the version of @tinacms/graphql to use (defaults to latest)"
|
|
2902
|
+
});
|
|
2903
|
+
/**
|
|
2904
|
+
* 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
|
|
2905
|
+
*/
|
|
2906
|
+
skipCloudChecks = Option3.Boolean("--skip-cloud-checks", false, {
|
|
2907
|
+
description: "Skips checking the provided cloud config."
|
|
2908
|
+
});
|
|
2909
|
+
skipSearchIndex = Option3.Boolean("--skip-search-index", false, {
|
|
2910
|
+
description: "Skip indexing the site for search"
|
|
2911
|
+
});
|
|
2912
|
+
upstreamBranch = Option3.String("--upstream-branch", {
|
|
2913
|
+
description: "Optional upstream branch with the schema. If not specified, default will be used."
|
|
2914
|
+
});
|
|
2915
|
+
previewBaseBranch = Option3.String("--preview-base-branch", {
|
|
2916
|
+
description: "The base branch for the preview"
|
|
2917
|
+
});
|
|
2918
|
+
previewName = Option3.String("--preview-name", {
|
|
2919
|
+
description: "The name of the preview branch"
|
|
2920
|
+
});
|
|
2921
|
+
noClientBuildCache = Option3.Boolean("--no-client-build-cache", false, {
|
|
2922
|
+
description: "Disables the client build cache"
|
|
2923
|
+
});
|
|
2924
|
+
static usage = Command3.Usage({
|
|
2925
|
+
category: `Commands`,
|
|
2926
|
+
description: `Build the CMS and autogenerated modules for usage with TinaCloud`
|
|
2927
|
+
});
|
|
2852
2928
|
async catch(error) {
|
|
2853
2929
|
console.error(error);
|
|
2854
2930
|
process.exit(1);
|
|
@@ -2893,7 +2969,7 @@ ${dangerText(e.message)}`);
|
|
|
2893
2969
|
configManager,
|
|
2894
2970
|
Number(this.datalayerPort)
|
|
2895
2971
|
);
|
|
2896
|
-
const { queryDoc, fragDoc, graphQLSchema, tinaSchema, lookup } = await (
|
|
2972
|
+
const { queryDoc, fragDoc, graphQLSchema, tinaSchema, lookup } = await buildSchema2(configManager.config);
|
|
2897
2973
|
const codegen2 = new Codegen({
|
|
2898
2974
|
configManager,
|
|
2899
2975
|
port: this.localOption ? Number(this.port) : void 0,
|
|
@@ -3001,7 +3077,7 @@ ${dangerText(e.message)}
|
|
|
3001
3077
|
}
|
|
3002
3078
|
}
|
|
3003
3079
|
await buildProductionSpa(configManager, database, codegen2.productionUrl);
|
|
3004
|
-
await
|
|
3080
|
+
await fs8.outputFile(
|
|
3005
3081
|
configManager.outputGitignorePath,
|
|
3006
3082
|
"index.html\nassets/"
|
|
3007
3083
|
);
|
|
@@ -3033,7 +3109,7 @@ ${dangerText(e.message)}
|
|
|
3033
3109
|
"indexerToken not configured in tina search configuration."
|
|
3034
3110
|
);
|
|
3035
3111
|
}
|
|
3036
|
-
client = new
|
|
3112
|
+
client = new TinaCMSSearchIndexClient({
|
|
3037
3113
|
apiUrl: `${configManager.config.tinaioConfig?.contentApiUrlOverride || "https://content.tinajs.io"}/searchIndex/${configManager.config?.clientId}`,
|
|
3038
3114
|
branch: configManager.config?.branch,
|
|
3039
3115
|
indexerToken: configManager.config?.search?.tina?.indexerToken,
|
|
@@ -3042,9 +3118,9 @@ ${dangerText(e.message)}
|
|
|
3042
3118
|
} else {
|
|
3043
3119
|
client = configManager.config?.search?.searchClient;
|
|
3044
3120
|
}
|
|
3045
|
-
const searchIndexer = new
|
|
3121
|
+
const searchIndexer = new SearchIndexer2({
|
|
3046
3122
|
batchSize: configManager.config.search?.indexBatchSize || 100,
|
|
3047
|
-
bridge: new
|
|
3123
|
+
bridge: new FilesystemBridge3(
|
|
3048
3124
|
configManager.rootPath,
|
|
3049
3125
|
configManager.contentRootPath
|
|
3050
3126
|
),
|
|
@@ -3114,8 +3190,8 @@ ${dangerText(e.message)}
|
|
|
3114
3190
|
const MAX_RETRIES = 5;
|
|
3115
3191
|
const { config: config2 } = configManager;
|
|
3116
3192
|
const token = config2.token;
|
|
3117
|
-
const { clientId, branch, host } = (
|
|
3118
|
-
const bar2 = new
|
|
3193
|
+
const { clientId, branch, host } = parseURL2(apiURL);
|
|
3194
|
+
const bar2 = new Progress2("Checking clientId and token. :prog", 1);
|
|
3119
3195
|
const getBranchInfo = async () => {
|
|
3120
3196
|
const url = `https://${host}/db/${clientId}/status/${previewBaseBranch || branch}`;
|
|
3121
3197
|
const branchInfo2 = {
|
|
@@ -3169,7 +3245,7 @@ ${dangerText(e.message)}
|
|
|
3169
3245
|
bar2.tick({
|
|
3170
3246
|
prog: "\u2705"
|
|
3171
3247
|
});
|
|
3172
|
-
const branchBar = new
|
|
3248
|
+
const branchBar = new Progress2(
|
|
3173
3249
|
`Checking branch '${config2.branch}' is on TinaCloud. :prog`,
|
|
3174
3250
|
1
|
|
3175
3251
|
);
|
|
@@ -3209,7 +3285,7 @@ ${dangerText(e.message)}
|
|
|
3209
3285
|
async syncProject(configManager, apiURL, options) {
|
|
3210
3286
|
const { config: config2 } = configManager;
|
|
3211
3287
|
const token = config2.token;
|
|
3212
|
-
const { clientId, branch, host } = (
|
|
3288
|
+
const { clientId, branch, host } = parseURL2(apiURL);
|
|
3213
3289
|
const { previewName, previewBaseBranch, upstreamBranch } = options || {};
|
|
3214
3290
|
let url = `https://${host}/db/${clientId}/reset/${branch}?refreshSchema=true&skipIfSchemaCurrent=true`;
|
|
3215
3291
|
if (upstreamBranch && previewBaseBranch && previewName) {
|
|
@@ -3219,7 +3295,7 @@ ${dangerText(e.message)}
|
|
|
3219
3295
|
} else if (upstreamBranch && !previewBaseBranch && !previewName) {
|
|
3220
3296
|
url = `https://${host}/db/${clientId}/reset/${branch}?refreshSchema=true&skipIfSchemaCurrent=true&upstreamBranch=${upstreamBranch}`;
|
|
3221
3297
|
}
|
|
3222
|
-
const bar2 = new
|
|
3298
|
+
const bar2 = new Progress2("Syncing Project. :prog", 1);
|
|
3223
3299
|
try {
|
|
3224
3300
|
const res = await request({
|
|
3225
3301
|
token,
|
|
@@ -3260,7 +3336,7 @@ ${dangerText(e.message)}
|
|
|
3260
3336
|
}
|
|
3261
3337
|
}
|
|
3262
3338
|
async checkGraphqlSchema(configManager, database, apiURL, timestamp) {
|
|
3263
|
-
const bar2 = new
|
|
3339
|
+
const bar2 = new Progress2(
|
|
3264
3340
|
"Checking local GraphQL Schema matches server. :prog",
|
|
3265
3341
|
1
|
|
3266
3342
|
);
|
|
@@ -3282,11 +3358,11 @@ Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
|
3282
3358
|
}
|
|
3283
3359
|
throw new Error(errorMessage);
|
|
3284
3360
|
}
|
|
3285
|
-
const remoteGqlSchema =
|
|
3361
|
+
const remoteGqlSchema = buildClientSchema(remoteSchema);
|
|
3286
3362
|
const localSchemaDocument = await database.getGraphQLSchemaFromBridge();
|
|
3287
|
-
const localGraphqlSchema = (
|
|
3363
|
+
const localGraphqlSchema = buildASTSchema2(localSchemaDocument);
|
|
3288
3364
|
try {
|
|
3289
|
-
const diffResult = await
|
|
3365
|
+
const diffResult = await diff(remoteGqlSchema, localGraphqlSchema);
|
|
3290
3366
|
if (diffResult.length === 0) {
|
|
3291
3367
|
bar2.tick({
|
|
3292
3368
|
prog: "\u2705"
|
|
@@ -3334,13 +3410,13 @@ Additional info:
|
|
|
3334
3410
|
}
|
|
3335
3411
|
}
|
|
3336
3412
|
async checkTinaSchema(configManager, database, apiURL, previewName, verbose, timestamp) {
|
|
3337
|
-
const bar2 = new
|
|
3413
|
+
const bar2 = new Progress2(
|
|
3338
3414
|
"Checking local Tina Schema matches server. :prog",
|
|
3339
3415
|
1
|
|
3340
3416
|
);
|
|
3341
3417
|
const { config: config2 } = configManager;
|
|
3342
3418
|
const token = config2.token;
|
|
3343
|
-
const { clientId, branch, isLocalClient, host } = (
|
|
3419
|
+
const { clientId, branch, isLocalClient, host } = parseURL2(apiURL);
|
|
3344
3420
|
if (isLocalClient || !host || !clientId || !branch) {
|
|
3345
3421
|
if (verbose) {
|
|
3346
3422
|
logger.info(logText("Not using TinaCloud, skipping Tina Schema check"));
|
|
@@ -3368,11 +3444,11 @@ Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
|
3368
3444
|
}
|
|
3369
3445
|
const localTinaSchema = JSON.parse(
|
|
3370
3446
|
await database.bridge.get(
|
|
3371
|
-
|
|
3447
|
+
path9.join(database.tinaDirectory, "__generated__", "_schema.json")
|
|
3372
3448
|
)
|
|
3373
3449
|
);
|
|
3374
3450
|
localTinaSchema.version = void 0;
|
|
3375
|
-
const localTinaSchemaSha =
|
|
3451
|
+
const localTinaSchemaSha = crypto.createHash("sha256").update(JSON.stringify(localTinaSchema)).digest("hex");
|
|
3376
3452
|
if (localTinaSchemaSha === remoteTinaSchemaSha) {
|
|
3377
3453
|
bar2.tick({
|
|
3378
3454
|
prog: "\u2705"
|
|
@@ -3423,12 +3499,12 @@ async function request(args) {
|
|
|
3423
3499
|
Message from server: ${json.message}`;
|
|
3424
3500
|
}
|
|
3425
3501
|
throw new Error(
|
|
3426
|
-
`Server responded with status code ${res.status}, ${res.statusText}. ${additionalInfo ? additionalInfo : ""} Please see our FAQ for more information: https://tina.io/docs/
|
|
3502
|
+
`Server responded with status code ${res.status}, ${res.statusText}. ${additionalInfo ? additionalInfo : ""} Please see our FAQ for more information: https://tina.io/docs/r/FAQ/`
|
|
3427
3503
|
);
|
|
3428
3504
|
}
|
|
3429
3505
|
if (json.errors) {
|
|
3430
3506
|
throw new Error(
|
|
3431
|
-
`Unable to fetch, please see our FAQ for more information: https://tina.io/docs/
|
|
3507
|
+
`Unable to fetch, please see our FAQ for more information: https://tina.io/docs/r/FAQ/
|
|
3432
3508
|
|
|
3433
3509
|
Errors:
|
|
3434
3510
|
${json.errors.map((error) => error.message).join("\n")}`
|
|
@@ -3450,7 +3526,7 @@ var fetchRemoteGraphqlSchema = async ({
|
|
|
3450
3526
|
headers.append("X-API-KEY", token);
|
|
3451
3527
|
}
|
|
3452
3528
|
const body = JSON.stringify({
|
|
3453
|
-
query:
|
|
3529
|
+
query: getIntrospectionQuery(),
|
|
3454
3530
|
variables: {}
|
|
3455
3531
|
});
|
|
3456
3532
|
headers.append("Content-Type", "application/json");
|
|
@@ -3483,14 +3559,14 @@ var fetchSchemaSha = async ({
|
|
|
3483
3559
|
};
|
|
3484
3560
|
|
|
3485
3561
|
// src/next/commands/audit-command/index.ts
|
|
3486
|
-
|
|
3487
|
-
|
|
3562
|
+
import { Command as Command4, Option as Option4 } from "clipanion";
|
|
3563
|
+
import { buildSchema as buildSchema3 } from "@tinacms/graphql";
|
|
3488
3564
|
|
|
3489
3565
|
// src/next/commands/audit-command/audit.ts
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3566
|
+
import prompts from "prompts";
|
|
3567
|
+
import { Telemetry } from "@tinacms/metrics";
|
|
3568
|
+
import { resolve } from "@tinacms/graphql";
|
|
3569
|
+
import chalk5 from "chalk";
|
|
3494
3570
|
var audit = async ({
|
|
3495
3571
|
database,
|
|
3496
3572
|
clean,
|
|
@@ -3498,7 +3574,7 @@ var audit = async ({
|
|
|
3498
3574
|
noTelemetry,
|
|
3499
3575
|
verbose
|
|
3500
3576
|
}) => {
|
|
3501
|
-
const telemetry = new
|
|
3577
|
+
const telemetry = new Telemetry({ disabled: noTelemetry });
|
|
3502
3578
|
await telemetry.submitRecord({
|
|
3503
3579
|
event: {
|
|
3504
3580
|
name: "tinacms:cli:audit:invoke",
|
|
@@ -3508,25 +3584,25 @@ var audit = async ({
|
|
|
3508
3584
|
});
|
|
3509
3585
|
if (clean) {
|
|
3510
3586
|
logger.info(
|
|
3511
|
-
`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 ${
|
|
3587
|
+
`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(
|
|
3512
3588
|
"clean git tree"
|
|
3513
3589
|
)} so unwanted changes can be undone.
|
|
3514
3590
|
|
|
3515
3591
|
`
|
|
3516
3592
|
);
|
|
3517
|
-
const res = await (
|
|
3593
|
+
const res = await prompts({
|
|
3518
3594
|
name: "useClean",
|
|
3519
3595
|
type: "confirm",
|
|
3520
3596
|
message: `Do you want to continue?`
|
|
3521
3597
|
});
|
|
3522
3598
|
if (!res.useClean) {
|
|
3523
|
-
logger.warn(
|
|
3599
|
+
logger.warn(chalk5.yellowBright("\u26A0\uFE0F Audit not complete"));
|
|
3524
3600
|
process.exit(0);
|
|
3525
3601
|
}
|
|
3526
3602
|
}
|
|
3527
3603
|
if (useDefaultValues && !clean) {
|
|
3528
3604
|
logger.warn(
|
|
3529
|
-
|
|
3605
|
+
chalk5.yellowBright(
|
|
3530
3606
|
"WARNING: using the `--useDefaultValues` without the `--clean` flag has no effect. Please re-run audit and add the `--clean` flag"
|
|
3531
3607
|
)
|
|
3532
3608
|
);
|
|
@@ -3554,10 +3630,10 @@ var audit = async ({
|
|
|
3554
3630
|
}
|
|
3555
3631
|
if (error) {
|
|
3556
3632
|
logger.error(
|
|
3557
|
-
|
|
3633
|
+
chalk5.redBright(`\u203C\uFE0F Audit ${chalk5.bold("failed")} with errors`)
|
|
3558
3634
|
);
|
|
3559
3635
|
} else {
|
|
3560
|
-
logger.info(
|
|
3636
|
+
logger.info(chalk5.greenBright("\u2705 Audit passed"));
|
|
3561
3637
|
}
|
|
3562
3638
|
};
|
|
3563
3639
|
var auditDocuments = async (args) => {
|
|
@@ -3574,7 +3650,7 @@ var auditDocuments = async (args) => {
|
|
|
3574
3650
|
}
|
|
3575
3651
|
}
|
|
3576
3652
|
}`;
|
|
3577
|
-
const docResult = await
|
|
3653
|
+
const docResult = await resolve({
|
|
3578
3654
|
database,
|
|
3579
3655
|
query: documentQuery,
|
|
3580
3656
|
variables: {},
|
|
@@ -3585,11 +3661,11 @@ var auditDocuments = async (args) => {
|
|
|
3585
3661
|
if (docResult.errors) {
|
|
3586
3662
|
error = true;
|
|
3587
3663
|
docResult.errors.forEach((err) => {
|
|
3588
|
-
logger.error(
|
|
3664
|
+
logger.error(chalk5.red(err.message));
|
|
3589
3665
|
if (err.originalError.originalError) {
|
|
3590
3666
|
logger.error(
|
|
3591
3667
|
// @ts-ignore FIXME: this doesn't seem right
|
|
3592
|
-
|
|
3668
|
+
chalk5.red(` ${err.originalError.originalError.message}`)
|
|
3593
3669
|
);
|
|
3594
3670
|
}
|
|
3595
3671
|
});
|
|
@@ -3616,7 +3692,7 @@ var auditDocuments = async (args) => {
|
|
|
3616
3692
|
params: $params
|
|
3617
3693
|
){__typename}
|
|
3618
3694
|
}`;
|
|
3619
|
-
const mutationRes = await
|
|
3695
|
+
const mutationRes = await resolve({
|
|
3620
3696
|
database,
|
|
3621
3697
|
query: mutation,
|
|
3622
3698
|
variables: {
|
|
@@ -3631,7 +3707,7 @@ var auditDocuments = async (args) => {
|
|
|
3631
3707
|
if (mutationRes.errors) {
|
|
3632
3708
|
mutationRes.errors.forEach((err) => {
|
|
3633
3709
|
error = true;
|
|
3634
|
-
logger.error(
|
|
3710
|
+
logger.error(chalk5.red(err.message));
|
|
3635
3711
|
});
|
|
3636
3712
|
}
|
|
3637
3713
|
}
|
|
@@ -3648,38 +3724,31 @@ function filterObject(obj) {
|
|
|
3648
3724
|
}
|
|
3649
3725
|
|
|
3650
3726
|
// src/next/commands/audit-command/index.ts
|
|
3651
|
-
|
|
3652
|
-
var AuditCommand = class extends
|
|
3653
|
-
|
|
3654
|
-
|
|
3655
|
-
|
|
3656
|
-
|
|
3657
|
-
|
|
3658
|
-
|
|
3659
|
-
|
|
3660
|
-
|
|
3661
|
-
|
|
3662
|
-
|
|
3663
|
-
|
|
3664
|
-
|
|
3665
|
-
|
|
3666
|
-
|
|
3667
|
-
|
|
3668
|
-
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3676
|
-
}
|
|
3677
|
-
static {
|
|
3678
|
-
this.usage = import_clipanion4.Command.Usage({
|
|
3679
|
-
category: `Commands`,
|
|
3680
|
-
description: `Audit config and content files`
|
|
3681
|
-
});
|
|
3682
|
-
}
|
|
3727
|
+
import { AuditFileSystemBridge } from "@tinacms/graphql";
|
|
3728
|
+
var AuditCommand = class extends Command4 {
|
|
3729
|
+
static paths = [["audit"]];
|
|
3730
|
+
rootPath = Option4.String("--rootPath", {
|
|
3731
|
+
description: "Specify the root directory to run the CLI from"
|
|
3732
|
+
});
|
|
3733
|
+
verbose = Option4.Boolean("-v,--verbose", false, {
|
|
3734
|
+
description: "increase verbosity of logged output"
|
|
3735
|
+
});
|
|
3736
|
+
clean = Option4.Boolean("--clean", false, {
|
|
3737
|
+
description: "Clean the output"
|
|
3738
|
+
});
|
|
3739
|
+
useDefaultValues = Option4.Boolean("--useDefaultValues", false, {
|
|
3740
|
+
description: "When cleaning the output, use defaults on the config"
|
|
3741
|
+
});
|
|
3742
|
+
noTelemetry = Option4.Boolean("--noTelemetry", false, {
|
|
3743
|
+
description: "Disable anonymous telemetry that is collected"
|
|
3744
|
+
});
|
|
3745
|
+
datalayerPort = Option4.String("--datalayer-port", "9000", {
|
|
3746
|
+
description: "Specify a port to run the datalayer server on. (default 9000)"
|
|
3747
|
+
});
|
|
3748
|
+
static usage = Command4.Usage({
|
|
3749
|
+
category: `Commands`,
|
|
3750
|
+
description: `Audit config and content files`
|
|
3751
|
+
});
|
|
3683
3752
|
async catch(error) {
|
|
3684
3753
|
logger.error("Error occured during tinacms audit");
|
|
3685
3754
|
if (this.verbose) {
|
|
@@ -3700,9 +3769,9 @@ var AuditCommand = class extends import_clipanion4.Command {
|
|
|
3700
3769
|
const database = await createAndInitializeDatabase(
|
|
3701
3770
|
configManager,
|
|
3702
3771
|
Number(this.datalayerPort),
|
|
3703
|
-
this.clean ? void 0 : new
|
|
3772
|
+
this.clean ? void 0 : new AuditFileSystemBridge(configManager.rootPath)
|
|
3704
3773
|
);
|
|
3705
|
-
const { tinaSchema, graphQLSchema, lookup } = await (
|
|
3774
|
+
const { tinaSchema, graphQLSchema, lookup } = await buildSchema3(
|
|
3706
3775
|
configManager.config
|
|
3707
3776
|
);
|
|
3708
3777
|
const warnings = [];
|
|
@@ -3735,29 +3804,29 @@ var AuditCommand = class extends import_clipanion4.Command {
|
|
|
3735
3804
|
};
|
|
3736
3805
|
|
|
3737
3806
|
// src/next/commands/init-command/index.ts
|
|
3738
|
-
|
|
3807
|
+
import { Command as Command6, Option as Option6 } from "clipanion";
|
|
3739
3808
|
|
|
3740
3809
|
// src/cmds/init/detectEnvironment.ts
|
|
3741
|
-
|
|
3742
|
-
|
|
3810
|
+
import fs9 from "fs-extra";
|
|
3811
|
+
import path10 from "path";
|
|
3743
3812
|
var checkGitignoreForItem = async ({
|
|
3744
3813
|
baseDir,
|
|
3745
3814
|
line
|
|
3746
3815
|
}) => {
|
|
3747
|
-
const gitignoreContent =
|
|
3816
|
+
const gitignoreContent = fs9.readFileSync(path10.join(baseDir, ".gitignore")).toString();
|
|
3748
3817
|
return gitignoreContent.split("\n").some((item) => item === line);
|
|
3749
3818
|
};
|
|
3750
3819
|
var makeGeneratedFile = async (name2, generatedFileType, parentPath, opts) => {
|
|
3751
3820
|
const result = {
|
|
3752
|
-
fullPathTS:
|
|
3821
|
+
fullPathTS: path10.join(
|
|
3753
3822
|
parentPath,
|
|
3754
3823
|
`${name2}.${opts?.typescriptSuffix || opts?.extensionOverride || "ts"}`
|
|
3755
3824
|
),
|
|
3756
|
-
fullPathJS:
|
|
3825
|
+
fullPathJS: path10.join(
|
|
3757
3826
|
parentPath,
|
|
3758
3827
|
`${name2}.${opts?.extensionOverride || "js"}`
|
|
3759
3828
|
),
|
|
3760
|
-
fullPathOverride: opts?.extensionOverride ?
|
|
3829
|
+
fullPathOverride: opts?.extensionOverride ? path10.join(parentPath, `${name2}.${opts?.extensionOverride}`) : "",
|
|
3761
3830
|
generatedFileType,
|
|
3762
3831
|
name: name2,
|
|
3763
3832
|
parentPath,
|
|
@@ -3775,8 +3844,8 @@ var makeGeneratedFile = async (name2, generatedFileType, parentPath, opts) => {
|
|
|
3775
3844
|
};
|
|
3776
3845
|
}
|
|
3777
3846
|
};
|
|
3778
|
-
result.typescriptExists = await
|
|
3779
|
-
result.javascriptExists = await
|
|
3847
|
+
result.typescriptExists = await fs9.pathExists(result.fullPathTS);
|
|
3848
|
+
result.javascriptExists = await fs9.pathExists(result.fullPathJS);
|
|
3780
3849
|
return result;
|
|
3781
3850
|
};
|
|
3782
3851
|
var detectEnvironment = async ({
|
|
@@ -3785,21 +3854,21 @@ var detectEnvironment = async ({
|
|
|
3785
3854
|
rootPath,
|
|
3786
3855
|
debug = false
|
|
3787
3856
|
}) => {
|
|
3788
|
-
const hasForestryConfig = await
|
|
3789
|
-
|
|
3857
|
+
const hasForestryConfig = await fs9.pathExists(
|
|
3858
|
+
path10.join(pathToForestryConfig, ".forestry", "settings.yml")
|
|
3790
3859
|
);
|
|
3791
|
-
const sampleContentPath =
|
|
3860
|
+
const sampleContentPath = path10.join(
|
|
3792
3861
|
baseDir,
|
|
3793
3862
|
"content",
|
|
3794
3863
|
"posts",
|
|
3795
3864
|
"hello-world.md"
|
|
3796
3865
|
);
|
|
3797
|
-
const usingSrc =
|
|
3798
|
-
const tinaFolder =
|
|
3866
|
+
const usingSrc = fs9.pathExistsSync(path10.join(baseDir, "src")) && (fs9.pathExistsSync(path10.join(baseDir, "src", "app")) || fs9.pathExistsSync(path10.join(baseDir, "src", "pages")));
|
|
3867
|
+
const tinaFolder = path10.join(baseDir, "tina");
|
|
3799
3868
|
const tinaConfigExists = Boolean(
|
|
3800
3869
|
// Does the tina folder exist?
|
|
3801
|
-
await
|
|
3802
|
-
(await
|
|
3870
|
+
await fs9.pathExists(tinaFolder) && // Does the tina folder contain a config file?
|
|
3871
|
+
(await fs9.readdir(tinaFolder)).find((x) => x.includes("config"))
|
|
3803
3872
|
);
|
|
3804
3873
|
const pagesDir = [baseDir, usingSrc ? "src" : false, "pages"].filter(
|
|
3805
3874
|
Boolean
|
|
@@ -3811,12 +3880,12 @@ var detectEnvironment = async ({
|
|
|
3811
3880
|
"next-api-handler": await makeGeneratedFile(
|
|
3812
3881
|
"[...routes]",
|
|
3813
3882
|
"next-api-handler",
|
|
3814
|
-
|
|
3883
|
+
path10.join(...pagesDir, "api", "tina")
|
|
3815
3884
|
),
|
|
3816
3885
|
"reactive-example": await makeGeneratedFile(
|
|
3817
3886
|
"[filename]",
|
|
3818
3887
|
"reactive-example",
|
|
3819
|
-
|
|
3888
|
+
path10.join(...pagesDir, "demo", "blog"),
|
|
3820
3889
|
{
|
|
3821
3890
|
typescriptSuffix: "tsx"
|
|
3822
3891
|
}
|
|
@@ -3824,22 +3893,22 @@ var detectEnvironment = async ({
|
|
|
3824
3893
|
"users-json": await makeGeneratedFile(
|
|
3825
3894
|
"index",
|
|
3826
3895
|
"users-json",
|
|
3827
|
-
|
|
3896
|
+
path10.join(baseDir, "content", "users"),
|
|
3828
3897
|
{ extensionOverride: "json" }
|
|
3829
3898
|
),
|
|
3830
3899
|
"sample-content": await makeGeneratedFile(
|
|
3831
3900
|
"hello-world",
|
|
3832
3901
|
"sample-content",
|
|
3833
|
-
|
|
3902
|
+
path10.join(baseDir, "content", "posts"),
|
|
3834
3903
|
{ extensionOverride: "md" }
|
|
3835
3904
|
)
|
|
3836
3905
|
};
|
|
3837
|
-
const hasSampleContent = await
|
|
3838
|
-
const hasPackageJSON = await
|
|
3906
|
+
const hasSampleContent = await fs9.pathExists(sampleContentPath);
|
|
3907
|
+
const hasPackageJSON = await fs9.pathExists("package.json");
|
|
3839
3908
|
let hasTinaDeps = false;
|
|
3840
3909
|
if (hasPackageJSON) {
|
|
3841
3910
|
try {
|
|
3842
|
-
const packageJSON = await
|
|
3911
|
+
const packageJSON = await fs9.readJSON("package.json");
|
|
3843
3912
|
const deps = [];
|
|
3844
3913
|
if (packageJSON?.dependencies) {
|
|
3845
3914
|
deps.push(...Object.keys(packageJSON.dependencies));
|
|
@@ -3856,15 +3925,15 @@ var detectEnvironment = async ({
|
|
|
3856
3925
|
);
|
|
3857
3926
|
}
|
|
3858
3927
|
}
|
|
3859
|
-
const hasGitIgnore = await
|
|
3928
|
+
const hasGitIgnore = await fs9.pathExists(path10.join(".gitignore"));
|
|
3860
3929
|
const hasGitIgnoreNodeModules = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: "node_modules" });
|
|
3861
3930
|
const hasEnvTina = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: ".env.tina" });
|
|
3862
3931
|
const hasGitIgnoreEnv = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: ".env" });
|
|
3863
3932
|
let frontMatterFormat;
|
|
3864
3933
|
if (hasForestryConfig) {
|
|
3865
|
-
const hugoConfigPath =
|
|
3866
|
-
if (await
|
|
3867
|
-
const hugoConfig = await
|
|
3934
|
+
const hugoConfigPath = path10.join(rootPath, "config.toml");
|
|
3935
|
+
if (await fs9.pathExists(hugoConfigPath)) {
|
|
3936
|
+
const hugoConfig = await fs9.readFile(hugoConfigPath, "utf8");
|
|
3868
3937
|
const metaDataFormat = hugoConfig.toString().match(/metaDataFormat = "(.*)"/)?.[1];
|
|
3869
3938
|
if (metaDataFormat && (metaDataFormat === "yaml" || metaDataFormat === "toml" || metaDataFormat === "json")) {
|
|
3870
3939
|
frontMatterFormat = metaDataFormat;
|
|
@@ -3895,10 +3964,10 @@ var detectEnvironment = async ({
|
|
|
3895
3964
|
var detectEnvironment_default = detectEnvironment;
|
|
3896
3965
|
|
|
3897
3966
|
// src/cmds/init/prompts/index.ts
|
|
3898
|
-
|
|
3967
|
+
import prompts6 from "prompts";
|
|
3899
3968
|
|
|
3900
3969
|
// src/cmds/init/prompts/askTinaCloudSetup.ts
|
|
3901
|
-
|
|
3970
|
+
import prompts2 from "prompts";
|
|
3902
3971
|
var tinaCloudSetupQuestions = [
|
|
3903
3972
|
{
|
|
3904
3973
|
name: "clientId",
|
|
@@ -3920,7 +3989,7 @@ ${logText(
|
|
|
3920
3989
|
}
|
|
3921
3990
|
];
|
|
3922
3991
|
var askTinaCloudSetup = async ({ config: config2 }) => {
|
|
3923
|
-
const { clientId, token } = await (
|
|
3992
|
+
const { clientId, token } = await prompts2(tinaCloudSetupQuestions);
|
|
3924
3993
|
config2.envVars.push(
|
|
3925
3994
|
{
|
|
3926
3995
|
key: "NEXT_PUBLIC_TINA_CLIENT_ID",
|
|
@@ -3934,7 +4003,7 @@ var askTinaCloudSetup = async ({ config: config2 }) => {
|
|
|
3934
4003
|
};
|
|
3935
4004
|
|
|
3936
4005
|
// src/cmds/init/prompts/gitProvider.ts
|
|
3937
|
-
|
|
4006
|
+
import prompts3 from "prompts";
|
|
3938
4007
|
var supportedGitProviders = {
|
|
3939
4008
|
github: {
|
|
3940
4009
|
imports: [
|
|
@@ -3956,7 +4025,7 @@ var supportedGitProviders = {
|
|
|
3956
4025
|
}
|
|
3957
4026
|
};
|
|
3958
4027
|
var chooseGitProvider = async ({ config: config2 }) => {
|
|
3959
|
-
const result = await (
|
|
4028
|
+
const result = await prompts3([
|
|
3960
4029
|
{
|
|
3961
4030
|
name: "githubToken",
|
|
3962
4031
|
type: "text",
|
|
@@ -3964,7 +4033,7 @@ var chooseGitProvider = async ({ config: config2 }) => {
|
|
|
3964
4033
|
${logText(
|
|
3965
4034
|
"Learn more here: "
|
|
3966
4035
|
)}${linkText(
|
|
3967
|
-
"https://tina.io/docs/self-
|
|
4036
|
+
"https://tina.io/docs/r/self-hosting-nextjs/#github-personal-access-token"
|
|
3968
4037
|
)}`,
|
|
3969
4038
|
initial: process.env.GITHUB_PERSONAL_ACCESS_TOKEN
|
|
3970
4039
|
},
|
|
@@ -4001,7 +4070,7 @@ ${logText(
|
|
|
4001
4070
|
};
|
|
4002
4071
|
|
|
4003
4072
|
// src/cmds/init/prompts/databaseAdapter.ts
|
|
4004
|
-
|
|
4073
|
+
import prompts4 from "prompts";
|
|
4005
4074
|
var supportedDatabaseAdapters = {
|
|
4006
4075
|
["upstash-redis"]: {
|
|
4007
4076
|
databaseAdapterClassText: `new RedisLevel({
|
|
@@ -4047,7 +4116,7 @@ var databaseAdapterUpdateConfig = {
|
|
|
4047
4116
|
other: async (_args) => {
|
|
4048
4117
|
},
|
|
4049
4118
|
mongodb: async ({ config: config2 }) => {
|
|
4050
|
-
const result = await (
|
|
4119
|
+
const result = await prompts4([
|
|
4051
4120
|
{
|
|
4052
4121
|
name: "mongoDBUri",
|
|
4053
4122
|
type: "text",
|
|
@@ -4062,7 +4131,7 @@ var databaseAdapterUpdateConfig = {
|
|
|
4062
4131
|
});
|
|
4063
4132
|
},
|
|
4064
4133
|
"upstash-redis": async ({ config: config2 }) => {
|
|
4065
|
-
const result = await (
|
|
4134
|
+
const result = await prompts4([
|
|
4066
4135
|
{
|
|
4067
4136
|
name: "kvRestApiUrl",
|
|
4068
4137
|
type: "text",
|
|
@@ -4093,7 +4162,7 @@ var chooseDatabaseAdapter = async ({
|
|
|
4093
4162
|
framework,
|
|
4094
4163
|
config: config2
|
|
4095
4164
|
}) => {
|
|
4096
|
-
const answers = await (
|
|
4165
|
+
const answers = await prompts4([
|
|
4097
4166
|
{
|
|
4098
4167
|
name: "dataLayerAdapter",
|
|
4099
4168
|
message: "Select a self-hosted Database Adapter",
|
|
@@ -4123,8 +4192,8 @@ var chooseDatabaseAdapter = async ({
|
|
|
4123
4192
|
};
|
|
4124
4193
|
|
|
4125
4194
|
// src/cmds/init/prompts/authProvider.ts
|
|
4126
|
-
|
|
4127
|
-
|
|
4195
|
+
import crypto2 from "crypto-js";
|
|
4196
|
+
import prompts5 from "prompts";
|
|
4128
4197
|
var supportedAuthProviders = {
|
|
4129
4198
|
other: {
|
|
4130
4199
|
name: "other"
|
|
@@ -4173,12 +4242,12 @@ var authProviderUpdateConfig = {
|
|
|
4173
4242
|
},
|
|
4174
4243
|
"tina-cloud": askTinaCloudSetup,
|
|
4175
4244
|
"next-auth": async ({ config: config2 }) => {
|
|
4176
|
-
const result = await (
|
|
4245
|
+
const result = await prompts5([
|
|
4177
4246
|
{
|
|
4178
4247
|
name: "nextAuthSecret",
|
|
4179
4248
|
type: "text",
|
|
4180
4249
|
message: `What is the NextAuth.js Secret? (Hit enter to use a randomly generated secret)`,
|
|
4181
|
-
initial: process.env.NEXTAUTH_SECRET ||
|
|
4250
|
+
initial: process.env.NEXTAUTH_SECRET || crypto2.lib.WordArray.random(16).toString()
|
|
4182
4251
|
}
|
|
4183
4252
|
]);
|
|
4184
4253
|
config2.envVars.push({
|
|
@@ -4203,7 +4272,7 @@ var forestryDisclaimer = logText(
|
|
|
4203
4272
|
`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)`
|
|
4204
4273
|
);
|
|
4205
4274
|
var askCommonSetUp = async () => {
|
|
4206
|
-
const answers = await (
|
|
4275
|
+
const answers = await prompts6([
|
|
4207
4276
|
{
|
|
4208
4277
|
name: "framework",
|
|
4209
4278
|
type: "select",
|
|
@@ -4225,7 +4294,8 @@ var askCommonSetUp = async () => {
|
|
|
4225
4294
|
choices: [
|
|
4226
4295
|
{ title: "PNPM", value: "pnpm" },
|
|
4227
4296
|
{ title: "Yarn", value: "yarn" },
|
|
4228
|
-
{ title: "NPM", value: "npm" }
|
|
4297
|
+
{ title: "NPM", value: "npm" },
|
|
4298
|
+
{ title: "Bun", value: "bun" }
|
|
4229
4299
|
]
|
|
4230
4300
|
}
|
|
4231
4301
|
]);
|
|
@@ -4266,7 +4336,7 @@ ${forestryDisclaimer}`
|
|
|
4266
4336
|
message: `What format are you using in your frontmatter?`
|
|
4267
4337
|
});
|
|
4268
4338
|
}
|
|
4269
|
-
const answers = await (
|
|
4339
|
+
const answers = await prompts6(questions);
|
|
4270
4340
|
return answers;
|
|
4271
4341
|
};
|
|
4272
4342
|
var askTinaSetupPrompts = async (params) => {
|
|
@@ -4286,16 +4356,16 @@ var askTinaSetupPrompts = async (params) => {
|
|
|
4286
4356
|
message: `Where are public assets stored? (default: "public")
|
|
4287
4357
|
` + logText(
|
|
4288
4358
|
`Not sure what value to use? Refer to our "Frameworks" doc: ${linkText(
|
|
4289
|
-
"https://tina.io/docs/
|
|
4359
|
+
"https://tina.io/docs/r/framework-guides-overview"
|
|
4290
4360
|
)}`
|
|
4291
4361
|
)
|
|
4292
4362
|
});
|
|
4293
4363
|
}
|
|
4294
|
-
const answers = await (
|
|
4364
|
+
const answers = await prompts6(questions);
|
|
4295
4365
|
return answers;
|
|
4296
4366
|
};
|
|
4297
4367
|
var askIfUsingSelfHosted = async () => {
|
|
4298
|
-
const answers = await (
|
|
4368
|
+
const answers = await prompts6([
|
|
4299
4369
|
{
|
|
4300
4370
|
name: "hosting",
|
|
4301
4371
|
type: "select",
|
|
@@ -4328,20 +4398,20 @@ var makeImportString = (imports) => {
|
|
|
4328
4398
|
};
|
|
4329
4399
|
|
|
4330
4400
|
// src/cmds/init/prompts/generatedFiles.ts
|
|
4331
|
-
|
|
4401
|
+
import prompts7 from "prompts";
|
|
4332
4402
|
var askIfOverride = async ({
|
|
4333
4403
|
generatedFile,
|
|
4334
4404
|
usingTypescript
|
|
4335
4405
|
}) => {
|
|
4336
4406
|
if (usingTypescript) {
|
|
4337
|
-
const result = await (
|
|
4407
|
+
const result = await prompts7({
|
|
4338
4408
|
name: `override`,
|
|
4339
4409
|
type: "confirm",
|
|
4340
4410
|
message: `Found existing file at ${generatedFile.fullPathTS}. Would you like to overwrite?`
|
|
4341
4411
|
});
|
|
4342
4412
|
return Boolean(result.override);
|
|
4343
4413
|
} else {
|
|
4344
|
-
const result = await (
|
|
4414
|
+
const result = await prompts7({
|
|
4345
4415
|
name: `override`,
|
|
4346
4416
|
type: "confirm",
|
|
4347
4417
|
message: `Found existing file at ${generatedFile.fullPathJS}. Would you like to overwrite?`
|
|
@@ -4476,23 +4546,25 @@ var CLICommand = class {
|
|
|
4476
4546
|
};
|
|
4477
4547
|
|
|
4478
4548
|
// src/cmds/init/apply.ts
|
|
4479
|
-
|
|
4549
|
+
import path14 from "path";
|
|
4480
4550
|
|
|
4481
4551
|
// src/cmds/forestry-migrate/index.ts
|
|
4482
|
-
|
|
4483
|
-
|
|
4484
|
-
|
|
4485
|
-
|
|
4486
|
-
|
|
4552
|
+
import fs11 from "fs-extra";
|
|
4553
|
+
import path12 from "path";
|
|
4554
|
+
import yaml2 from "js-yaml";
|
|
4555
|
+
import pkg from "minimatch";
|
|
4556
|
+
import { parseFile, stringifyFile } from "@tinacms/graphql";
|
|
4557
|
+
import { CONTENT_FORMATS } from "@tinacms/schema-tools";
|
|
4487
4558
|
|
|
4488
4559
|
// src/cmds/forestry-migrate/util/index.ts
|
|
4489
|
-
|
|
4490
|
-
|
|
4491
|
-
|
|
4492
|
-
|
|
4560
|
+
import fs10 from "fs-extra";
|
|
4561
|
+
import path11 from "path";
|
|
4562
|
+
import yaml from "js-yaml";
|
|
4563
|
+
import z from "zod";
|
|
4493
4564
|
|
|
4494
4565
|
// src/cmds/forestry-migrate/util/errorSingleton.ts
|
|
4495
4566
|
var ErrorSingleton = class _ErrorSingleton {
|
|
4567
|
+
static instance;
|
|
4496
4568
|
/**
|
|
4497
4569
|
* The Singleton's constructor should always be private to prevent direct
|
|
4498
4570
|
* construction calls with the `new` operator.
|
|
@@ -4512,6 +4584,7 @@ var ErrorSingleton = class _ErrorSingleton {
|
|
|
4512
4584
|
}
|
|
4513
4585
|
return _ErrorSingleton.instance;
|
|
4514
4586
|
}
|
|
4587
|
+
collectionNameErrors;
|
|
4515
4588
|
addErrorName(error) {
|
|
4516
4589
|
this.collectionNameErrors.push(error);
|
|
4517
4590
|
}
|
|
@@ -4534,8 +4607,8 @@ var ErrorSingleton = class _ErrorSingleton {
|
|
|
4534
4607
|
};
|
|
4535
4608
|
|
|
4536
4609
|
// src/cmds/forestry-migrate/util/codeTransformer.ts
|
|
4537
|
-
|
|
4538
|
-
|
|
4610
|
+
import { format } from "prettier";
|
|
4611
|
+
import TsParser from "prettier/parser-typescript.js";
|
|
4539
4612
|
var addVariablesToCode = (codeWithTinaPrefix) => {
|
|
4540
4613
|
const code = codeWithTinaPrefix.replace(
|
|
4541
4614
|
/"__TINA_INTERNAL__:::(.*?):::"/g,
|
|
@@ -4572,7 +4645,7 @@ var makeTemplateFile = async ({
|
|
|
4572
4645
|
`export function ${stringifyLabelWithField(
|
|
4573
4646
|
template.templateObj.label
|
|
4574
4647
|
)} (){
|
|
4575
|
-
return ${addVariablesToCode(JSON.stringify(template.fields, null, 2)).code} ${usingTypescript ? "as TinaField[]" : ""}
|
|
4648
|
+
return ${addVariablesToCode(JSON.stringify(template.fields, null, 2)).code} ${usingTypescript ? "as TinaField[]" : ""}
|
|
4576
4649
|
} `
|
|
4577
4650
|
);
|
|
4578
4651
|
}
|
|
@@ -4580,9 +4653,9 @@ var makeTemplateFile = async ({
|
|
|
4580
4653
|
${usingTypescript ? "import type { TinaField } from 'tinacms'" : ""}
|
|
4581
4654
|
${templateCodeText.join("\n")}
|
|
4582
4655
|
`;
|
|
4583
|
-
const formattedCode =
|
|
4656
|
+
const formattedCode = format(templateCode, {
|
|
4584
4657
|
parser: "typescript",
|
|
4585
|
-
plugins: [
|
|
4658
|
+
plugins: [TsParser]
|
|
4586
4659
|
});
|
|
4587
4660
|
return { importStatements, templateCodeText: formattedCode };
|
|
4588
4661
|
};
|
|
@@ -4614,82 +4687,82 @@ var stringifyTemplateName = (name2, template) => {
|
|
|
4614
4687
|
return newName;
|
|
4615
4688
|
}
|
|
4616
4689
|
};
|
|
4617
|
-
var forestryConfigSchema =
|
|
4618
|
-
sections:
|
|
4619
|
-
|
|
4620
|
-
type:
|
|
4621
|
-
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
|
|
4690
|
+
var forestryConfigSchema = z.object({
|
|
4691
|
+
sections: z.array(
|
|
4692
|
+
z.object({
|
|
4693
|
+
type: z.union([
|
|
4694
|
+
z.literal("directory"),
|
|
4695
|
+
z.literal("document"),
|
|
4696
|
+
z.literal("heading"),
|
|
4697
|
+
z.literal("jekyll-pages"),
|
|
4698
|
+
z.literal("jekyll-posts")
|
|
4626
4699
|
]),
|
|
4627
|
-
label:
|
|
4628
|
-
path:
|
|
4629
|
-
match:
|
|
4630
|
-
exclude:
|
|
4631
|
-
create:
|
|
4632
|
-
templates:
|
|
4633
|
-
new_doc_ext:
|
|
4634
|
-
read_only:
|
|
4700
|
+
label: z.string(),
|
|
4701
|
+
path: z.string().optional().nullable(),
|
|
4702
|
+
match: z.string().optional().nullable(),
|
|
4703
|
+
exclude: z.string().optional().nullable(),
|
|
4704
|
+
create: z.union([z.literal("all"), z.literal("documents"), z.literal("none")]).optional(),
|
|
4705
|
+
templates: z.array(z.string()).optional().nullable(),
|
|
4706
|
+
new_doc_ext: z.string().optional().nullable(),
|
|
4707
|
+
read_only: z.boolean().optional().nullable()
|
|
4635
4708
|
})
|
|
4636
4709
|
)
|
|
4637
4710
|
});
|
|
4638
|
-
var forestryFieldWithoutField =
|
|
4711
|
+
var forestryFieldWithoutField = z.object({
|
|
4639
4712
|
// TODO: maybe better type this?
|
|
4640
|
-
type:
|
|
4641
|
-
|
|
4642
|
-
|
|
4643
|
-
|
|
4644
|
-
|
|
4645
|
-
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4649
|
-
|
|
4650
|
-
|
|
4651
|
-
|
|
4652
|
-
|
|
4653
|
-
|
|
4654
|
-
|
|
4655
|
-
|
|
4713
|
+
type: z.union([
|
|
4714
|
+
z.literal("text"),
|
|
4715
|
+
z.literal("datetime"),
|
|
4716
|
+
z.literal("list"),
|
|
4717
|
+
z.literal("file"),
|
|
4718
|
+
z.literal("image_gallery"),
|
|
4719
|
+
z.literal("textarea"),
|
|
4720
|
+
z.literal("tag_list"),
|
|
4721
|
+
z.literal("number"),
|
|
4722
|
+
z.literal("boolean"),
|
|
4723
|
+
z.literal("field_group"),
|
|
4724
|
+
z.literal("field_group_list"),
|
|
4725
|
+
z.literal("select"),
|
|
4726
|
+
z.literal("include"),
|
|
4727
|
+
z.literal("blocks"),
|
|
4728
|
+
z.literal("color")
|
|
4656
4729
|
]),
|
|
4657
|
-
template_types:
|
|
4658
|
-
name:
|
|
4659
|
-
label:
|
|
4660
|
-
default:
|
|
4661
|
-
template:
|
|
4662
|
-
config:
|
|
4730
|
+
template_types: z.array(z.string()).optional().nullable(),
|
|
4731
|
+
name: z.string(),
|
|
4732
|
+
label: z.string(),
|
|
4733
|
+
default: z.any().optional(),
|
|
4734
|
+
template: z.string().optional(),
|
|
4735
|
+
config: z.object({
|
|
4663
4736
|
// min and max are used for lists
|
|
4664
|
-
min:
|
|
4665
|
-
max:
|
|
4666
|
-
required:
|
|
4667
|
-
use_select:
|
|
4668
|
-
date_format:
|
|
4669
|
-
time_format:
|
|
4670
|
-
options:
|
|
4671
|
-
source:
|
|
4672
|
-
type:
|
|
4673
|
-
|
|
4674
|
-
|
|
4675
|
-
|
|
4676
|
-
|
|
4737
|
+
min: z.number().optional().nullable(),
|
|
4738
|
+
max: z.number().optional().nullable(),
|
|
4739
|
+
required: z.boolean().optional().nullable(),
|
|
4740
|
+
use_select: z.boolean().optional().nullable(),
|
|
4741
|
+
date_format: z.string().optional().nullable(),
|
|
4742
|
+
time_format: z.string().optional().nullable(),
|
|
4743
|
+
options: z.array(z.string()).optional().nullable(),
|
|
4744
|
+
source: z.object({
|
|
4745
|
+
type: z.union([
|
|
4746
|
+
z.literal("custom"),
|
|
4747
|
+
z.literal("pages"),
|
|
4748
|
+
z.literal("documents"),
|
|
4749
|
+
z.literal("simple"),
|
|
4677
4750
|
// TODO: I want to ignore this key if its invalid
|
|
4678
|
-
|
|
4751
|
+
z.string()
|
|
4679
4752
|
]).optional().nullable(),
|
|
4680
|
-
section:
|
|
4753
|
+
section: z.string().optional().nullable()
|
|
4681
4754
|
}).optional()
|
|
4682
4755
|
}).optional()
|
|
4683
4756
|
});
|
|
4684
|
-
var forestryField =
|
|
4757
|
+
var forestryField = z.lazy(
|
|
4685
4758
|
() => forestryFieldWithoutField.extend({
|
|
4686
|
-
fields:
|
|
4759
|
+
fields: z.array(forestryField).optional()
|
|
4687
4760
|
})
|
|
4688
4761
|
);
|
|
4689
|
-
var FrontmatterTemplateSchema =
|
|
4690
|
-
label:
|
|
4691
|
-
hide_body:
|
|
4692
|
-
fields:
|
|
4762
|
+
var FrontmatterTemplateSchema = z.object({
|
|
4763
|
+
label: z.string(),
|
|
4764
|
+
hide_body: z.boolean().optional(),
|
|
4765
|
+
fields: z.array(forestryField).optional()
|
|
4693
4766
|
});
|
|
4694
4767
|
var transformForestryFieldsToTinaFields = ({
|
|
4695
4768
|
fields,
|
|
@@ -4912,7 +4985,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4912
4985
|
return tinaFields;
|
|
4913
4986
|
};
|
|
4914
4987
|
var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false }) => {
|
|
4915
|
-
const templatePath =
|
|
4988
|
+
const templatePath = path11.join(
|
|
4916
4989
|
pathToForestryConfig,
|
|
4917
4990
|
".forestry",
|
|
4918
4991
|
"front_matter",
|
|
@@ -4921,7 +4994,7 @@ var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false })
|
|
|
4921
4994
|
);
|
|
4922
4995
|
let templateString = "";
|
|
4923
4996
|
try {
|
|
4924
|
-
templateString =
|
|
4997
|
+
templateString = fs10.readFileSync(templatePath).toString();
|
|
4925
4998
|
} catch {
|
|
4926
4999
|
throw new Error(
|
|
4927
5000
|
`Could not find template ${tem} at ${templatePath}
|
|
@@ -4929,7 +5002,7 @@ var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false })
|
|
|
4929
5002
|
This will require manual migration.`
|
|
4930
5003
|
);
|
|
4931
5004
|
}
|
|
4932
|
-
const templateObj =
|
|
5005
|
+
const templateObj = yaml.load(templateString);
|
|
4933
5006
|
const template = parseTemplates({ val: templateObj });
|
|
4934
5007
|
const fields = transformForestryFieldsToTinaFields({
|
|
4935
5008
|
fields: template.fields,
|
|
@@ -4949,6 +5022,7 @@ var parseSections = ({ val }) => {
|
|
|
4949
5022
|
};
|
|
4950
5023
|
|
|
4951
5024
|
// src/cmds/forestry-migrate/index.ts
|
|
5025
|
+
var { minimatch } = pkg;
|
|
4952
5026
|
var BODY_FIELD = {
|
|
4953
5027
|
// This is the body field
|
|
4954
5028
|
type: "rich-text",
|
|
@@ -4977,7 +5051,7 @@ var transformForestryMatchToTinaMatch = (match) => {
|
|
|
4977
5051
|
};
|
|
4978
5052
|
function checkExt(ext) {
|
|
4979
5053
|
const extReal = ext.replace(".", "");
|
|
4980
|
-
if (
|
|
5054
|
+
if (CONTENT_FORMATS.includes(extReal)) {
|
|
4981
5055
|
return extReal;
|
|
4982
5056
|
} else {
|
|
4983
5057
|
return false;
|
|
@@ -4986,9 +5060,9 @@ function checkExt(ext) {
|
|
|
4986
5060
|
var generateAllTemplates = async ({
|
|
4987
5061
|
pathToForestryConfig
|
|
4988
5062
|
}) => {
|
|
4989
|
-
const allTemplates = (await
|
|
4990
|
-
|
|
4991
|
-
)).map((tem) =>
|
|
5063
|
+
const allTemplates = (await fs11.readdir(
|
|
5064
|
+
path12.join(pathToForestryConfig, ".forestry", "front_matter", "templates")
|
|
5065
|
+
)).map((tem) => path12.basename(tem, ".yml"));
|
|
4992
5066
|
const templateMap = /* @__PURE__ */ new Map();
|
|
4993
5067
|
const proms = allTemplates.map(async (tem) => {
|
|
4994
5068
|
try {
|
|
@@ -5063,7 +5137,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5063
5137
|
glob = section.path + "/" + section.match;
|
|
5064
5138
|
}
|
|
5065
5139
|
if (pages.some((page) => {
|
|
5066
|
-
return (
|
|
5140
|
+
return minimatch(page, glob);
|
|
5067
5141
|
})) {
|
|
5068
5142
|
forestryTemplates.push(templateKey);
|
|
5069
5143
|
}
|
|
@@ -5133,9 +5207,9 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5133
5207
|
return c;
|
|
5134
5208
|
} else if (section.type === "document") {
|
|
5135
5209
|
const filePath = section.path;
|
|
5136
|
-
const extname =
|
|
5137
|
-
const fileName =
|
|
5138
|
-
const dir =
|
|
5210
|
+
const extname = path12.extname(filePath);
|
|
5211
|
+
const fileName = path12.basename(filePath, extname);
|
|
5212
|
+
const dir = path12.dirname(filePath);
|
|
5139
5213
|
const ext = checkExt(extname);
|
|
5140
5214
|
if (ext) {
|
|
5141
5215
|
const fields = [];
|
|
@@ -5155,7 +5229,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5155
5229
|
name: "dummy",
|
|
5156
5230
|
label: "Dummy field",
|
|
5157
5231
|
type: "string",
|
|
5158
|
-
description: "This is a dummy field, please replace it with the fields you want to edit. See https://tina.io/docs/
|
|
5232
|
+
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"
|
|
5159
5233
|
});
|
|
5160
5234
|
logger.warn(
|
|
5161
5235
|
warnText(
|
|
@@ -5197,8 +5271,8 @@ var generateCollections = async ({
|
|
|
5197
5271
|
templateMap,
|
|
5198
5272
|
usingTypescript
|
|
5199
5273
|
});
|
|
5200
|
-
const forestryConfig = await
|
|
5201
|
-
|
|
5274
|
+
const forestryConfig = await fs11.readFile(
|
|
5275
|
+
path12.join(pathToForestryConfig, ".forestry", "settings.yml")
|
|
5202
5276
|
);
|
|
5203
5277
|
rewriteTemplateKeysInDocs({
|
|
5204
5278
|
templateMap,
|
|
@@ -5208,7 +5282,7 @@ var generateCollections = async ({
|
|
|
5208
5282
|
}
|
|
5209
5283
|
});
|
|
5210
5284
|
const collections = parseSections({
|
|
5211
|
-
val:
|
|
5285
|
+
val: yaml2.load(forestryConfig.toString())
|
|
5212
5286
|
}).sections.map(
|
|
5213
5287
|
(section) => generateCollectionFromForestrySection({
|
|
5214
5288
|
section,
|
|
@@ -5228,13 +5302,13 @@ var rewriteTemplateKeysInDocs = (args) => {
|
|
|
5228
5302
|
const { templateObj } = templateMap.get(templateKey);
|
|
5229
5303
|
templateObj?.pages?.forEach((page) => {
|
|
5230
5304
|
try {
|
|
5231
|
-
const filePath =
|
|
5232
|
-
if (
|
|
5305
|
+
const filePath = path12.join(page);
|
|
5306
|
+
if (fs11.lstatSync(filePath).isDirectory()) {
|
|
5233
5307
|
return;
|
|
5234
5308
|
}
|
|
5235
|
-
const extname =
|
|
5236
|
-
const fileContent =
|
|
5237
|
-
const content =
|
|
5309
|
+
const extname = path12.extname(filePath);
|
|
5310
|
+
const fileContent = fs11.readFileSync(filePath).toString();
|
|
5311
|
+
const content = parseFile(
|
|
5238
5312
|
fileContent,
|
|
5239
5313
|
extname,
|
|
5240
5314
|
(yup) => yup.object({}),
|
|
@@ -5244,9 +5318,9 @@ var rewriteTemplateKeysInDocs = (args) => {
|
|
|
5244
5318
|
_template: stringifyLabel(templateKey),
|
|
5245
5319
|
...content
|
|
5246
5320
|
};
|
|
5247
|
-
|
|
5321
|
+
fs11.writeFileSync(
|
|
5248
5322
|
filePath,
|
|
5249
|
-
|
|
5323
|
+
stringifyFile(newContent, extname, true, markdownParseConfig)
|
|
5250
5324
|
);
|
|
5251
5325
|
} catch (error) {
|
|
5252
5326
|
console.log(
|
|
@@ -5258,32 +5332,25 @@ var rewriteTemplateKeysInDocs = (args) => {
|
|
|
5258
5332
|
};
|
|
5259
5333
|
|
|
5260
5334
|
// src/cmds/init/apply.ts
|
|
5261
|
-
|
|
5262
|
-
|
|
5335
|
+
import { Telemetry as Telemetry2 } from "@tinacms/metrics";
|
|
5336
|
+
import fs14 from "fs-extra";
|
|
5263
5337
|
|
|
5264
5338
|
// src/next/commands/codemod-command/index.ts
|
|
5265
|
-
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
var CodemodCommand = class extends
|
|
5269
|
-
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5273
|
-
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
|
|
5278
|
-
|
|
5279
|
-
|
|
5280
|
-
}
|
|
5281
|
-
static {
|
|
5282
|
-
this.usage = import_clipanion5.Command.Usage({
|
|
5283
|
-
category: `Commands`,
|
|
5284
|
-
description: `Use codemods for various Tina tasks`
|
|
5285
|
-
});
|
|
5286
|
-
}
|
|
5339
|
+
import { Command as Command5, Option as Option5 } from "clipanion";
|
|
5340
|
+
import fs12 from "fs-extra";
|
|
5341
|
+
import path13 from "path";
|
|
5342
|
+
var CodemodCommand = class extends Command5 {
|
|
5343
|
+
static paths = [["codemod"], ["codemod", "move-tina-folder"]];
|
|
5344
|
+
rootPath = Option5.String("--rootPath", {
|
|
5345
|
+
description: "Specify the root directory to run the CLI from"
|
|
5346
|
+
});
|
|
5347
|
+
verbose = Option5.Boolean("-v,--verbose", false, {
|
|
5348
|
+
description: "increase verbosity of logged output"
|
|
5349
|
+
});
|
|
5350
|
+
static usage = Command5.Usage({
|
|
5351
|
+
category: `Commands`,
|
|
5352
|
+
description: `Use codemods for various Tina tasks`
|
|
5353
|
+
});
|
|
5287
5354
|
async catch(error) {
|
|
5288
5355
|
console.log(error);
|
|
5289
5356
|
}
|
|
@@ -5312,13 +5379,13 @@ var moveTinaFolder = async (rootPath = process.cwd()) => {
|
|
|
5312
5379
|
logger.error(e.message);
|
|
5313
5380
|
process.exit(1);
|
|
5314
5381
|
}
|
|
5315
|
-
const tinaDestination =
|
|
5316
|
-
if (await
|
|
5382
|
+
const tinaDestination = path13.join(configManager.rootPath, "tina");
|
|
5383
|
+
if (await fs12.existsSync(tinaDestination)) {
|
|
5317
5384
|
logger.info(
|
|
5318
5385
|
`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.`
|
|
5319
5386
|
);
|
|
5320
5387
|
} else {
|
|
5321
|
-
await
|
|
5388
|
+
await fs12.moveSync(configManager.tinaFolderPath, tinaDestination);
|
|
5322
5389
|
await writeGitignore(configManager.rootPath);
|
|
5323
5390
|
logger.info(
|
|
5324
5391
|
"Move to 'tina' folder complete. Be sure to update any imports of the autogenerated client!"
|
|
@@ -5326,8 +5393,8 @@ var moveTinaFolder = async (rootPath = process.cwd()) => {
|
|
|
5326
5393
|
}
|
|
5327
5394
|
};
|
|
5328
5395
|
var writeGitignore = async (rootPath) => {
|
|
5329
|
-
await
|
|
5330
|
-
|
|
5396
|
+
await fs12.outputFileSync(
|
|
5397
|
+
path13.join(rootPath, "tina", ".gitignore"),
|
|
5331
5398
|
"__generated__"
|
|
5332
5399
|
);
|
|
5333
5400
|
};
|
|
@@ -5380,7 +5447,7 @@ const BlogPage = (props) => {
|
|
|
5380
5447
|
<div className='bg-green-100 text-center'>
|
|
5381
5448
|
Lost and looking for a place to start?
|
|
5382
5449
|
<a
|
|
5383
|
-
href='https://tina.io/
|
|
5450
|
+
href='https://tina.io/docs/r/beginner-series'
|
|
5384
5451
|
className='text-blue-500 underline'
|
|
5385
5452
|
>
|
|
5386
5453
|
{' '}
|
|
@@ -5662,7 +5729,7 @@ import { LocalAuthProvider } from "tinacms";`;
|
|
|
5662
5729
|
publicFolder: "${args.publicFolder}",
|
|
5663
5730
|
},
|
|
5664
5731
|
},
|
|
5665
|
-
// See docs on content modeling for more info on how to setup new content models: https://tina.io/docs/
|
|
5732
|
+
// See docs on content modeling for more info on how to setup new content models: https://tina.io/docs/r/content-modelling-collections/
|
|
5666
5733
|
schema: {
|
|
5667
5734
|
collections: ${generateCollectionString(args)},
|
|
5668
5735
|
},
|
|
@@ -5735,7 +5802,7 @@ Suspendisse facilisis, mi ac scelerisque interdum, ligula ex imperdiet felis, a
|
|
|
5735
5802
|
`;
|
|
5736
5803
|
|
|
5737
5804
|
// src/cmds/init/apply.ts
|
|
5738
|
-
|
|
5805
|
+
import { format as format2 } from "prettier";
|
|
5739
5806
|
|
|
5740
5807
|
// src/utils/script-helpers.ts
|
|
5741
5808
|
function generateGqlScript(scriptValue, opts) {
|
|
@@ -5758,38 +5825,38 @@ function extendNextScripts(scripts, opts) {
|
|
|
5758
5825
|
}
|
|
5759
5826
|
|
|
5760
5827
|
// src/cmds/init/codegen/index.ts
|
|
5761
|
-
|
|
5762
|
-
|
|
5828
|
+
import ts2 from "typescript";
|
|
5829
|
+
import fs13 from "fs-extra";
|
|
5763
5830
|
|
|
5764
5831
|
// src/cmds/init/codegen/util.ts
|
|
5765
|
-
|
|
5766
|
-
var makeTransformer = (makeVisitor) => (ctx) => (node) =>
|
|
5832
|
+
import ts from "typescript";
|
|
5833
|
+
var makeTransformer = (makeVisitor) => (ctx) => (node) => ts.visitNode(node, makeVisitor(ctx));
|
|
5767
5834
|
function parseExpression(expression) {
|
|
5768
|
-
const sourceFile =
|
|
5835
|
+
const sourceFile = ts.createSourceFile(
|
|
5769
5836
|
"temp.ts",
|
|
5770
5837
|
expression,
|
|
5771
|
-
|
|
5838
|
+
ts.ScriptTarget.Latest
|
|
5772
5839
|
);
|
|
5773
5840
|
if (sourceFile.statements.length !== 1) {
|
|
5774
5841
|
throw new Error("Expected one statement");
|
|
5775
5842
|
}
|
|
5776
5843
|
const statement = sourceFile.statements[0];
|
|
5777
|
-
if (!
|
|
5844
|
+
if (!ts.isExpressionStatement(statement)) {
|
|
5778
5845
|
throw new Error("Expected an expression statement");
|
|
5779
5846
|
}
|
|
5780
5847
|
return [sourceFile, statement.expression];
|
|
5781
5848
|
}
|
|
5782
5849
|
function parseVariableStatement(stmt) {
|
|
5783
|
-
const sourceFile =
|
|
5850
|
+
const sourceFile = ts.createSourceFile(
|
|
5784
5851
|
"temp.ts",
|
|
5785
5852
|
stmt,
|
|
5786
|
-
|
|
5853
|
+
ts.ScriptTarget.Latest
|
|
5787
5854
|
);
|
|
5788
5855
|
if (sourceFile.statements.length !== 1) {
|
|
5789
5856
|
throw new Error("Expected one statement");
|
|
5790
5857
|
}
|
|
5791
5858
|
const statement = sourceFile.statements[0];
|
|
5792
|
-
if (!
|
|
5859
|
+
if (!ts.isVariableStatement(statement)) {
|
|
5793
5860
|
throw new Error("Expected a variable statement");
|
|
5794
5861
|
}
|
|
5795
5862
|
return [sourceFile, statement];
|
|
@@ -5797,7 +5864,7 @@ function parseVariableStatement(stmt) {
|
|
|
5797
5864
|
|
|
5798
5865
|
// src/cmds/init/codegen/index.ts
|
|
5799
5866
|
var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variableStmt) => (ctx) => (node) => {
|
|
5800
|
-
if (
|
|
5867
|
+
if (ts2.isSourceFile(node)) {
|
|
5801
5868
|
const newStatements = [...node.statements];
|
|
5802
5869
|
let encounteredImports = false;
|
|
5803
5870
|
let firstNonImportStatementIdx = -1;
|
|
@@ -5805,7 +5872,7 @@ var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variable
|
|
|
5805
5872
|
const [newVarDec] = variableStmt.declarationList.declarations;
|
|
5806
5873
|
const newVarDecName = newVarDec.name.getText(variableStmtSourceFile);
|
|
5807
5874
|
for (let i = 0; i < newStatements.length; i++) {
|
|
5808
|
-
const isImport =
|
|
5875
|
+
const isImport = ts2.isImportDeclaration(newStatements[i]);
|
|
5809
5876
|
if (isImport && !encounteredImports) {
|
|
5810
5877
|
encounteredImports = true;
|
|
5811
5878
|
}
|
|
@@ -5813,9 +5880,9 @@ var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variable
|
|
|
5813
5880
|
firstNonImportStatementIdx = i;
|
|
5814
5881
|
}
|
|
5815
5882
|
const stmt = newStatements[i];
|
|
5816
|
-
if (
|
|
5883
|
+
if (ts2.isVariableStatement(stmt)) {
|
|
5817
5884
|
const [dec] = stmt.declarationList.declarations;
|
|
5818
|
-
if (dec.name &&
|
|
5885
|
+
if (dec.name && ts2.isIdentifier(dec.name) && dec.name.getText(sourceFile) === newVarDecName) {
|
|
5819
5886
|
existingStatementIdx = i;
|
|
5820
5887
|
}
|
|
5821
5888
|
}
|
|
@@ -5829,19 +5896,19 @@ var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variable
|
|
|
5829
5896
|
if (existingStatementIdx === -1) {
|
|
5830
5897
|
newStatements.splice(firstNonImportStatementIdx, 0, variableStmt);
|
|
5831
5898
|
}
|
|
5832
|
-
return
|
|
5899
|
+
return ts2.factory.updateSourceFile(node, newStatements);
|
|
5833
5900
|
}
|
|
5834
5901
|
};
|
|
5835
5902
|
var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
5836
|
-
if (
|
|
5903
|
+
if (ts2.isSourceFile(node)) {
|
|
5837
5904
|
const newStatements = [...node.statements];
|
|
5838
5905
|
let changed = false;
|
|
5839
5906
|
for (const [moduleName, imports] of Object.entries(importMap)) {
|
|
5840
5907
|
let foundImportStatement = false;
|
|
5841
5908
|
for (const statement of newStatements) {
|
|
5842
|
-
if (
|
|
5909
|
+
if (ts2.isImportDeclaration(statement) && ts2.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text === moduleName) {
|
|
5843
5910
|
foundImportStatement = true;
|
|
5844
|
-
const existingImports = statement.importClause?.namedBindings &&
|
|
5911
|
+
const existingImports = statement.importClause?.namedBindings && ts2.isNamedImports(statement.importClause.namedBindings) ? statement.importClause.namedBindings.elements.map(
|
|
5845
5912
|
(e) => e.name.text
|
|
5846
5913
|
) : [];
|
|
5847
5914
|
const newImports = [
|
|
@@ -5852,22 +5919,22 @@ var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
|
5852
5919
|
])
|
|
5853
5920
|
];
|
|
5854
5921
|
const importSpecifiers = newImports.map(
|
|
5855
|
-
(i) =>
|
|
5922
|
+
(i) => ts2.factory.createImportSpecifier(
|
|
5856
5923
|
void 0,
|
|
5857
|
-
|
|
5858
|
-
|
|
5924
|
+
ts2.factory.createIdentifier(i),
|
|
5925
|
+
ts2.factory.createIdentifier(i)
|
|
5859
5926
|
)
|
|
5860
5927
|
);
|
|
5861
|
-
const namedImports =
|
|
5862
|
-
const importClause =
|
|
5928
|
+
const namedImports = ts2.factory.createNamedImports(importSpecifiers);
|
|
5929
|
+
const importClause = ts2.factory.createImportClause(
|
|
5863
5930
|
false,
|
|
5864
5931
|
void 0,
|
|
5865
5932
|
namedImports
|
|
5866
5933
|
);
|
|
5867
|
-
const importDec =
|
|
5934
|
+
const importDec = ts2.factory.createImportDeclaration(
|
|
5868
5935
|
void 0,
|
|
5869
5936
|
importClause,
|
|
5870
|
-
|
|
5937
|
+
ts2.factory.createStringLiteral(moduleName)
|
|
5871
5938
|
);
|
|
5872
5939
|
newStatements[newStatements.indexOf(statement)] = importDec;
|
|
5873
5940
|
changed = true;
|
|
@@ -5875,45 +5942,45 @@ var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
|
5875
5942
|
}
|
|
5876
5943
|
if (!foundImportStatement) {
|
|
5877
5944
|
const importSpecifiers = imports.map(
|
|
5878
|
-
(i) =>
|
|
5945
|
+
(i) => ts2.factory.createImportSpecifier(
|
|
5879
5946
|
void 0,
|
|
5880
|
-
|
|
5881
|
-
|
|
5947
|
+
ts2.factory.createIdentifier(i),
|
|
5948
|
+
ts2.factory.createIdentifier(i)
|
|
5882
5949
|
)
|
|
5883
5950
|
);
|
|
5884
|
-
const namedImports =
|
|
5885
|
-
const importClause =
|
|
5951
|
+
const namedImports = ts2.factory.createNamedImports(importSpecifiers);
|
|
5952
|
+
const importClause = ts2.factory.createImportClause(
|
|
5886
5953
|
false,
|
|
5887
5954
|
void 0,
|
|
5888
5955
|
namedImports
|
|
5889
5956
|
);
|
|
5890
|
-
const importDec =
|
|
5957
|
+
const importDec = ts2.factory.createImportDeclaration(
|
|
5891
5958
|
void 0,
|
|
5892
5959
|
importClause,
|
|
5893
|
-
|
|
5960
|
+
ts2.factory.createStringLiteral(moduleName)
|
|
5894
5961
|
);
|
|
5895
5962
|
newStatements.unshift(importDec);
|
|
5896
5963
|
changed = true;
|
|
5897
5964
|
}
|
|
5898
5965
|
}
|
|
5899
5966
|
if (changed) {
|
|
5900
|
-
return
|
|
5967
|
+
return ts2.factory.updateSourceFile(node, newStatements);
|
|
5901
5968
|
}
|
|
5902
5969
|
}
|
|
5903
5970
|
};
|
|
5904
5971
|
var makeAddExpressionToSchemaCollectionVisitor = (sourceFile, functionName, newExpressionSourceFile, newExpression) => (ctx) => {
|
|
5905
5972
|
const visit2 = (node) => {
|
|
5906
|
-
if (
|
|
5973
|
+
if (ts2.isCallExpression(node) && ts2.isIdentifier(node.expression) && node.expression.text === functionName && node.arguments.length > 0 && ts2.isObjectLiteralExpression(node.arguments[0])) {
|
|
5907
5974
|
const configObject = node.arguments[0];
|
|
5908
5975
|
const updateProperties = configObject.properties.map((property) => {
|
|
5909
|
-
if (
|
|
5976
|
+
if (ts2.isPropertyAssignment(property)) {
|
|
5910
5977
|
const thisPropertyName = property.name.getText(sourceFile);
|
|
5911
|
-
if (thisPropertyName === "schema" &&
|
|
5978
|
+
if (thisPropertyName === "schema" && ts2.isPropertyAssignment(property) && ts2.isObjectLiteralExpression(property.initializer)) {
|
|
5912
5979
|
const schemaObject = property.initializer;
|
|
5913
5980
|
const collectionsProperty = schemaObject.properties.find(
|
|
5914
|
-
(p) =>
|
|
5981
|
+
(p) => ts2.isPropertyAssignment(p) && p.name.getText(sourceFile) === "collections"
|
|
5915
5982
|
);
|
|
5916
|
-
if (collectionsProperty &&
|
|
5983
|
+
if (collectionsProperty && ts2.isPropertyAssignment(collectionsProperty) && ts2.isArrayLiteralExpression(collectionsProperty.initializer)) {
|
|
5917
5984
|
const collectionsArray = collectionsProperty.initializer;
|
|
5918
5985
|
const collectionItems = collectionsArray.elements.map(
|
|
5919
5986
|
(e) => e.getText(sourceFile)
|
|
@@ -5923,16 +5990,16 @@ var makeAddExpressionToSchemaCollectionVisitor = (sourceFile, functionName, newE
|
|
|
5923
5990
|
)) {
|
|
5924
5991
|
return property;
|
|
5925
5992
|
}
|
|
5926
|
-
return
|
|
5993
|
+
return ts2.factory.updatePropertyAssignment(
|
|
5927
5994
|
property,
|
|
5928
5995
|
property.name,
|
|
5929
|
-
|
|
5996
|
+
ts2.factory.createObjectLiteralExpression(
|
|
5930
5997
|
schemaObject.properties.map((subProp) => {
|
|
5931
|
-
if (
|
|
5932
|
-
return
|
|
5998
|
+
if (ts2.isPropertyAssignment(subProp) && subProp.name.getText(sourceFile) === "collections" && ts2.isArrayLiteralExpression(subProp.initializer)) {
|
|
5999
|
+
return ts2.factory.updatePropertyAssignment(
|
|
5933
6000
|
subProp,
|
|
5934
6001
|
subProp.name,
|
|
5935
|
-
|
|
6002
|
+
ts2.factory.createArrayLiteralExpression(
|
|
5936
6003
|
[newExpression, ...subProp.initializer.elements],
|
|
5937
6004
|
true
|
|
5938
6005
|
)
|
|
@@ -5948,56 +6015,56 @@ var makeAddExpressionToSchemaCollectionVisitor = (sourceFile, functionName, newE
|
|
|
5948
6015
|
}
|
|
5949
6016
|
return property;
|
|
5950
6017
|
});
|
|
5951
|
-
return
|
|
6018
|
+
return ts2.factory.createCallExpression(
|
|
5952
6019
|
node.expression,
|
|
5953
6020
|
node.typeArguments,
|
|
5954
|
-
[
|
|
6021
|
+
[ts2.factory.createObjectLiteralExpression(updateProperties, true)]
|
|
5955
6022
|
);
|
|
5956
6023
|
}
|
|
5957
|
-
return
|
|
6024
|
+
return ts2.visitEachChild(node, visit2, ctx);
|
|
5958
6025
|
};
|
|
5959
6026
|
return (sourceFile2) => {
|
|
5960
|
-
return
|
|
6027
|
+
return ts2.visitEachChild(sourceFile2, visit2, ctx);
|
|
5961
6028
|
};
|
|
5962
6029
|
};
|
|
5963
6030
|
var makeUpdateObjectLiteralPropertyVisitor = (sourceFile, functionName, propertyName, propertyValueExpressionSourceFile, propertyValue) => (ctx) => {
|
|
5964
6031
|
const visitor = (node) => {
|
|
5965
|
-
if (
|
|
6032
|
+
if (ts2.isCallExpression(node) && ts2.isIdentifier(node.expression) && node.expression.text === functionName && node.arguments.length > 0 && ts2.isObjectLiteralExpression(node.arguments[0])) {
|
|
5966
6033
|
let foundProperty = false;
|
|
5967
6034
|
const configObject = node.arguments[0];
|
|
5968
6035
|
const updateProperties = configObject.properties.map((property) => {
|
|
5969
|
-
if (
|
|
6036
|
+
if (ts2.isPropertyAssignment(property) || ts2.isShorthandPropertyAssignment(property)) {
|
|
5970
6037
|
const name2 = property.name.getText(sourceFile);
|
|
5971
6038
|
if (name2 === propertyName) {
|
|
5972
6039
|
foundProperty = true;
|
|
5973
|
-
return
|
|
6040
|
+
return ts2.factory.createPropertyAssignment(name2, propertyValue);
|
|
5974
6041
|
}
|
|
5975
6042
|
}
|
|
5976
6043
|
return property;
|
|
5977
6044
|
});
|
|
5978
6045
|
if (!foundProperty) {
|
|
5979
6046
|
updateProperties.unshift(
|
|
5980
|
-
|
|
6047
|
+
ts2.factory.createPropertyAssignment(propertyName, propertyValue)
|
|
5981
6048
|
);
|
|
5982
6049
|
}
|
|
5983
|
-
return
|
|
6050
|
+
return ts2.factory.createCallExpression(
|
|
5984
6051
|
node.expression,
|
|
5985
6052
|
node.typeArguments,
|
|
5986
|
-
[
|
|
6053
|
+
[ts2.factory.createObjectLiteralExpression(updateProperties, true)]
|
|
5987
6054
|
);
|
|
5988
6055
|
}
|
|
5989
|
-
return
|
|
6056
|
+
return ts2.visitEachChild(node, visitor, ctx);
|
|
5990
6057
|
};
|
|
5991
6058
|
return (sourceFile2) => {
|
|
5992
|
-
return
|
|
6059
|
+
return ts2.visitNode(sourceFile2, visitor);
|
|
5993
6060
|
};
|
|
5994
6061
|
};
|
|
5995
6062
|
var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
5996
6063
|
const pathToConfig = configFile.resolve(config2.typescript).path;
|
|
5997
|
-
const sourceFile =
|
|
6064
|
+
const sourceFile = ts2.createSourceFile(
|
|
5998
6065
|
pathToConfig,
|
|
5999
|
-
|
|
6000
|
-
config2.typescript ?
|
|
6066
|
+
fs13.readFileSync(pathToConfig, "utf8"),
|
|
6067
|
+
config2.typescript ? ts2.ScriptTarget.Latest : ts2.ScriptTarget.ESNext
|
|
6001
6068
|
);
|
|
6002
6069
|
const { configImports, configAuthProviderClass, extraTinaCollections } = config2.authProvider;
|
|
6003
6070
|
const importMap = {
|
|
@@ -6010,7 +6077,7 @@ var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
|
6010
6077
|
{}
|
|
6011
6078
|
)
|
|
6012
6079
|
};
|
|
6013
|
-
const transformedSourceFileResult =
|
|
6080
|
+
const transformedSourceFileResult = ts2.transform(
|
|
6014
6081
|
sourceFile,
|
|
6015
6082
|
[
|
|
6016
6083
|
makeImportsVisitor(sourceFile, {
|
|
@@ -6046,13 +6113,14 @@ var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
|
6046
6113
|
)
|
|
6047
6114
|
].map((visitor) => makeTransformer(visitor))
|
|
6048
6115
|
);
|
|
6049
|
-
return
|
|
6116
|
+
return fs13.writeFile(
|
|
6050
6117
|
pathToConfig,
|
|
6051
|
-
|
|
6118
|
+
ts2.createPrinter({ omitTrailingSemicolon: true }).printFile(transformedSourceFileResult.transformed[0])
|
|
6052
6119
|
);
|
|
6053
6120
|
};
|
|
6054
6121
|
|
|
6055
6122
|
// src/cmds/init/apply.ts
|
|
6123
|
+
import { exec } from "child_process";
|
|
6056
6124
|
async function apply({
|
|
6057
6125
|
env,
|
|
6058
6126
|
params,
|
|
@@ -6163,8 +6231,8 @@ async function apply({
|
|
|
6163
6231
|
await addConfigFile({
|
|
6164
6232
|
configArgs: {
|
|
6165
6233
|
config: config2,
|
|
6166
|
-
publicFolder:
|
|
6167
|
-
|
|
6234
|
+
publicFolder: path14.join(
|
|
6235
|
+
path14.relative(process.cwd(), pathToForestryConfig),
|
|
6168
6236
|
config2.publicFolder
|
|
6169
6237
|
),
|
|
6170
6238
|
collections,
|
|
@@ -6221,7 +6289,7 @@ var reportTelemetry = async ({
|
|
|
6221
6289
|
if (noTelemetry) {
|
|
6222
6290
|
logger.info(logText("Telemetry disabled"));
|
|
6223
6291
|
}
|
|
6224
|
-
const telemetry = new
|
|
6292
|
+
const telemetry = new Telemetry2({ disabled: noTelemetry });
|
|
6225
6293
|
const schemaFileType = usingTypescript ? "ts" : "js";
|
|
6226
6294
|
await telemetry.submitRecord({
|
|
6227
6295
|
event: {
|
|
@@ -6237,18 +6305,18 @@ var createPackageJSON = async () => {
|
|
|
6237
6305
|
};
|
|
6238
6306
|
var createGitignore = async ({ baseDir }) => {
|
|
6239
6307
|
logger.info(logText("No .gitignore found, creating one"));
|
|
6240
|
-
|
|
6308
|
+
fs14.outputFileSync(path14.join(baseDir, ".gitignore"), "node_modules");
|
|
6241
6309
|
};
|
|
6242
6310
|
var updateGitIgnore = async ({
|
|
6243
6311
|
baseDir,
|
|
6244
6312
|
items
|
|
6245
6313
|
}) => {
|
|
6246
6314
|
logger.info(logText(`Adding ${items.join(",")} to .gitignore`));
|
|
6247
|
-
const gitignoreContent =
|
|
6315
|
+
const gitignoreContent = fs14.readFileSync(path14.join(baseDir, ".gitignore")).toString();
|
|
6248
6316
|
const newGitignoreContent = [...gitignoreContent.split("\n"), ...items].join(
|
|
6249
6317
|
"\n"
|
|
6250
6318
|
);
|
|
6251
|
-
await
|
|
6319
|
+
await fs14.writeFile(path14.join(baseDir, ".gitignore"), newGitignoreContent);
|
|
6252
6320
|
};
|
|
6253
6321
|
var addDependencies = async (config2, env, params) => {
|
|
6254
6322
|
const { packageManager } = config2;
|
|
@@ -6289,7 +6357,8 @@ var addDependencies = async (config2, env, params) => {
|
|
|
6289
6357
|
let packageManagers = {
|
|
6290
6358
|
pnpm: process.env.USE_WORKSPACE ? `pnpm add ${deps.join(" ")} --workspace` : `pnpm add ${deps.join(" ")}`,
|
|
6291
6359
|
npm: `npm install ${deps.join(" ")}`,
|
|
6292
|
-
yarn: `yarn add ${deps.join(" ")}
|
|
6360
|
+
yarn: `yarn add ${deps.join(" ")}`,
|
|
6361
|
+
bun: `bun add ${deps.join(" ")}`
|
|
6293
6362
|
};
|
|
6294
6363
|
if (packageManagers[packageManager] && deps.length > 0) {
|
|
6295
6364
|
logger.info(logText("Adding dependencies, this might take a moment..."));
|
|
@@ -6300,7 +6369,8 @@ var addDependencies = async (config2, env, params) => {
|
|
|
6300
6369
|
packageManagers = {
|
|
6301
6370
|
pnpm: process.env.USE_WORKSPACE ? `pnpm add -D ${devDeps.join(" ")} --workspace` : `pnpm add -D ${devDeps.join(" ")}`,
|
|
6302
6371
|
npm: `npm install -D ${devDeps.join(" ")}`,
|
|
6303
|
-
yarn: `yarn add -D ${devDeps.join(" ")}
|
|
6372
|
+
yarn: `yarn add -D ${devDeps.join(" ")}`,
|
|
6373
|
+
bun: `bun add -D ${devDeps.join(" ")}`
|
|
6304
6374
|
};
|
|
6305
6375
|
if (packageManagers[packageManager]) {
|
|
6306
6376
|
logger.info(
|
|
@@ -6317,22 +6387,22 @@ var writeGeneratedFile = async ({
|
|
|
6317
6387
|
content,
|
|
6318
6388
|
typescript
|
|
6319
6389
|
}) => {
|
|
6320
|
-
const { exists, path:
|
|
6390
|
+
const { exists, path: path15, parentPath } = generatedFile.resolve(typescript);
|
|
6321
6391
|
if (exists) {
|
|
6322
6392
|
if (overwrite) {
|
|
6323
|
-
logger.info(`Overwriting file at ${
|
|
6324
|
-
|
|
6393
|
+
logger.info(`Overwriting file at ${path15}... \u2705`);
|
|
6394
|
+
fs14.outputFileSync(path15, content);
|
|
6325
6395
|
} else {
|
|
6326
|
-
logger.info(`Not overwriting file at ${
|
|
6396
|
+
logger.info(`Not overwriting file at ${path15}.`);
|
|
6327
6397
|
logger.info(
|
|
6328
|
-
logText(`Please add the following to ${
|
|
6398
|
+
logText(`Please add the following to ${path15}:
|
|
6329
6399
|
${indentText(content)}}`)
|
|
6330
6400
|
);
|
|
6331
6401
|
}
|
|
6332
6402
|
} else {
|
|
6333
|
-
logger.info(`Adding file at ${
|
|
6334
|
-
await
|
|
6335
|
-
|
|
6403
|
+
logger.info(`Adding file at ${path15}... \u2705`);
|
|
6404
|
+
await fs14.ensureDir(parentPath);
|
|
6405
|
+
fs14.outputFileSync(path15, content);
|
|
6336
6406
|
}
|
|
6337
6407
|
};
|
|
6338
6408
|
var addConfigFile = async ({
|
|
@@ -6341,7 +6411,7 @@ var addConfigFile = async ({
|
|
|
6341
6411
|
generatedFile,
|
|
6342
6412
|
config: config2
|
|
6343
6413
|
}) => {
|
|
6344
|
-
const content = (
|
|
6414
|
+
const content = format2(generateConfig(configArgs), {
|
|
6345
6415
|
parser: "babel"
|
|
6346
6416
|
});
|
|
6347
6417
|
await writeGeneratedFile({
|
|
@@ -6371,7 +6441,7 @@ var addNextApiRoute = async ({
|
|
|
6371
6441
|
generatedFile,
|
|
6372
6442
|
env
|
|
6373
6443
|
}) => {
|
|
6374
|
-
const content = (
|
|
6444
|
+
const content = format2(nextApiRouteTemplate({ config: config2, env }), {
|
|
6375
6445
|
parser: "babel"
|
|
6376
6446
|
});
|
|
6377
6447
|
await writeGeneratedFile({
|
|
@@ -6410,7 +6480,7 @@ var addContentFile = async ({
|
|
|
6410
6480
|
return () => ({
|
|
6411
6481
|
exists: env.sampleContentExists,
|
|
6412
6482
|
path: env.sampleContentPath,
|
|
6413
|
-
parentPath:
|
|
6483
|
+
parentPath: path14.dirname(env.sampleContentPath)
|
|
6414
6484
|
});
|
|
6415
6485
|
}
|
|
6416
6486
|
},
|
|
@@ -6433,10 +6503,10 @@ ${titleText(" TinaCMS ")} backend initialized!`));
|
|
|
6433
6503
|
return `${x.key}=${x.value || "***"}`;
|
|
6434
6504
|
}).join("\n") + `
|
|
6435
6505
|
TINA_PUBLIC_IS_LOCAL=true`;
|
|
6436
|
-
const envFile =
|
|
6437
|
-
if (!
|
|
6506
|
+
const envFile = path14.join(process.cwd(), ".env");
|
|
6507
|
+
if (!fs14.existsSync(envFile)) {
|
|
6438
6508
|
logger.info(`Adding .env file to your project... \u2705`);
|
|
6439
|
-
|
|
6509
|
+
fs14.writeFileSync(envFile, envFileText);
|
|
6440
6510
|
} else {
|
|
6441
6511
|
logger.info(
|
|
6442
6512
|
"Please add the following environment variables to your .env file"
|
|
@@ -6479,7 +6549,8 @@ var other = ({ packageManager }) => {
|
|
|
6479
6549
|
pnpm: `pnpm`,
|
|
6480
6550
|
npm: `npx`,
|
|
6481
6551
|
// npx is the way to run executables that aren't in your "scripts"
|
|
6482
|
-
yarn: `yarn
|
|
6552
|
+
yarn: `yarn`,
|
|
6553
|
+
bun: `bun run`
|
|
6483
6554
|
};
|
|
6484
6555
|
return `${packageManagers[packageManager]} tinacms dev -c "<your dev command>"`;
|
|
6485
6556
|
};
|
|
@@ -6492,7 +6563,8 @@ var frameworkDevCmds = {
|
|
|
6492
6563
|
pnpm: `pnpm`,
|
|
6493
6564
|
npm: `npm run`,
|
|
6494
6565
|
// npx is the way to run executables that aren't in your "scripts"
|
|
6495
|
-
yarn: `yarn
|
|
6566
|
+
yarn: `yarn`,
|
|
6567
|
+
bun: `bun run`
|
|
6496
6568
|
};
|
|
6497
6569
|
return `${packageManagers[packageManager]} dev`;
|
|
6498
6570
|
}
|
|
@@ -6505,7 +6577,7 @@ var addReactiveFile = {
|
|
|
6505
6577
|
baseDir,
|
|
6506
6578
|
dataLayer
|
|
6507
6579
|
}) => {
|
|
6508
|
-
const packageJsonPath =
|
|
6580
|
+
const packageJsonPath = path14.join(baseDir, "package.json");
|
|
6509
6581
|
await writeGeneratedFile({
|
|
6510
6582
|
generatedFile,
|
|
6511
6583
|
typescript: config2.typescript,
|
|
@@ -6518,7 +6590,7 @@ var addReactiveFile = {
|
|
|
6518
6590
|
})
|
|
6519
6591
|
});
|
|
6520
6592
|
logger.info("Adding a nextjs example... \u2705");
|
|
6521
|
-
const packageJson = JSON.parse(
|
|
6593
|
+
const packageJson = JSON.parse(fs14.readFileSync(packageJsonPath).toString());
|
|
6522
6594
|
const scripts = packageJson.scripts || {};
|
|
6523
6595
|
const updatedPackageJson = JSON.stringify(
|
|
6524
6596
|
{
|
|
@@ -6531,11 +6603,10 @@ var addReactiveFile = {
|
|
|
6531
6603
|
null,
|
|
6532
6604
|
2
|
|
6533
6605
|
);
|
|
6534
|
-
|
|
6606
|
+
fs14.writeFileSync(packageJsonPath, updatedPackageJson);
|
|
6535
6607
|
}
|
|
6536
6608
|
};
|
|
6537
6609
|
function execShellCommand(cmd) {
|
|
6538
|
-
const exec = require("child_process").exec;
|
|
6539
6610
|
return new Promise((resolve2, reject) => {
|
|
6540
6611
|
exec(cmd, (error, stdout, stderr) => {
|
|
6541
6612
|
if (error) {
|
|
@@ -6581,34 +6652,27 @@ var command = new CLICommand({
|
|
|
6581
6652
|
});
|
|
6582
6653
|
|
|
6583
6654
|
// src/next/commands/init-command/index.ts
|
|
6584
|
-
var InitCommand = class extends
|
|
6585
|
-
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
|
|
6601
|
-
|
|
6602
|
-
|
|
6603
|
-
|
|
6604
|
-
|
|
6605
|
-
}
|
|
6606
|
-
static {
|
|
6607
|
-
this.usage = import_clipanion6.Command.Usage({
|
|
6608
|
-
category: `Commands`,
|
|
6609
|
-
description: `Add Tina to an existing project`
|
|
6610
|
-
});
|
|
6611
|
-
}
|
|
6655
|
+
var InitCommand = class extends Command6 {
|
|
6656
|
+
static paths = [["init"], ["init", "backend"]];
|
|
6657
|
+
pathToForestryConfig = Option6.String("--forestryPath", {
|
|
6658
|
+
description: "Specify the relative path to the .forestry directory, if importing an existing forestry site."
|
|
6659
|
+
});
|
|
6660
|
+
rootPath = Option6.String("--rootPath", {
|
|
6661
|
+
description: "Specify the root directory to run the CLI from (defaults to current working directory)"
|
|
6662
|
+
});
|
|
6663
|
+
debug = Option6.Boolean("--debug", false, {
|
|
6664
|
+
description: "Enable debug logging"
|
|
6665
|
+
});
|
|
6666
|
+
noTelemetry = Option6.Boolean("--noTelemetry", false, {
|
|
6667
|
+
description: "Disable anonymous telemetry that is collected"
|
|
6668
|
+
});
|
|
6669
|
+
tinaVersion = Option6.String("--tinaVersion", {
|
|
6670
|
+
description: "Specify a version for tina dependencies"
|
|
6671
|
+
});
|
|
6672
|
+
static usage = Command6.Usage({
|
|
6673
|
+
category: `Commands`,
|
|
6674
|
+
description: `Add Tina to an existing project`
|
|
6675
|
+
});
|
|
6612
6676
|
async catch(error) {
|
|
6613
6677
|
logger.error("Error occured during tinacms init");
|
|
6614
6678
|
console.error(error);
|
|
@@ -6630,28 +6694,24 @@ var InitCommand = class extends import_clipanion6.Command {
|
|
|
6630
6694
|
};
|
|
6631
6695
|
|
|
6632
6696
|
// src/next/commands/searchindex-command/index.ts
|
|
6633
|
-
|
|
6634
|
-
|
|
6635
|
-
|
|
6636
|
-
|
|
6637
|
-
|
|
6638
|
-
|
|
6639
|
-
|
|
6640
|
-
|
|
6641
|
-
|
|
6642
|
-
|
|
6643
|
-
|
|
6644
|
-
|
|
6645
|
-
|
|
6646
|
-
|
|
6647
|
-
|
|
6648
|
-
|
|
6649
|
-
|
|
6650
|
-
|
|
6651
|
-
category: `Commands`,
|
|
6652
|
-
description: `Index the site for search`
|
|
6653
|
-
});
|
|
6654
|
-
}
|
|
6697
|
+
import { Command as Command7, Option as Option7 } from "clipanion";
|
|
6698
|
+
import { createSchema, FilesystemBridge as FilesystemBridge4 } from "@tinacms/graphql";
|
|
6699
|
+
import {
|
|
6700
|
+
SearchIndexer as SearchIndexer3,
|
|
6701
|
+
TinaCMSSearchIndexClient as TinaCMSSearchIndexClient2
|
|
6702
|
+
} from "@tinacms/search";
|
|
6703
|
+
var SearchIndexCommand = class extends Command7 {
|
|
6704
|
+
static paths = [["search-index"]];
|
|
6705
|
+
rootPath = Option7.String("--rootPath", {
|
|
6706
|
+
description: "Specify the root directory to run the CLI from (defaults to current working directory)"
|
|
6707
|
+
});
|
|
6708
|
+
verbose = Option7.Boolean("-v,--verbose", false, {
|
|
6709
|
+
description: "increase verbosity of logged output"
|
|
6710
|
+
});
|
|
6711
|
+
static usage = Command7.Usage({
|
|
6712
|
+
category: `Commands`,
|
|
6713
|
+
description: `Index the site for search`
|
|
6714
|
+
});
|
|
6655
6715
|
async catch(error) {
|
|
6656
6716
|
logger.error("Error occured during tinacms search-index");
|
|
6657
6717
|
console.error(error);
|
|
@@ -6673,7 +6733,7 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6673
6733
|
process.exit(1);
|
|
6674
6734
|
}
|
|
6675
6735
|
const { schema } = configManager.config;
|
|
6676
|
-
const tinaSchema = await
|
|
6736
|
+
const tinaSchema = await createSchema({
|
|
6677
6737
|
schema: { ...schema, config: configManager.config }
|
|
6678
6738
|
});
|
|
6679
6739
|
let client;
|
|
@@ -6701,7 +6761,7 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6701
6761
|
"indexerToken not configured in tina search configuration."
|
|
6702
6762
|
);
|
|
6703
6763
|
}
|
|
6704
|
-
client = new
|
|
6764
|
+
client = new TinaCMSSearchIndexClient2({
|
|
6705
6765
|
apiUrl: `${configManager.config.tinaioConfig?.contentApiUrlOverride || "https://content.tinajs.io"}/searchIndex/${configManager.config?.clientId}`,
|
|
6706
6766
|
branch: configManager.config?.branch,
|
|
6707
6767
|
indexerToken: configManager.config?.search?.tina?.indexerToken,
|
|
@@ -6710,9 +6770,9 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6710
6770
|
} else {
|
|
6711
6771
|
client = configManager.config?.search?.searchClient;
|
|
6712
6772
|
}
|
|
6713
|
-
const searchIndexer = new
|
|
6773
|
+
const searchIndexer = new SearchIndexer3({
|
|
6714
6774
|
batchSize: configManager.config.search?.indexBatchSize || 100,
|
|
6715
|
-
bridge: new
|
|
6775
|
+
bridge: new FilesystemBridge4(
|
|
6716
6776
|
configManager.rootPath,
|
|
6717
6777
|
configManager.contentRootPath
|
|
6718
6778
|
),
|
|
@@ -6740,7 +6800,7 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6740
6800
|
};
|
|
6741
6801
|
|
|
6742
6802
|
// src/index.ts
|
|
6743
|
-
var cli = new
|
|
6803
|
+
var cli = new Cli({
|
|
6744
6804
|
binaryName: `tinacms`,
|
|
6745
6805
|
binaryLabel: `TinaCMS`,
|
|
6746
6806
|
binaryVersion: version
|
|
@@ -6751,7 +6811,10 @@ cli.register(AuditCommand);
|
|
|
6751
6811
|
cli.register(InitCommand);
|
|
6752
6812
|
cli.register(CodemodCommand);
|
|
6753
6813
|
cli.register(SearchIndexCommand);
|
|
6754
|
-
cli.register(
|
|
6755
|
-
cli.register(
|
|
6756
|
-
cli.register(
|
|
6814
|
+
cli.register(Builtins.DefinitionsCommand);
|
|
6815
|
+
cli.register(Builtins.HelpCommand);
|
|
6816
|
+
cli.register(Builtins.VersionCommand);
|
|
6757
6817
|
var index_default = cli;
|
|
6818
|
+
export {
|
|
6819
|
+
index_default as default
|
|
6820
|
+
};
|