@tinacms/cli 0.0.0-d94de9b-20250707010010 → 0.0.0-db7231c-20251216055550
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/util/index.d.ts +4 -4
- package/dist/cmds/init/prompts/index.d.ts +1 -1
- package/dist/cmds/init/prompts/types.d.ts +1 -1
- package/dist/index.js +916 -864
- package/dist/logger/index.d.ts +7 -2
- 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/dist/utils/theme.d.ts +10 -30
- package/package.json +11 -12
package/dist/index.js
CHANGED
|
@@ -1,53 +1,20 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name2 in all)
|
|
9
|
-
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
-
mod
|
|
26
|
-
));
|
|
27
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
-
|
|
29
1
|
// src/index.ts
|
|
30
|
-
|
|
31
|
-
__export(index_exports, {
|
|
32
|
-
default: () => index_default
|
|
33
|
-
});
|
|
34
|
-
module.exports = __toCommonJS(index_exports);
|
|
35
|
-
var import_clipanion8 = require("clipanion");
|
|
2
|
+
import { Cli, Builtins } from "clipanion";
|
|
36
3
|
|
|
37
4
|
// package.json
|
|
38
|
-
var version = "
|
|
5
|
+
var version = "2.0.3";
|
|
39
6
|
|
|
40
7
|
// src/next/commands/dev-command/index.ts
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
8
|
+
import path8 from "path";
|
|
9
|
+
import { FilesystemBridge as FilesystemBridge2, buildSchema } from "@tinacms/graphql";
|
|
10
|
+
import { LocalSearchIndexClient, SearchIndexer } from "@tinacms/search";
|
|
11
|
+
import AsyncLock from "async-lock";
|
|
12
|
+
import chokidar from "chokidar";
|
|
13
|
+
import { Command as Command2, Option as Option2 } from "clipanion";
|
|
14
|
+
import fs7 from "fs-extra";
|
|
48
15
|
|
|
49
16
|
// src/logger/index.ts
|
|
50
|
-
|
|
17
|
+
import chalk from "chalk";
|
|
51
18
|
|
|
52
19
|
// src/logger/is-unicode-supported.ts
|
|
53
20
|
function isUnicodeSupported() {
|
|
@@ -61,15 +28,15 @@ function isUnicodeSupported() {
|
|
|
61
28
|
}
|
|
62
29
|
|
|
63
30
|
// src/logger/index.ts
|
|
64
|
-
var
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
31
|
+
var logger = {
|
|
32
|
+
level: "info",
|
|
33
|
+
info: (msg) => process.stdout.write(msg + "\n"),
|
|
34
|
+
warn: (msg) => process.stdout.write(msg + "\n"),
|
|
35
|
+
error: (msg) => process.stderr.write(msg + "\n"),
|
|
36
|
+
debug: (msg) => {
|
|
37
|
+
if (logger.level === "debug") process.stdout.write(msg + "\n");
|
|
38
|
+
}
|
|
39
|
+
};
|
|
73
40
|
function ansiRegex() {
|
|
74
41
|
const pattern = [
|
|
75
42
|
"[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
|
|
@@ -88,18 +55,18 @@ ${message}
|
|
|
88
55
|
return ln.length > sum ? ln.length : sum;
|
|
89
56
|
}, 0) + 2;
|
|
90
57
|
const msg = lines.map(
|
|
91
|
-
(ln) => `${
|
|
58
|
+
(ln) => `${chalk.gray(bar)} ${chalk.white(ln)}${" ".repeat(
|
|
92
59
|
len - strip(ln).length
|
|
93
|
-
)}${
|
|
60
|
+
)}${chalk.gray(bar)}`
|
|
94
61
|
).join("\n");
|
|
95
62
|
const underscoreLen = len - title.length - 1 > 0 ? len - title.length - 1 : 0;
|
|
96
63
|
process.stdout.write(
|
|
97
|
-
`${
|
|
98
|
-
${
|
|
64
|
+
`${chalk.gray(bar)}
|
|
65
|
+
${chalk.green("\u25CB")} ${chalk.reset(
|
|
99
66
|
title
|
|
100
|
-
)} ${
|
|
67
|
+
)} ${chalk.gray("\u2500".repeat(underscoreLen) + "\u256E")}
|
|
101
68
|
${msg}
|
|
102
|
-
${
|
|
69
|
+
${chalk.gray(
|
|
103
70
|
"\u251C" + "\u2500".repeat(len + 2) + "\u256F"
|
|
104
71
|
)}
|
|
105
72
|
`
|
|
@@ -116,11 +83,11 @@ var summary = (content) => {
|
|
|
116
83
|
});
|
|
117
84
|
});
|
|
118
85
|
content.items.forEach((item) => {
|
|
119
|
-
outString.push(`${item.emoji} ${
|
|
86
|
+
outString.push(`${item.emoji} ${chalk.cyan(item.heading)}`);
|
|
120
87
|
item.subItems.forEach((subItem) => {
|
|
121
88
|
const spaces = longestKey - subItem.key.length + 4;
|
|
122
89
|
outString.push(
|
|
123
|
-
` ${subItem.key}:${[...Array(spaces)].join(" ")}${
|
|
90
|
+
` ${subItem.key}:${[...Array(spaces)].join(" ")}${chalk.cyan(
|
|
124
91
|
subItem.value
|
|
125
92
|
)}`
|
|
126
93
|
);
|
|
@@ -158,12 +125,12 @@ var S_WARN = s("\u25B2", "!");
|
|
|
158
125
|
var S_ERROR = s("\u25A0", "x");
|
|
159
126
|
|
|
160
127
|
// src/utils/spinner.ts
|
|
161
|
-
|
|
128
|
+
import { Spinner } from "cli-spinner";
|
|
162
129
|
async function localSpin({
|
|
163
130
|
waitFor,
|
|
164
131
|
text
|
|
165
132
|
}) {
|
|
166
|
-
const spinner = new
|
|
133
|
+
const spinner = new Spinner({
|
|
167
134
|
text: `${text} %s`,
|
|
168
135
|
stream: process.stderr,
|
|
169
136
|
onTick: function(msg) {
|
|
@@ -194,32 +161,32 @@ function spin({
|
|
|
194
161
|
}
|
|
195
162
|
|
|
196
163
|
// src/utils/theme.ts
|
|
197
|
-
|
|
198
|
-
var successText =
|
|
199
|
-
var focusText =
|
|
200
|
-
var dangerText =
|
|
201
|
-
var neutralText =
|
|
202
|
-
var linkText =
|
|
203
|
-
var labelText =
|
|
204
|
-
var cmdText =
|
|
164
|
+
import chalk2 from "chalk";
|
|
165
|
+
var successText = chalk2.bold.green;
|
|
166
|
+
var focusText = chalk2.bold;
|
|
167
|
+
var dangerText = chalk2.bold.red;
|
|
168
|
+
var neutralText = chalk2.bold.cyan;
|
|
169
|
+
var linkText = chalk2.bold.cyan;
|
|
170
|
+
var labelText = chalk2.bold;
|
|
171
|
+
var cmdText = chalk2.inverse;
|
|
205
172
|
var indentedCmd = (str) => {
|
|
206
173
|
return ` \u2503 ` + str;
|
|
207
174
|
};
|
|
208
175
|
var indentText = (str) => {
|
|
209
176
|
return String(str).split("\n").map((line) => ` ${line}`).join("\n");
|
|
210
177
|
};
|
|
211
|
-
var logText =
|
|
212
|
-
var warnText =
|
|
213
|
-
var titleText =
|
|
214
|
-
var CONFIRMATION_TEXT =
|
|
178
|
+
var logText = chalk2.italic.gray;
|
|
179
|
+
var warnText = chalk2.yellowBright.bgBlack;
|
|
180
|
+
var titleText = chalk2.bgHex("d2f1f8").hex("ec4816");
|
|
181
|
+
var CONFIRMATION_TEXT = chalk2.dim("enter to confirm");
|
|
215
182
|
|
|
216
183
|
// src/next/codegen/index.ts
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
184
|
+
import fs from "fs-extra";
|
|
185
|
+
import path from "path";
|
|
186
|
+
import { buildASTSchema, printSchema as printSchema2 } from "graphql";
|
|
220
187
|
|
|
221
188
|
// src/next/codegen/codegen/index.ts
|
|
222
|
-
|
|
189
|
+
import { parse, printSchema } from "graphql";
|
|
223
190
|
|
|
224
191
|
// src/next/codegen/codegen/plugin.ts
|
|
225
192
|
var AddGeneratedClientFunc = (apiURL) => {
|
|
@@ -288,37 +255,44 @@ var AddGeneratedClient = (apiURL) => ({
|
|
|
288
255
|
});
|
|
289
256
|
|
|
290
257
|
// src/next/codegen/codegen/index.ts
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
258
|
+
import { GraphQLFileLoader } from "@graphql-tools/graphql-file-loader";
|
|
259
|
+
import { codegen } from "@graphql-codegen/core";
|
|
260
|
+
import { loadDocuments } from "@graphql-tools/load";
|
|
261
|
+
import { plugin as typescriptOperationsPlugin } from "@graphql-codegen/typescript-operations";
|
|
262
|
+
import { plugin as typescriptPlugin } from "@graphql-codegen/typescript";
|
|
296
263
|
|
|
297
264
|
// src/next/codegen/codegen/sdkPlugin/index.ts
|
|
298
|
-
|
|
299
|
-
|
|
265
|
+
import { visit } from "graphql";
|
|
266
|
+
import {
|
|
267
|
+
concatAST,
|
|
268
|
+
Kind as Kind2
|
|
269
|
+
} from "graphql";
|
|
300
270
|
|
|
301
271
|
// src/next/codegen/codegen/sdkPlugin/visitor.ts
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
272
|
+
import {
|
|
273
|
+
ClientSideBaseVisitor,
|
|
274
|
+
DocumentMode,
|
|
275
|
+
indentMultiline
|
|
276
|
+
} from "@graphql-codegen/visitor-plugin-common";
|
|
277
|
+
import autoBind from "auto-bind";
|
|
278
|
+
import { Kind, print } from "graphql";
|
|
279
|
+
var GenericSdkVisitor = class extends ClientSideBaseVisitor {
|
|
280
|
+
_operationsToInclude = [];
|
|
306
281
|
constructor(schema, fragments, rawConfig) {
|
|
307
282
|
super(schema, fragments, rawConfig, {
|
|
308
283
|
usingObservableFrom: rawConfig.usingObservableFrom
|
|
309
284
|
});
|
|
310
|
-
this
|
|
311
|
-
(0, import_auto_bind.default)(this);
|
|
285
|
+
autoBind(this);
|
|
312
286
|
if (this.config.usingObservableFrom) {
|
|
313
287
|
this._additionalImports.push(this.config.usingObservableFrom);
|
|
314
288
|
}
|
|
315
|
-
if (this.config.documentMode !==
|
|
289
|
+
if (this.config.documentMode !== DocumentMode.string) {
|
|
316
290
|
}
|
|
317
291
|
}
|
|
318
292
|
buildOperation(node, documentVariableName, operationType, operationResultType, operationVariablesTypes) {
|
|
319
293
|
if (node.name == null) {
|
|
320
294
|
throw new Error(
|
|
321
|
-
"Plugin 'generic-sdk' cannot generate SDK for unnamed operation.\n\n" +
|
|
295
|
+
"Plugin 'generic-sdk' cannot generate SDK for unnamed operation.\n\n" + print(node)
|
|
322
296
|
);
|
|
323
297
|
} else {
|
|
324
298
|
this._operationsToInclude.push({
|
|
@@ -336,14 +310,14 @@ var GenericSdkVisitor = class extends import_visitor_plugin_common.ClientSideBas
|
|
|
336
310
|
const usingObservable = !!this.config.usingObservableFrom;
|
|
337
311
|
const allPossibleActions = this._operationsToInclude.map((o) => {
|
|
338
312
|
const optionalVariables = !o.node.variableDefinitions || o.node.variableDefinitions.length === 0 || o.node.variableDefinitions.every(
|
|
339
|
-
(v) => v.type.kind !==
|
|
313
|
+
(v) => v.type.kind !== Kind.NON_NULL_TYPE || v.defaultValue
|
|
340
314
|
);
|
|
341
315
|
const returnType = usingObservable && o.operationType === "Subscription" ? "Observable" : "Promise";
|
|
342
316
|
return `${o.node.name.value}(variables${optionalVariables ? "?" : ""}: ${o.operationVariablesTypes}, options?: C): ${returnType}<${o.operationResultType}> {
|
|
343
317
|
return requester<${o.operationResultType}, ${o.operationVariablesTypes}>(${o.documentVariableName}, variables, options);
|
|
344
318
|
}`;
|
|
345
|
-
}).map((s2) =>
|
|
346
|
-
return `export type Requester<C= {}> = <R, V>(doc: ${this.config.documentMode ===
|
|
319
|
+
}).map((s2) => indentMultiline(s2, 2));
|
|
320
|
+
return `export type Requester<C= {}> = <R, V>(doc: ${this.config.documentMode === DocumentMode.string ? "string" : "DocumentNode"}, vars?: V, options?: C) => ${usingObservable ? "Promise<R> & Observable<R>" : "Promise<R>"}
|
|
347
321
|
export function getSdk<C>(requester: Requester<C>) {
|
|
348
322
|
return {
|
|
349
323
|
${allPossibleActions.join(",\n")}
|
|
@@ -355,14 +329,14 @@ var GenericSdkVisitor = class extends import_visitor_plugin_common.ClientSideBas
|
|
|
355
329
|
|
|
356
330
|
// src/next/codegen/codegen/sdkPlugin/index.ts
|
|
357
331
|
var plugin = (schema, documents, config2) => {
|
|
358
|
-
const allAst =
|
|
332
|
+
const allAst = concatAST(
|
|
359
333
|
documents.reduce((prev, v) => {
|
|
360
334
|
return [...prev, v.document];
|
|
361
335
|
}, [])
|
|
362
336
|
);
|
|
363
337
|
const allFragments = [
|
|
364
338
|
...allAst.definitions.filter(
|
|
365
|
-
(d) => d.kind ===
|
|
339
|
+
(d) => d.kind === Kind2.FRAGMENT_DEFINITION
|
|
366
340
|
).map((fragmentDef) => ({
|
|
367
341
|
node: fragmentDef,
|
|
368
342
|
name: fragmentDef.name.value,
|
|
@@ -372,7 +346,7 @@ var plugin = (schema, documents, config2) => {
|
|
|
372
346
|
...config2.externalFragments || []
|
|
373
347
|
];
|
|
374
348
|
const visitor = new GenericSdkVisitor(schema, allFragments, config2);
|
|
375
|
-
const visitorResult =
|
|
349
|
+
const visitorResult = visit(allAst, { leave: visitor });
|
|
376
350
|
return {
|
|
377
351
|
// We will take care of imports
|
|
378
352
|
// prepend: visitor.getImports(),
|
|
@@ -390,10 +364,10 @@ var generateTypes = async (schema, queryPathGlob = process.cwd(), fragDocPath =
|
|
|
390
364
|
let fragDocs = [];
|
|
391
365
|
docs = await loadGraphQLDocuments(queryPathGlob);
|
|
392
366
|
fragDocs = await loadGraphQLDocuments(fragDocPath);
|
|
393
|
-
const res = await
|
|
367
|
+
const res = await codegen({
|
|
394
368
|
// Filename is not used. This is because the typescript plugin returns a string instead of writing to a file.
|
|
395
369
|
filename: process.cwd(),
|
|
396
|
-
schema:
|
|
370
|
+
schema: parse(printSchema(schema)),
|
|
397
371
|
documents: [...docs, ...fragDocs],
|
|
398
372
|
config: {},
|
|
399
373
|
plugins: [
|
|
@@ -406,10 +380,10 @@ var generateTypes = async (schema, queryPathGlob = process.cwd(), fragDocPath =
|
|
|
406
380
|
],
|
|
407
381
|
pluginMap: {
|
|
408
382
|
typescript: {
|
|
409
|
-
plugin:
|
|
383
|
+
plugin: typescriptPlugin
|
|
410
384
|
},
|
|
411
385
|
typescriptOperations: {
|
|
412
|
-
plugin:
|
|
386
|
+
plugin: typescriptOperationsPlugin
|
|
413
387
|
},
|
|
414
388
|
typescriptSdk: {
|
|
415
389
|
plugin
|
|
@@ -422,8 +396,8 @@ var generateTypes = async (schema, queryPathGlob = process.cwd(), fragDocPath =
|
|
|
422
396
|
var loadGraphQLDocuments = async (globPath) => {
|
|
423
397
|
let result = [];
|
|
424
398
|
try {
|
|
425
|
-
result = await
|
|
426
|
-
loaders: [new
|
|
399
|
+
result = await loadDocuments(globPath, {
|
|
400
|
+
loaders: [new GraphQLFileLoader()]
|
|
427
401
|
});
|
|
428
402
|
} catch (e) {
|
|
429
403
|
if (
|
|
@@ -440,11 +414,27 @@ var loadGraphQLDocuments = async (globPath) => {
|
|
|
440
414
|
};
|
|
441
415
|
|
|
442
416
|
// src/next/codegen/index.ts
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
417
|
+
import { transform } from "esbuild";
|
|
418
|
+
import { mapUserFields } from "@tinacms/graphql";
|
|
419
|
+
import normalizePath from "normalize-path";
|
|
446
420
|
var TINA_HOST = "content.tinajs.io";
|
|
447
421
|
var Codegen = class {
|
|
422
|
+
configManager;
|
|
423
|
+
port;
|
|
424
|
+
schema;
|
|
425
|
+
queryDoc;
|
|
426
|
+
fragDoc;
|
|
427
|
+
isLocal;
|
|
428
|
+
// The API url used in the client
|
|
429
|
+
apiURL;
|
|
430
|
+
// This is always the local URL.
|
|
431
|
+
localUrl;
|
|
432
|
+
// production url
|
|
433
|
+
productionUrl;
|
|
434
|
+
graphqlSchemaDoc;
|
|
435
|
+
tinaSchema;
|
|
436
|
+
lookup;
|
|
437
|
+
noClientBuildCache;
|
|
448
438
|
constructor({
|
|
449
439
|
configManager,
|
|
450
440
|
port,
|
|
@@ -460,7 +450,7 @@ var Codegen = class {
|
|
|
460
450
|
this.graphqlSchemaDoc = graphqlSchemaDoc;
|
|
461
451
|
this.configManager = configManager;
|
|
462
452
|
this.port = port;
|
|
463
|
-
this.schema =
|
|
453
|
+
this.schema = buildASTSchema(graphqlSchemaDoc);
|
|
464
454
|
this.tinaSchema = tinaSchema;
|
|
465
455
|
this.queryDoc = queryDoc;
|
|
466
456
|
this.fragDoc = fragDoc;
|
|
@@ -468,19 +458,19 @@ var Codegen = class {
|
|
|
468
458
|
this.noClientBuildCache = noClientBuildCache;
|
|
469
459
|
}
|
|
470
460
|
async writeConfigFile(fileName, data) {
|
|
471
|
-
const filePath =
|
|
461
|
+
const filePath = path.join(
|
|
472
462
|
this.configManager.generatedFolderPath,
|
|
473
463
|
fileName
|
|
474
464
|
);
|
|
475
|
-
await
|
|
476
|
-
await
|
|
465
|
+
await fs.ensureFile(filePath);
|
|
466
|
+
await fs.outputFile(filePath, data);
|
|
477
467
|
if (this.configManager.hasSeparateContentRoot()) {
|
|
478
|
-
const filePath2 =
|
|
468
|
+
const filePath2 = path.join(
|
|
479
469
|
this.configManager.generatedFolderPathContentRepo,
|
|
480
470
|
fileName
|
|
481
471
|
);
|
|
482
|
-
await
|
|
483
|
-
await
|
|
472
|
+
await fs.ensureFile(filePath2);
|
|
473
|
+
await fs.outputFile(filePath2, data);
|
|
484
474
|
}
|
|
485
475
|
}
|
|
486
476
|
async removeGeneratedFilesIfExists() {
|
|
@@ -512,11 +502,11 @@ var Codegen = class {
|
|
|
512
502
|
await this.removeGeneratedFilesIfExists();
|
|
513
503
|
return apiURL;
|
|
514
504
|
}
|
|
515
|
-
await
|
|
505
|
+
await fs.outputFile(
|
|
516
506
|
this.configManager.generatedQueriesFilePath,
|
|
517
507
|
this.queryDoc
|
|
518
508
|
);
|
|
519
|
-
await
|
|
509
|
+
await fs.outputFile(
|
|
520
510
|
this.configManager.generatedFragmentsFilePath,
|
|
521
511
|
this.fragDoc
|
|
522
512
|
);
|
|
@@ -524,21 +514,21 @@ var Codegen = class {
|
|
|
524
514
|
const { clientString } = await this.genClient();
|
|
525
515
|
const databaseClientString = this.configManager.hasSelfHostedConfig() ? await this.genDatabaseClient() : "";
|
|
526
516
|
const { codeString, schemaString } = await this.genTypes();
|
|
527
|
-
await
|
|
517
|
+
await fs.outputFile(
|
|
528
518
|
this.configManager.generatedGraphQLGQLPath,
|
|
529
519
|
schemaString
|
|
530
520
|
);
|
|
531
521
|
if (this.configManager.isUsingTs()) {
|
|
532
|
-
await
|
|
522
|
+
await fs.outputFile(
|
|
533
523
|
this.configManager.generatedTypesTSFilePath,
|
|
534
524
|
codeString
|
|
535
525
|
);
|
|
536
|
-
await
|
|
526
|
+
await fs.outputFile(
|
|
537
527
|
this.configManager.generatedClientTSFilePath,
|
|
538
528
|
clientString
|
|
539
529
|
);
|
|
540
530
|
if (this.configManager.hasSelfHostedConfig()) {
|
|
541
|
-
await
|
|
531
|
+
await fs.outputFile(
|
|
542
532
|
this.configManager.generatedDatabaseClientTSFilePath,
|
|
543
533
|
databaseClientString
|
|
544
534
|
);
|
|
@@ -547,35 +537,35 @@ var Codegen = class {
|
|
|
547
537
|
await unlinkIfExists(this.configManager.generatedTypesDFilePath);
|
|
548
538
|
await unlinkIfExists(this.configManager.generatedTypesJSFilePath);
|
|
549
539
|
} else {
|
|
550
|
-
await
|
|
540
|
+
await fs.outputFile(
|
|
551
541
|
this.configManager.generatedTypesDFilePath,
|
|
552
542
|
codeString
|
|
553
543
|
);
|
|
554
|
-
const jsTypes = await
|
|
555
|
-
await
|
|
544
|
+
const jsTypes = await transform(codeString, { loader: "ts" });
|
|
545
|
+
await fs.outputFile(
|
|
556
546
|
this.configManager.generatedTypesJSFilePath,
|
|
557
547
|
jsTypes.code
|
|
558
548
|
);
|
|
559
|
-
await
|
|
549
|
+
await fs.outputFile(
|
|
560
550
|
this.configManager.generatedClientDFilePath,
|
|
561
551
|
clientString
|
|
562
552
|
);
|
|
563
|
-
const jsClient = await
|
|
564
|
-
await
|
|
553
|
+
const jsClient = await transform(clientString, { loader: "ts" });
|
|
554
|
+
await fs.outputFile(
|
|
565
555
|
this.configManager.generatedClientJSFilePath,
|
|
566
556
|
jsClient.code
|
|
567
557
|
);
|
|
568
558
|
await unlinkIfExists(this.configManager.generatedTypesTSFilePath);
|
|
569
559
|
await unlinkIfExists(this.configManager.generatedClientTSFilePath);
|
|
570
560
|
if (this.configManager.hasSelfHostedConfig()) {
|
|
571
|
-
const jsDatabaseClient = await
|
|
561
|
+
const jsDatabaseClient = await transform(databaseClientString, {
|
|
572
562
|
loader: "ts"
|
|
573
563
|
});
|
|
574
|
-
await
|
|
564
|
+
await fs.outputFile(
|
|
575
565
|
this.configManager.generatedDatabaseClientJSFilePath,
|
|
576
566
|
jsDatabaseClient.code
|
|
577
567
|
);
|
|
578
|
-
await
|
|
568
|
+
await fs.outputFile(
|
|
579
569
|
this.configManager.generatedDatabaseClientDFilePath,
|
|
580
570
|
databaseClientString
|
|
581
571
|
);
|
|
@@ -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,45 @@ 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 outfile =
|
|
1065
|
-
const outfile2 =
|
|
1066
|
-
const tempTSConfigFile =
|
|
1067
|
-
|
|
1118
|
+
const outfile = path3.join(tmpdir, "config.build.jsx");
|
|
1119
|
+
const outfile2 = path3.join(tmpdir, "config.build.mjs");
|
|
1120
|
+
const tempTSConfigFile = path3.join(tmpdir, "tsconfig.json");
|
|
1121
|
+
const esmRequireBanner = {
|
|
1122
|
+
js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`
|
|
1123
|
+
};
|
|
1124
|
+
fs2.outputFileSync(tempTSConfigFile, "{}");
|
|
1068
1125
|
const result2 = await esbuild.build({
|
|
1069
1126
|
entryPoints: [configFilePath],
|
|
1070
1127
|
bundle: true,
|
|
1071
|
-
target: ["
|
|
1128
|
+
target: ["esnext"],
|
|
1072
1129
|
platform: "browser",
|
|
1073
1130
|
format: "esm",
|
|
1074
1131
|
logLevel: "silent",
|
|
@@ -1088,31 +1145,34 @@ var ConfigManager = class {
|
|
|
1088
1145
|
await esbuild.build({
|
|
1089
1146
|
entryPoints: [configFilePath],
|
|
1090
1147
|
bundle: true,
|
|
1091
|
-
target: ["
|
|
1148
|
+
target: ["esnext"],
|
|
1092
1149
|
logLevel: "silent",
|
|
1093
1150
|
platform: "node",
|
|
1151
|
+
format: "esm",
|
|
1094
1152
|
outfile,
|
|
1095
|
-
loader: loaders
|
|
1153
|
+
loader: loaders,
|
|
1154
|
+
banner: esmRequireBanner
|
|
1096
1155
|
});
|
|
1097
1156
|
await esbuild.build({
|
|
1098
1157
|
entryPoints: [outfile],
|
|
1099
1158
|
bundle: true,
|
|
1100
|
-
// Suppress warning about comparison with -0 from client module
|
|
1101
1159
|
logLevel: "silent",
|
|
1102
1160
|
platform: "node",
|
|
1161
|
+
target: ["esnext"],
|
|
1162
|
+
format: "esm",
|
|
1103
1163
|
outfile: outfile2,
|
|
1104
1164
|
loader: loaders
|
|
1105
1165
|
});
|
|
1106
1166
|
let result;
|
|
1107
1167
|
try {
|
|
1108
|
-
result =
|
|
1168
|
+
result = await import(pathToFileURL(outfile2).href);
|
|
1109
1169
|
} catch (e) {
|
|
1110
1170
|
console.error("Unexpected error loading config");
|
|
1111
1171
|
console.error(e);
|
|
1112
1172
|
throw e;
|
|
1113
1173
|
}
|
|
1114
|
-
|
|
1115
|
-
|
|
1174
|
+
fs2.removeSync(outfile);
|
|
1175
|
+
fs2.removeSync(outfile2);
|
|
1116
1176
|
return {
|
|
1117
1177
|
config: result.default,
|
|
1118
1178
|
prebuildPath: preBuildConfigPath,
|
|
@@ -1147,20 +1207,24 @@ var loaders = {
|
|
|
1147
1207
|
};
|
|
1148
1208
|
|
|
1149
1209
|
// src/next/database.ts
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1210
|
+
import {
|
|
1211
|
+
createDatabaseInternal,
|
|
1212
|
+
FilesystemBridge,
|
|
1213
|
+
TinaLevelClient
|
|
1214
|
+
} from "@tinacms/graphql";
|
|
1215
|
+
import { pipeline } from "readable-stream";
|
|
1216
|
+
import { createServer } from "net";
|
|
1217
|
+
import { ManyLevelHost } from "many-level";
|
|
1218
|
+
import { MemoryLevel } from "memory-level";
|
|
1155
1219
|
var createDBServer = (port) => {
|
|
1156
|
-
const levelHost = new
|
|
1220
|
+
const levelHost = new ManyLevelHost(
|
|
1157
1221
|
// @ts-ignore
|
|
1158
|
-
new
|
|
1222
|
+
new MemoryLevel({
|
|
1159
1223
|
valueEncoding: "json"
|
|
1160
1224
|
})
|
|
1161
1225
|
);
|
|
1162
|
-
const dbServer =
|
|
1163
|
-
return
|
|
1226
|
+
const dbServer = createServer(function(socket) {
|
|
1227
|
+
return pipeline(socket, levelHost.createRpcStream(), socket, () => {
|
|
1164
1228
|
});
|
|
1165
1229
|
});
|
|
1166
1230
|
dbServer.once("error", (err) => {
|
|
@@ -1174,7 +1238,7 @@ var createDBServer = (port) => {
|
|
|
1174
1238
|
};
|
|
1175
1239
|
async function createAndInitializeDatabase(configManager, datalayerPort, bridgeOverride) {
|
|
1176
1240
|
let database;
|
|
1177
|
-
const bridge = bridgeOverride || new
|
|
1241
|
+
const bridge = bridgeOverride || new FilesystemBridge(configManager.rootPath, configManager.contentRootPath);
|
|
1178
1242
|
if (configManager.hasSelfHostedConfig() && configManager.config.contentApiUrlOverride) {
|
|
1179
1243
|
database = await configManager.loadDatabaseFile();
|
|
1180
1244
|
database.bridge = bridge;
|
|
@@ -1186,9 +1250,9 @@ async function createAndInitializeDatabase(configManager, datalayerPort, bridgeO
|
|
|
1186
1250
|
)} but there was no "contentApiUrlOverride" set. Falling back to built-in datalayer`
|
|
1187
1251
|
);
|
|
1188
1252
|
}
|
|
1189
|
-
const level = new
|
|
1253
|
+
const level = new TinaLevelClient(datalayerPort);
|
|
1190
1254
|
level.openConnection();
|
|
1191
|
-
database =
|
|
1255
|
+
database = createDatabaseInternal({
|
|
1192
1256
|
bridge,
|
|
1193
1257
|
level,
|
|
1194
1258
|
tinaDirectory: configManager.isUsingLegacyFolder ? LEGACY_TINA_FOLDER : TINA_FOLDER
|
|
@@ -1198,17 +1262,17 @@ async function createAndInitializeDatabase(configManager, datalayerPort, bridgeO
|
|
|
1198
1262
|
}
|
|
1199
1263
|
|
|
1200
1264
|
// src/next/commands/baseCommands.ts
|
|
1201
|
-
|
|
1202
|
-
|
|
1265
|
+
import { Command, Option } from "clipanion";
|
|
1266
|
+
import chalk4 from "chalk";
|
|
1203
1267
|
|
|
1204
1268
|
// src/utils/start-subprocess.ts
|
|
1205
|
-
|
|
1269
|
+
import childProcess from "child_process";
|
|
1206
1270
|
var startSubprocess2 = async ({ command: command2 }) => {
|
|
1207
1271
|
if (typeof command2 === "string") {
|
|
1208
1272
|
const commands = command2.split(" ");
|
|
1209
1273
|
const firstCommand = commands[0];
|
|
1210
1274
|
const args = commands.slice(1) || [];
|
|
1211
|
-
const ps =
|
|
1275
|
+
const ps = childProcess.spawn(firstCommand, args, {
|
|
1212
1276
|
stdio: "inherit",
|
|
1213
1277
|
shell: true
|
|
1214
1278
|
});
|
|
@@ -1232,45 +1296,42 @@ stack: ${code.stack || "No stack was provided"}`);
|
|
|
1232
1296
|
};
|
|
1233
1297
|
|
|
1234
1298
|
// 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
|
-
}
|
|
1299
|
+
import { getChangedFiles, getSha, shaExists } from "@tinacms/graphql";
|
|
1300
|
+
import fs3 from "fs-extra";
|
|
1301
|
+
var BaseCommand = class extends Command {
|
|
1302
|
+
experimentalDataLayer = Option.Boolean("--experimentalData", {
|
|
1303
|
+
description: "DEPRECATED - Build the server with additional data querying capabilities"
|
|
1304
|
+
});
|
|
1305
|
+
isomorphicGitBridge = Option.Boolean("--isomorphicGitBridge", {
|
|
1306
|
+
description: "DEPRECATED - Enable Isomorphic Git Bridge Implementation"
|
|
1307
|
+
});
|
|
1308
|
+
port = Option.String("-p,--port", "4001", {
|
|
1309
|
+
description: "Specify a port to run the server on. (default 4001)"
|
|
1310
|
+
});
|
|
1311
|
+
datalayerPort = Option.String("--datalayer-port", "9000", {
|
|
1312
|
+
description: "Specify a port to run the datalayer server on. (default 9000)"
|
|
1313
|
+
});
|
|
1314
|
+
subCommand = Option.String("-c,--command", {
|
|
1315
|
+
description: "The sub-command to run"
|
|
1316
|
+
});
|
|
1317
|
+
rootPath = Option.String("--rootPath", {
|
|
1318
|
+
description: "Specify the root directory to run the CLI from (defaults to current working directory)"
|
|
1319
|
+
});
|
|
1320
|
+
verbose = Option.Boolean("-v,--verbose", false, {
|
|
1321
|
+
description: "increase verbosity of logged output"
|
|
1322
|
+
});
|
|
1323
|
+
noSDK = Option.Boolean("--noSDK", false, {
|
|
1324
|
+
description: "DEPRECATED - This should now be set in the config at client.skip = true'. Don't generate the generated client SDK"
|
|
1325
|
+
});
|
|
1326
|
+
noTelemetry = Option.Boolean("--noTelemetry", false, {
|
|
1327
|
+
description: "Disable anonymous telemetry that is collected"
|
|
1328
|
+
});
|
|
1268
1329
|
async startSubCommand() {
|
|
1269
1330
|
let subProc;
|
|
1270
1331
|
if (this.subCommand) {
|
|
1271
1332
|
subProc = await startSubprocess2({ command: this.subCommand });
|
|
1272
1333
|
logger.info(
|
|
1273
|
-
`Running web application with command: ${
|
|
1334
|
+
`Running web application with command: ${chalk4.cyan(this.subCommand)}`
|
|
1274
1335
|
);
|
|
1275
1336
|
}
|
|
1276
1337
|
function exitHandler(options, exitCode) {
|
|
@@ -1318,7 +1379,7 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1318
1379
|
const rootPath = configManager.rootPath;
|
|
1319
1380
|
let sha;
|
|
1320
1381
|
try {
|
|
1321
|
-
sha = await
|
|
1382
|
+
sha = await getSha({ fs: fs3, dir: rootPath });
|
|
1322
1383
|
} catch (e) {
|
|
1323
1384
|
if (partialReindex) {
|
|
1324
1385
|
console.error(
|
|
@@ -1328,7 +1389,7 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1328
1389
|
}
|
|
1329
1390
|
}
|
|
1330
1391
|
const lastSha = await database.getMetadata("lastSha");
|
|
1331
|
-
const exists = lastSha && await
|
|
1392
|
+
const exists = lastSha && await shaExists({ fs: fs3, dir: rootPath, sha: lastSha });
|
|
1332
1393
|
let res;
|
|
1333
1394
|
if (partialReindex && lastSha && exists && sha) {
|
|
1334
1395
|
const pathFilter = {};
|
|
@@ -1342,15 +1403,15 @@ var BaseCommand = class extends import_clipanion.Command {
|
|
|
1342
1403
|
matches: collection.match?.exclude || collection.match?.include ? tinaSchema.getMatches({ collection }) : void 0
|
|
1343
1404
|
};
|
|
1344
1405
|
}
|
|
1345
|
-
const { added, modified, deleted } = await
|
|
1346
|
-
fs:
|
|
1406
|
+
const { added, modified, deleted } = await getChangedFiles({
|
|
1407
|
+
fs: fs3,
|
|
1347
1408
|
dir: rootPath,
|
|
1348
1409
|
from: lastSha,
|
|
1349
1410
|
to: sha,
|
|
1350
1411
|
pathFilter
|
|
1351
1412
|
});
|
|
1352
1413
|
const tinaPathUpdates = modified.filter(
|
|
1353
|
-
(
|
|
1414
|
+
(path15) => path15.startsWith(".tina/__generated__/_schema.json") || path15.startsWith("tina/tina-lock.json")
|
|
1354
1415
|
);
|
|
1355
1416
|
if (tinaPathUpdates.length > 0) {
|
|
1356
1417
|
res = await database.indexContent({
|
|
@@ -1428,7 +1489,7 @@ var errorHTML = `<style type="text/css">
|
|
|
1428
1489
|
the assets for this page.
|
|
1429
1490
|
</p>
|
|
1430
1491
|
<p>
|
|
1431
|
-
Please visit <a href="https://tina.io/docs/
|
|
1492
|
+
Please visit <a href="https://tina.io/docs/r/FAQ/#13-how-do-i-resolve-failed-loading-tinacms-assets-error">this doc</a> for help.
|
|
1432
1493
|
</p>
|
|
1433
1494
|
</div>
|
|
1434
1495
|
</div>`.trim().replace(/[\r\n\s]+/g, " ");
|
|
@@ -1466,34 +1527,38 @@ var devHTML = (port) => `<!DOCTYPE html>
|
|
|
1466
1527
|
</html>`;
|
|
1467
1528
|
|
|
1468
1529
|
// src/next/commands/dev-command/server/index.ts
|
|
1469
|
-
|
|
1530
|
+
import { createServer as createViteServer } from "vite";
|
|
1470
1531
|
|
|
1471
1532
|
// src/next/vite/index.ts
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1533
|
+
import path5 from "node:path";
|
|
1534
|
+
import react from "@vitejs/plugin-react";
|
|
1535
|
+
import fs4 from "fs-extra";
|
|
1536
|
+
import normalizePath3 from "normalize-path";
|
|
1537
|
+
import {
|
|
1538
|
+
splitVendorChunkPlugin
|
|
1539
|
+
} from "vite";
|
|
1477
1540
|
|
|
1478
1541
|
// src/next/vite/tailwind.ts
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1542
|
+
import path4 from "node:path";
|
|
1543
|
+
import aspectRatio from "@tailwindcss/aspect-ratio";
|
|
1544
|
+
import containerQueries from "@tailwindcss/container-queries";
|
|
1545
|
+
import twTypography from "@tailwindcss/typography";
|
|
1546
|
+
import tailwind from "tailwindcss";
|
|
1547
|
+
import defaultTheme from "tailwindcss/defaultTheme.js";
|
|
1548
|
+
import { createRequire as createRequire2 } from "module";
|
|
1485
1549
|
var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
1486
1550
|
return {
|
|
1487
1551
|
name: "vite-plugin-tina",
|
|
1488
1552
|
// @ts-ignore
|
|
1489
1553
|
config: (viteConfig) => {
|
|
1554
|
+
const require2 = createRequire2(import.meta.url);
|
|
1490
1555
|
const plugins = [];
|
|
1491
1556
|
const content = [
|
|
1492
|
-
|
|
1557
|
+
path4.join(spaPath, "src/**/*.{vue,js,ts,jsx,tsx,svelte}"),
|
|
1493
1558
|
prebuildFilePath,
|
|
1494
|
-
|
|
1559
|
+
require2.resolve("tinacms")
|
|
1495
1560
|
];
|
|
1496
|
-
const tw = (
|
|
1561
|
+
const tw = tailwind({
|
|
1497
1562
|
theme: {
|
|
1498
1563
|
columns: {
|
|
1499
1564
|
auto: "auto",
|
|
@@ -1681,6 +1746,9 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1681
1746
|
500: "#EC4815",
|
|
1682
1747
|
600: "#DC4419"
|
|
1683
1748
|
},
|
|
1749
|
+
"tina-orange": "#EC4815",
|
|
1750
|
+
"tina-orange-dark": "#C2410C",
|
|
1751
|
+
"tina-orange-light": "#FFF7ED",
|
|
1684
1752
|
background: "#FFFFFF",
|
|
1685
1753
|
foreground: "#0A0A0A",
|
|
1686
1754
|
muted: "#F5F5F5",
|
|
@@ -1702,7 +1770,7 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1702
1770
|
ring: "#0A0A0A"
|
|
1703
1771
|
},
|
|
1704
1772
|
fontFamily: {
|
|
1705
|
-
sans: ["Inter", ...
|
|
1773
|
+
sans: ["Inter", ...defaultTheme.fontFamily.sans]
|
|
1706
1774
|
},
|
|
1707
1775
|
lineHeight: {
|
|
1708
1776
|
3: "12px",
|
|
@@ -1727,9 +1795,9 @@ var tinaTailwind = (spaPath, prebuildFilePath) => {
|
|
|
1727
1795
|
},
|
|
1728
1796
|
content,
|
|
1729
1797
|
plugins: [
|
|
1730
|
-
(
|
|
1731
|
-
|
|
1732
|
-
|
|
1798
|
+
twTypography({ className: "tina-prose" }),
|
|
1799
|
+
aspectRatio,
|
|
1800
|
+
containerQueries
|
|
1733
1801
|
]
|
|
1734
1802
|
});
|
|
1735
1803
|
plugins.push(tw);
|
|
@@ -1750,35 +1818,35 @@ async function listFilesRecursively({
|
|
|
1750
1818
|
config: config2,
|
|
1751
1819
|
roothPath
|
|
1752
1820
|
}) {
|
|
1753
|
-
const fullDirectoryPath =
|
|
1821
|
+
const fullDirectoryPath = path5.join(
|
|
1754
1822
|
roothPath,
|
|
1755
1823
|
config2.publicFolder,
|
|
1756
1824
|
directoryPath
|
|
1757
1825
|
);
|
|
1758
|
-
const exists = await
|
|
1826
|
+
const exists = await fs4.pathExists(fullDirectoryPath);
|
|
1759
1827
|
if (!exists) {
|
|
1760
1828
|
return { "0": [] };
|
|
1761
1829
|
}
|
|
1762
|
-
const items = await
|
|
1830
|
+
const items = await fs4.readdir(fullDirectoryPath);
|
|
1763
1831
|
const staticMediaItems = [];
|
|
1764
1832
|
for (const item of items) {
|
|
1765
|
-
const itemPath =
|
|
1766
|
-
const stats = await
|
|
1833
|
+
const itemPath = path5.join(fullDirectoryPath, item);
|
|
1834
|
+
const stats = await fs4.promises.lstat(itemPath);
|
|
1767
1835
|
const staticMediaItem = {
|
|
1768
1836
|
id: item,
|
|
1769
1837
|
filename: item,
|
|
1770
1838
|
type: stats.isDirectory() ? "dir" : "file",
|
|
1771
1839
|
directory: `${directoryPath.replace(config2.mediaRoot, "")}`,
|
|
1772
|
-
src: `/${
|
|
1840
|
+
src: `/${path5.join(directoryPath, item)}`,
|
|
1773
1841
|
thumbnails: {
|
|
1774
|
-
"75x75": `/${
|
|
1775
|
-
"400x400": `/${
|
|
1776
|
-
"1000x1000": `/${
|
|
1842
|
+
"75x75": `/${path5.join(directoryPath, item)}`,
|
|
1843
|
+
"400x400": `/${path5.join(directoryPath, item)}`,
|
|
1844
|
+
"1000x1000": `/${path5.join(directoryPath, item)}`
|
|
1777
1845
|
}
|
|
1778
1846
|
};
|
|
1779
1847
|
if (stats.isDirectory()) {
|
|
1780
1848
|
staticMediaItem.children = await listFilesRecursively({
|
|
1781
|
-
directoryPath:
|
|
1849
|
+
directoryPath: path5.join(directoryPath, item),
|
|
1782
1850
|
config: config2,
|
|
1783
1851
|
roothPath
|
|
1784
1852
|
});
|
|
@@ -1819,7 +1887,7 @@ var createConfig = async ({
|
|
|
1819
1887
|
}
|
|
1820
1888
|
}
|
|
1821
1889
|
});
|
|
1822
|
-
const staticMediaPath =
|
|
1890
|
+
const staticMediaPath = path5.join(
|
|
1823
1891
|
configManager.generatedFolderPath,
|
|
1824
1892
|
"static-media.json"
|
|
1825
1893
|
);
|
|
@@ -1829,21 +1897,21 @@ var createConfig = async ({
|
|
|
1829
1897
|
config: configManager.config.media.tina,
|
|
1830
1898
|
roothPath: configManager.rootPath
|
|
1831
1899
|
});
|
|
1832
|
-
await
|
|
1900
|
+
await fs4.outputFile(staticMediaPath, JSON.stringify(staticMedia, null, 2));
|
|
1833
1901
|
} else {
|
|
1834
|
-
await
|
|
1902
|
+
await fs4.outputFile(staticMediaPath, `[]`);
|
|
1835
1903
|
}
|
|
1836
1904
|
const alias = {
|
|
1837
1905
|
TINA_IMPORT: configManager.prebuildFilePath,
|
|
1838
1906
|
SCHEMA_IMPORT: configManager.generatedGraphQLJSONPath,
|
|
1839
1907
|
STATIC_MEDIA_IMPORT: staticMediaPath,
|
|
1840
|
-
crypto:
|
|
1841
|
-
fs:
|
|
1842
|
-
os:
|
|
1843
|
-
path:
|
|
1908
|
+
crypto: path5.join(configManager.spaRootPath, "src", "dummy-client.ts"),
|
|
1909
|
+
fs: path5.join(configManager.spaRootPath, "src", "dummy-client.ts"),
|
|
1910
|
+
os: path5.join(configManager.spaRootPath, "src", "dummy-client.ts"),
|
|
1911
|
+
path: path5.join(configManager.spaRootPath, "src", "dummy-client.ts")
|
|
1844
1912
|
};
|
|
1845
1913
|
if (configManager.shouldSkipSDK()) {
|
|
1846
|
-
alias["CLIENT_IMPORT"] =
|
|
1914
|
+
alias["CLIENT_IMPORT"] = path5.join(
|
|
1847
1915
|
configManager.spaRootPath,
|
|
1848
1916
|
"src",
|
|
1849
1917
|
"dummy-client.ts"
|
|
@@ -1859,7 +1927,7 @@ var createConfig = async ({
|
|
|
1859
1927
|
const version2 = `${fullVersion.major}.${fullVersion.minor}`;
|
|
1860
1928
|
const config2 = {
|
|
1861
1929
|
root: configManager.spaRootPath,
|
|
1862
|
-
base: `/${basePath ? `${(
|
|
1930
|
+
base: `/${basePath ? `${normalizePath3(basePath)}/` : ""}${normalizePath3(
|
|
1863
1931
|
configManager.config.build.outputFolder
|
|
1864
1932
|
)}/`,
|
|
1865
1933
|
appType: "spa",
|
|
@@ -1922,13 +1990,14 @@ var createConfig = async ({
|
|
|
1922
1990
|
* `splitVendorChunkPlugin` is needed because `tinacms` is quite large,
|
|
1923
1991
|
* Vite's chunking strategy chokes on memory issues for smaller machines (ie. on CI).
|
|
1924
1992
|
*/
|
|
1925
|
-
(
|
|
1993
|
+
react({
|
|
1926
1994
|
babel: {
|
|
1927
1995
|
// Supresses the warning [NOTE] babel The code generator has deoptimised the styling of
|
|
1928
1996
|
compact: true
|
|
1929
|
-
}
|
|
1997
|
+
},
|
|
1998
|
+
fastRefresh: false
|
|
1930
1999
|
}),
|
|
1931
|
-
|
|
2000
|
+
splitVendorChunkPlugin(),
|
|
1932
2001
|
tinaTailwind(configManager.spaRootPath, configManager.prebuildFilePath),
|
|
1933
2002
|
...plugins
|
|
1934
2003
|
]
|
|
@@ -1937,21 +2006,21 @@ var createConfig = async ({
|
|
|
1937
2006
|
};
|
|
1938
2007
|
|
|
1939
2008
|
// src/next/vite/plugins.ts
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
2009
|
+
import { createFilter } from "@rollup/pluginutils";
|
|
2010
|
+
import fs6 from "fs";
|
|
2011
|
+
import { transformWithEsbuild } from "vite";
|
|
2012
|
+
import { transform as esbuildTransform } from "esbuild";
|
|
2013
|
+
import path7 from "path";
|
|
2014
|
+
import bodyParser from "body-parser";
|
|
2015
|
+
import cors from "cors";
|
|
2016
|
+
import { resolve as gqlResolve } from "@tinacms/graphql";
|
|
1948
2017
|
|
|
1949
2018
|
// src/next/commands/dev-command/server/media.ts
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
2019
|
+
import fs5 from "fs-extra";
|
|
2020
|
+
import path6, { join } from "path";
|
|
2021
|
+
import busboy from "busboy";
|
|
1953
2022
|
var createMediaRouter = (config2) => {
|
|
1954
|
-
const mediaFolder =
|
|
2023
|
+
const mediaFolder = path6.join(
|
|
1955
2024
|
config2.rootPath,
|
|
1956
2025
|
config2.publicFolder,
|
|
1957
2026
|
config2.mediaRoot
|
|
@@ -1975,12 +2044,12 @@ var createMediaRouter = (config2) => {
|
|
|
1975
2044
|
res.end(JSON.stringify(didDelete));
|
|
1976
2045
|
};
|
|
1977
2046
|
const handlePost = async function(req, res) {
|
|
1978
|
-
const bb = (
|
|
2047
|
+
const bb = busboy({ headers: req.headers });
|
|
1979
2048
|
bb.on("file", async (_name, file, _info) => {
|
|
1980
2049
|
const fullPath = decodeURI(req.url?.slice("/media/upload/".length));
|
|
1981
|
-
const saveTo =
|
|
1982
|
-
await
|
|
1983
|
-
file.pipe(
|
|
2050
|
+
const saveTo = path6.join(mediaFolder, ...fullPath.split("/"));
|
|
2051
|
+
await fs5.ensureDir(path6.dirname(saveTo));
|
|
2052
|
+
file.pipe(fs5.createWriteStream(saveTo));
|
|
1984
2053
|
});
|
|
1985
2054
|
bb.on("error", (error) => {
|
|
1986
2055
|
res.statusCode = 500;
|
|
@@ -2006,6 +2075,9 @@ var parseMediaFolder = (str) => {
|
|
|
2006
2075
|
return returnString;
|
|
2007
2076
|
};
|
|
2008
2077
|
var MediaModel = class {
|
|
2078
|
+
rootPath;
|
|
2079
|
+
publicFolder;
|
|
2080
|
+
mediaRoot;
|
|
2009
2081
|
constructor({ rootPath, publicFolder, mediaRoot }) {
|
|
2010
2082
|
this.rootPath = rootPath;
|
|
2011
2083
|
this.mediaRoot = mediaRoot;
|
|
@@ -2013,23 +2085,23 @@ var MediaModel = class {
|
|
|
2013
2085
|
}
|
|
2014
2086
|
async listMedia(args) {
|
|
2015
2087
|
try {
|
|
2016
|
-
const folderPath =
|
|
2088
|
+
const folderPath = join(
|
|
2017
2089
|
this.rootPath,
|
|
2018
2090
|
this.publicFolder,
|
|
2019
2091
|
this.mediaRoot,
|
|
2020
2092
|
decodeURIComponent(args.searchPath)
|
|
2021
2093
|
);
|
|
2022
2094
|
const searchPath = parseMediaFolder(args.searchPath);
|
|
2023
|
-
if (!await
|
|
2095
|
+
if (!await fs5.pathExists(folderPath)) {
|
|
2024
2096
|
return {
|
|
2025
2097
|
files: [],
|
|
2026
2098
|
directories: []
|
|
2027
2099
|
};
|
|
2028
2100
|
}
|
|
2029
|
-
const filesStr = await
|
|
2101
|
+
const filesStr = await fs5.readdir(folderPath);
|
|
2030
2102
|
const filesProm = filesStr.map(async (file) => {
|
|
2031
|
-
const filePath =
|
|
2032
|
-
const stat = await
|
|
2103
|
+
const filePath = join(folderPath, file);
|
|
2104
|
+
const stat = await fs5.stat(filePath);
|
|
2033
2105
|
let src = `/${file}`;
|
|
2034
2106
|
const isFile = stat.isFile();
|
|
2035
2107
|
if (!isFile) {
|
|
@@ -2085,14 +2157,14 @@ var MediaModel = class {
|
|
|
2085
2157
|
}
|
|
2086
2158
|
async deleteMedia(args) {
|
|
2087
2159
|
try {
|
|
2088
|
-
const file =
|
|
2160
|
+
const file = join(
|
|
2089
2161
|
this.rootPath,
|
|
2090
2162
|
this.publicFolder,
|
|
2091
2163
|
this.mediaRoot,
|
|
2092
2164
|
decodeURIComponent(args.searchPath)
|
|
2093
2165
|
);
|
|
2094
|
-
await
|
|
2095
|
-
await
|
|
2166
|
+
await fs5.stat(file);
|
|
2167
|
+
await fs5.remove(file);
|
|
2096
2168
|
return { ok: true };
|
|
2097
2169
|
} catch (error) {
|
|
2098
2170
|
console.error(error);
|
|
@@ -2150,9 +2222,9 @@ var transformTsxPlugin = ({
|
|
|
2150
2222
|
const plug = {
|
|
2151
2223
|
name: "transform-tsx",
|
|
2152
2224
|
async transform(code, id) {
|
|
2153
|
-
const extName =
|
|
2225
|
+
const extName = path7.extname(id);
|
|
2154
2226
|
if (extName.startsWith(".tsx") || extName.startsWith(".ts")) {
|
|
2155
|
-
const result = await (
|
|
2227
|
+
const result = await esbuildTransform(code, { loader: "tsx" });
|
|
2156
2228
|
return {
|
|
2157
2229
|
code: result.code
|
|
2158
2230
|
};
|
|
@@ -2171,8 +2243,8 @@ var devServerEndPointsPlugin = ({
|
|
|
2171
2243
|
const plug = {
|
|
2172
2244
|
name: "graphql-endpoints",
|
|
2173
2245
|
configureServer(server) {
|
|
2174
|
-
server.middlewares.use((
|
|
2175
|
-
server.middlewares.use(
|
|
2246
|
+
server.middlewares.use(cors());
|
|
2247
|
+
server.middlewares.use(bodyParser.json({ limit: "5mb" }));
|
|
2176
2248
|
server.middlewares.use(async (req, res, next) => {
|
|
2177
2249
|
const mediaPaths = configManager.config.media?.tina;
|
|
2178
2250
|
const mediaRouter = createMediaRouter({
|
|
@@ -2211,7 +2283,7 @@ var devServerEndPointsPlugin = ({
|
|
|
2211
2283
|
const { query, variables } = req.body;
|
|
2212
2284
|
let result;
|
|
2213
2285
|
await databaseLock(async () => {
|
|
2214
|
-
result = await (
|
|
2286
|
+
result = await gqlResolve({
|
|
2215
2287
|
config: {
|
|
2216
2288
|
useRelativeMedia: true
|
|
2217
2289
|
},
|
|
@@ -2247,13 +2319,13 @@ function viteTransformExtension({
|
|
|
2247
2319
|
include = "**/*.svg",
|
|
2248
2320
|
exclude
|
|
2249
2321
|
} = {}) {
|
|
2250
|
-
const filter =
|
|
2322
|
+
const filter = createFilter(include, exclude);
|
|
2251
2323
|
return {
|
|
2252
2324
|
name: "vite-plugin-svgr",
|
|
2253
2325
|
async transform(code, id) {
|
|
2254
2326
|
if (filter(id)) {
|
|
2255
2327
|
const { transform: transform2 } = await import("@svgr/core");
|
|
2256
|
-
const svgCode = await
|
|
2328
|
+
const svgCode = await fs6.promises.readFile(
|
|
2257
2329
|
id.replace(/\?.*$/, ""),
|
|
2258
2330
|
"utf8"
|
|
2259
2331
|
);
|
|
@@ -2263,7 +2335,7 @@ function viteTransformExtension({
|
|
|
2263
2335
|
previousExport: exportAsDefault ? null : code
|
|
2264
2336
|
}
|
|
2265
2337
|
});
|
|
2266
|
-
const res = await
|
|
2338
|
+
const res = await transformWithEsbuild(componentCode, id, {
|
|
2267
2339
|
loader: "jsx",
|
|
2268
2340
|
...esbuildOptions
|
|
2269
2341
|
});
|
|
@@ -2290,7 +2362,7 @@ var createDevServer = async (configManager, database, searchIndex, apiURL, noWat
|
|
|
2290
2362
|
}),
|
|
2291
2363
|
viteTransformExtension()
|
|
2292
2364
|
];
|
|
2293
|
-
return (
|
|
2365
|
+
return createViteServer(
|
|
2294
2366
|
await createConfig({
|
|
2295
2367
|
configManager,
|
|
2296
2368
|
database,
|
|
@@ -2320,37 +2392,30 @@ var createDevServer = async (configManager, database, searchIndex, apiURL, noWat
|
|
|
2320
2392
|
|
|
2321
2393
|
// src/next/commands/dev-command/index.ts
|
|
2322
2394
|
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
|
-
}
|
|
2395
|
+
static paths = [["dev"], ["server:start"]];
|
|
2396
|
+
// NOTE: camelCase commands for string options don't work if there's an `=` used https://github.com/arcanis/clipanion/issues/141
|
|
2397
|
+
watchFolders = Option2.String("-w,--watchFolders", {
|
|
2398
|
+
description: "DEPRECATED - a list of folders (relative to where this is being run) that the cli will watch for changes"
|
|
2399
|
+
});
|
|
2400
|
+
noWatch = Option2.Boolean("--noWatch", false, {
|
|
2401
|
+
description: "Don't regenerate config on file changes"
|
|
2402
|
+
});
|
|
2403
|
+
outputSearchIndexPath = Option2.String("--outputSearchIndexPath", {
|
|
2404
|
+
description: "Path to write the search index to"
|
|
2405
|
+
});
|
|
2406
|
+
noServer = Option2.Boolean("--no-server", false, {
|
|
2407
|
+
description: "Do not start the dev server"
|
|
2408
|
+
});
|
|
2409
|
+
indexingLock = new AsyncLock();
|
|
2410
|
+
// Prevent indexes and reads occurring at once
|
|
2411
|
+
static usage = Command2.Usage({
|
|
2412
|
+
category: `Commands`,
|
|
2413
|
+
description: `Builds Tina and starts the dev server`,
|
|
2414
|
+
examples: [
|
|
2415
|
+
[`A basic example`, `$0 dev`],
|
|
2416
|
+
[`A second example`, `$0 dev --rootPath`]
|
|
2417
|
+
]
|
|
2418
|
+
});
|
|
2354
2419
|
async catch(error) {
|
|
2355
2420
|
logger.error("Error occured during tinacms dev");
|
|
2356
2421
|
console.error(error);
|
|
@@ -2387,7 +2452,7 @@ var DevCommand = class extends BaseCommand {
|
|
|
2387
2452
|
} else {
|
|
2388
2453
|
database.clearCache();
|
|
2389
2454
|
}
|
|
2390
|
-
const { tinaSchema: tinaSchema2, graphQLSchema: graphQLSchema2, lookup, queryDoc, fragDoc } = await
|
|
2455
|
+
const { tinaSchema: tinaSchema2, graphQLSchema: graphQLSchema2, lookup, queryDoc, fragDoc } = await buildSchema(configManager.config);
|
|
2391
2456
|
const codegen2 = new Codegen({
|
|
2392
2457
|
isLocal: true,
|
|
2393
2458
|
configManager,
|
|
@@ -2401,29 +2466,32 @@ var DevCommand = class extends BaseCommand {
|
|
|
2401
2466
|
});
|
|
2402
2467
|
const apiURL2 = await codegen2.execute();
|
|
2403
2468
|
if (!configManager.isUsingLegacyFolder) {
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
const
|
|
2408
|
-
|
|
2409
|
-
|
|
2469
|
+
const schemaObject = await fs7.readJSON(
|
|
2470
|
+
configManager.generatedSchemaJSONPath
|
|
2471
|
+
);
|
|
2472
|
+
const lookupObject = await fs7.readJSON(
|
|
2473
|
+
configManager.generatedLookupJSONPath
|
|
2474
|
+
);
|
|
2475
|
+
const graphqlSchemaObject = await fs7.readJSON(
|
|
2476
|
+
configManager.generatedGraphQLJSONPath
|
|
2477
|
+
);
|
|
2410
2478
|
const tinaLockFilename = "tina-lock.json";
|
|
2411
2479
|
const tinaLockContent = JSON.stringify({
|
|
2412
2480
|
schema: schemaObject,
|
|
2413
2481
|
lookup: lookupObject,
|
|
2414
2482
|
graphql: graphqlSchemaObject
|
|
2415
2483
|
});
|
|
2416
|
-
|
|
2417
|
-
|
|
2484
|
+
fs7.writeFileSync(
|
|
2485
|
+
path8.join(configManager.tinaFolderPath, tinaLockFilename),
|
|
2418
2486
|
tinaLockContent
|
|
2419
2487
|
);
|
|
2420
2488
|
if (configManager.hasSeparateContentRoot()) {
|
|
2421
2489
|
const rootPath = await configManager.getTinaFolderPath(
|
|
2422
2490
|
configManager.contentRootPath
|
|
2423
2491
|
);
|
|
2424
|
-
const filePath =
|
|
2425
|
-
await
|
|
2426
|
-
await
|
|
2492
|
+
const filePath = path8.join(rootPath, tinaLockFilename);
|
|
2493
|
+
await fs7.ensureFile(filePath);
|
|
2494
|
+
await fs7.outputFile(filePath, tinaLockContent);
|
|
2427
2495
|
}
|
|
2428
2496
|
}
|
|
2429
2497
|
await this.indexContentWithSpinner({
|
|
@@ -2466,19 +2534,19 @@ ${dangerText(e.message)}
|
|
|
2466
2534
|
const { apiURL, graphQLSchema, tinaSchema } = await setup({
|
|
2467
2535
|
firstTime: true
|
|
2468
2536
|
});
|
|
2469
|
-
await
|
|
2470
|
-
await
|
|
2537
|
+
await fs7.outputFile(configManager.outputHTMLFilePath, devHTML(this.port));
|
|
2538
|
+
await fs7.outputFile(
|
|
2471
2539
|
configManager.outputGitignorePath,
|
|
2472
2540
|
"index.html\nassets/"
|
|
2473
2541
|
);
|
|
2474
|
-
const searchIndexClient = new
|
|
2542
|
+
const searchIndexClient = new LocalSearchIndexClient({
|
|
2475
2543
|
stopwordLanguages: configManager.config.search?.tina?.stopwordLanguages,
|
|
2476
2544
|
tokenSplitRegex: configManager.config.search?.tina?.tokenSplitRegex
|
|
2477
2545
|
});
|
|
2478
2546
|
await searchIndexClient.onStartIndexing();
|
|
2479
|
-
const searchIndexer = new
|
|
2547
|
+
const searchIndexer = new SearchIndexer({
|
|
2480
2548
|
batchSize: configManager.config.search?.indexBatchSize || 100,
|
|
2481
|
-
bridge: new
|
|
2549
|
+
bridge: new FilesystemBridge2(
|
|
2482
2550
|
configManager.rootPath,
|
|
2483
2551
|
configManager.contentRootPath
|
|
2484
2552
|
),
|
|
@@ -2519,7 +2587,7 @@ ${dangerText(e.message)}
|
|
|
2519
2587
|
);
|
|
2520
2588
|
await server.listen(Number(this.port));
|
|
2521
2589
|
if (!this.noWatch) {
|
|
2522
|
-
|
|
2590
|
+
chokidar.watch(configManager.watchList).on("change", async () => {
|
|
2523
2591
|
await dbLock(async () => {
|
|
2524
2592
|
logger.info(`Tina config change detected, rebuilding`);
|
|
2525
2593
|
await setup({ firstTime: false });
|
|
@@ -2581,11 +2649,11 @@ ${dangerText(e.message)}
|
|
|
2581
2649
|
// subItems: [
|
|
2582
2650
|
// {
|
|
2583
2651
|
// key: 'Custom queries',
|
|
2584
|
-
// value: 'https://tina.io/
|
|
2652
|
+
// value: 'https://tina.io/docs/r/content-api-overview',
|
|
2585
2653
|
// },
|
|
2586
2654
|
// {
|
|
2587
2655
|
// key: 'Visual editing',
|
|
2588
|
-
// value: 'https://tina.io/visual-editing',
|
|
2656
|
+
// value: 'https://tina.io/docs/r/visual-editing-setup',
|
|
2589
2657
|
// },
|
|
2590
2658
|
// ],
|
|
2591
2659
|
// },
|
|
@@ -2596,14 +2664,14 @@ ${dangerText(e.message)}
|
|
|
2596
2664
|
watchContentFiles(configManager, database, databaseLock, searchIndexer) {
|
|
2597
2665
|
const collectionContentFiles = [];
|
|
2598
2666
|
configManager.config.schema.collections.forEach((collection) => {
|
|
2599
|
-
const collectionGlob = `${
|
|
2667
|
+
const collectionGlob = `${path8.join(
|
|
2600
2668
|
configManager.contentRootPath,
|
|
2601
2669
|
collection.path
|
|
2602
2670
|
)}/**/*.${collection.format || "md"}`;
|
|
2603
2671
|
collectionContentFiles.push(collectionGlob);
|
|
2604
2672
|
});
|
|
2605
2673
|
let ready = false;
|
|
2606
|
-
|
|
2674
|
+
chokidar.watch(collectionContentFiles).on("ready", () => {
|
|
2607
2675
|
ready = true;
|
|
2608
2676
|
}).on("add", async (addedFile) => {
|
|
2609
2677
|
if (!ready) {
|
|
@@ -2640,28 +2708,35 @@ ${dangerText(e.message)}
|
|
|
2640
2708
|
await callback();
|
|
2641
2709
|
});
|
|
2642
2710
|
};
|
|
2643
|
-
|
|
2711
|
+
chokidar.watch(configManager.userQueriesAndFragmentsGlob).on("add", executeCallback).on("change", executeCallback).on("unlink", executeCallback);
|
|
2644
2712
|
}
|
|
2645
2713
|
};
|
|
2646
2714
|
|
|
2647
2715
|
// src/next/commands/build-command/index.ts
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2716
|
+
import crypto from "crypto";
|
|
2717
|
+
import path9 from "path";
|
|
2718
|
+
import { diff } from "@graphql-inspector/core";
|
|
2719
|
+
import { FilesystemBridge as FilesystemBridge3, buildSchema as buildSchema2 } from "@tinacms/graphql";
|
|
2720
|
+
import { parseURL as parseURL2 } from "@tinacms/schema-tools";
|
|
2721
|
+
import {
|
|
2722
|
+
SearchIndexer as SearchIndexer2,
|
|
2723
|
+
TinaCMSSearchIndexClient
|
|
2724
|
+
} from "@tinacms/search";
|
|
2725
|
+
import { Command as Command3, Option as Option3 } from "clipanion";
|
|
2726
|
+
import fs8 from "fs-extra";
|
|
2727
|
+
import {
|
|
2728
|
+
buildASTSchema as buildASTSchema2,
|
|
2729
|
+
buildClientSchema,
|
|
2730
|
+
getIntrospectionQuery
|
|
2731
|
+
} from "graphql";
|
|
2732
|
+
import Progress2 from "progress";
|
|
2658
2733
|
|
|
2659
2734
|
// src/utils/index.ts
|
|
2660
|
-
|
|
2735
|
+
import { ChangeType } from "@graphql-inspector/core";
|
|
2661
2736
|
var getFaqLink = (type) => {
|
|
2662
2737
|
switch (type) {
|
|
2663
|
-
case
|
|
2664
|
-
return "https://tina.io/docs/
|
|
2738
|
+
case ChangeType.FieldRemoved: {
|
|
2739
|
+
return "https://tina.io/docs/r/FAQ/#2-how-do-i-resolve-the-local-graphql-schema-doesnt-match-the-remote-graphql-schema-error";
|
|
2665
2740
|
}
|
|
2666
2741
|
default:
|
|
2667
2742
|
return null;
|
|
@@ -2682,7 +2757,7 @@ async function sleepAndCallFunc({
|
|
|
2682
2757
|
}
|
|
2683
2758
|
|
|
2684
2759
|
// src/next/commands/build-command/server.ts
|
|
2685
|
-
|
|
2760
|
+
import { build as build2 } from "vite";
|
|
2686
2761
|
var buildProductionSpa = async (configManager, database, apiURL) => {
|
|
2687
2762
|
const publicEnv = {};
|
|
2688
2763
|
Object.keys(process.env).forEach((key) => {
|
|
@@ -2716,12 +2791,12 @@ var buildProductionSpa = async (configManager, database, apiURL) => {
|
|
|
2716
2791
|
}
|
|
2717
2792
|
}
|
|
2718
2793
|
});
|
|
2719
|
-
return (
|
|
2794
|
+
return build2(config2);
|
|
2720
2795
|
};
|
|
2721
2796
|
|
|
2722
2797
|
// src/next/commands/build-command/waitForDB.ts
|
|
2723
|
-
|
|
2724
|
-
|
|
2798
|
+
import { parseURL } from "@tinacms/schema-tools";
|
|
2799
|
+
import Progress from "progress";
|
|
2725
2800
|
var POLLING_INTERVAL = 5e3;
|
|
2726
2801
|
var STATUS_INPROGRESS = "inprogress";
|
|
2727
2802
|
var STATUS_COMPLETE = "complete";
|
|
@@ -2734,14 +2809,14 @@ var IndexFailedError = class extends Error {
|
|
|
2734
2809
|
};
|
|
2735
2810
|
var waitForDB = async (config2, apiUrl, previewName, verbose) => {
|
|
2736
2811
|
const token = config2.token;
|
|
2737
|
-
const { clientId, branch, isLocalClient, host } =
|
|
2812
|
+
const { clientId, branch, isLocalClient, host } = parseURL(apiUrl);
|
|
2738
2813
|
if (isLocalClient || !host || !clientId || !branch) {
|
|
2739
2814
|
if (verbose) {
|
|
2740
2815
|
logger.info(logText("Not using TinaCloud, skipping DB check"));
|
|
2741
2816
|
}
|
|
2742
2817
|
return;
|
|
2743
2818
|
}
|
|
2744
|
-
const bar2 = new
|
|
2819
|
+
const bar2 = new Progress(
|
|
2745
2820
|
"Checking indexing process in TinaCloud... :prog",
|
|
2746
2821
|
1
|
|
2747
2822
|
);
|
|
@@ -2804,51 +2879,44 @@ var waitForDB = async (config2, apiUrl, previewName, verbose) => {
|
|
|
2804
2879
|
|
|
2805
2880
|
// src/next/commands/build-command/index.ts
|
|
2806
2881
|
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
|
-
}
|
|
2882
|
+
static paths = [["build"]];
|
|
2883
|
+
localOption = Option3.Boolean("--local", {
|
|
2884
|
+
description: "Starts local Graphql server and builds the local client instead of production client"
|
|
2885
|
+
});
|
|
2886
|
+
skipIndexing = Option3.Boolean("--skip-indexing", false, {
|
|
2887
|
+
description: "Skips indexing the content. This can be used for building the site without indexing the content (defaults to false)"
|
|
2888
|
+
});
|
|
2889
|
+
partialReindex = Option3.Boolean("--partial-reindex", false, {
|
|
2890
|
+
description: "Re-indexes only the content that has changed since the last build (defaults to false). Not currently supported for separate content repos."
|
|
2891
|
+
});
|
|
2892
|
+
tinaGraphQLVersion = Option3.String("--tina-graphql-version", {
|
|
2893
|
+
description: "Specify the version of @tinacms/graphql to use (defaults to latest)"
|
|
2894
|
+
});
|
|
2895
|
+
/**
|
|
2896
|
+
* 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
|
|
2897
|
+
*/
|
|
2898
|
+
skipCloudChecks = Option3.Boolean("--skip-cloud-checks", false, {
|
|
2899
|
+
description: "Skips checking the provided cloud config."
|
|
2900
|
+
});
|
|
2901
|
+
skipSearchIndex = Option3.Boolean("--skip-search-index", false, {
|
|
2902
|
+
description: "Skip indexing the site for search"
|
|
2903
|
+
});
|
|
2904
|
+
upstreamBranch = Option3.String("--upstream-branch", {
|
|
2905
|
+
description: "Optional upstream branch with the schema. If not specified, default will be used."
|
|
2906
|
+
});
|
|
2907
|
+
previewBaseBranch = Option3.String("--preview-base-branch", {
|
|
2908
|
+
description: "The base branch for the preview"
|
|
2909
|
+
});
|
|
2910
|
+
previewName = Option3.String("--preview-name", {
|
|
2911
|
+
description: "The name of the preview branch"
|
|
2912
|
+
});
|
|
2913
|
+
noClientBuildCache = Option3.Boolean("--no-client-build-cache", false, {
|
|
2914
|
+
description: "Disables the client build cache"
|
|
2915
|
+
});
|
|
2916
|
+
static usage = Command3.Usage({
|
|
2917
|
+
category: `Commands`,
|
|
2918
|
+
description: `Build the CMS and autogenerated modules for usage with TinaCloud`
|
|
2919
|
+
});
|
|
2852
2920
|
async catch(error) {
|
|
2853
2921
|
console.error(error);
|
|
2854
2922
|
process.exit(1);
|
|
@@ -2893,7 +2961,7 @@ ${dangerText(e.message)}`);
|
|
|
2893
2961
|
configManager,
|
|
2894
2962
|
Number(this.datalayerPort)
|
|
2895
2963
|
);
|
|
2896
|
-
const { queryDoc, fragDoc, graphQLSchema, tinaSchema, lookup } = await (
|
|
2964
|
+
const { queryDoc, fragDoc, graphQLSchema, tinaSchema, lookup } = await buildSchema2(configManager.config);
|
|
2897
2965
|
const codegen2 = new Codegen({
|
|
2898
2966
|
configManager,
|
|
2899
2967
|
port: this.localOption ? Number(this.port) : void 0,
|
|
@@ -3001,7 +3069,7 @@ ${dangerText(e.message)}
|
|
|
3001
3069
|
}
|
|
3002
3070
|
}
|
|
3003
3071
|
await buildProductionSpa(configManager, database, codegen2.productionUrl);
|
|
3004
|
-
await
|
|
3072
|
+
await fs8.outputFile(
|
|
3005
3073
|
configManager.outputGitignorePath,
|
|
3006
3074
|
"index.html\nassets/"
|
|
3007
3075
|
);
|
|
@@ -3033,7 +3101,7 @@ ${dangerText(e.message)}
|
|
|
3033
3101
|
"indexerToken not configured in tina search configuration."
|
|
3034
3102
|
);
|
|
3035
3103
|
}
|
|
3036
|
-
client = new
|
|
3104
|
+
client = new TinaCMSSearchIndexClient({
|
|
3037
3105
|
apiUrl: `${configManager.config.tinaioConfig?.contentApiUrlOverride || "https://content.tinajs.io"}/searchIndex/${configManager.config?.clientId}`,
|
|
3038
3106
|
branch: configManager.config?.branch,
|
|
3039
3107
|
indexerToken: configManager.config?.search?.tina?.indexerToken,
|
|
@@ -3042,9 +3110,9 @@ ${dangerText(e.message)}
|
|
|
3042
3110
|
} else {
|
|
3043
3111
|
client = configManager.config?.search?.searchClient;
|
|
3044
3112
|
}
|
|
3045
|
-
const searchIndexer = new
|
|
3113
|
+
const searchIndexer = new SearchIndexer2({
|
|
3046
3114
|
batchSize: configManager.config.search?.indexBatchSize || 100,
|
|
3047
|
-
bridge: new
|
|
3115
|
+
bridge: new FilesystemBridge3(
|
|
3048
3116
|
configManager.rootPath,
|
|
3049
3117
|
configManager.contentRootPath
|
|
3050
3118
|
),
|
|
@@ -3114,8 +3182,8 @@ ${dangerText(e.message)}
|
|
|
3114
3182
|
const MAX_RETRIES = 5;
|
|
3115
3183
|
const { config: config2 } = configManager;
|
|
3116
3184
|
const token = config2.token;
|
|
3117
|
-
const { clientId, branch, host } = (
|
|
3118
|
-
const bar2 = new
|
|
3185
|
+
const { clientId, branch, host } = parseURL2(apiURL);
|
|
3186
|
+
const bar2 = new Progress2("Checking clientId and token. :prog", 1);
|
|
3119
3187
|
const getBranchInfo = async () => {
|
|
3120
3188
|
const url = `https://${host}/db/${clientId}/status/${previewBaseBranch || branch}`;
|
|
3121
3189
|
const branchInfo2 = {
|
|
@@ -3169,7 +3237,7 @@ ${dangerText(e.message)}
|
|
|
3169
3237
|
bar2.tick({
|
|
3170
3238
|
prog: "\u2705"
|
|
3171
3239
|
});
|
|
3172
|
-
const branchBar = new
|
|
3240
|
+
const branchBar = new Progress2(
|
|
3173
3241
|
`Checking branch '${config2.branch}' is on TinaCloud. :prog`,
|
|
3174
3242
|
1
|
|
3175
3243
|
);
|
|
@@ -3209,7 +3277,7 @@ ${dangerText(e.message)}
|
|
|
3209
3277
|
async syncProject(configManager, apiURL, options) {
|
|
3210
3278
|
const { config: config2 } = configManager;
|
|
3211
3279
|
const token = config2.token;
|
|
3212
|
-
const { clientId, branch, host } = (
|
|
3280
|
+
const { clientId, branch, host } = parseURL2(apiURL);
|
|
3213
3281
|
const { previewName, previewBaseBranch, upstreamBranch } = options || {};
|
|
3214
3282
|
let url = `https://${host}/db/${clientId}/reset/${branch}?refreshSchema=true&skipIfSchemaCurrent=true`;
|
|
3215
3283
|
if (upstreamBranch && previewBaseBranch && previewName) {
|
|
@@ -3219,7 +3287,7 @@ ${dangerText(e.message)}
|
|
|
3219
3287
|
} else if (upstreamBranch && !previewBaseBranch && !previewName) {
|
|
3220
3288
|
url = `https://${host}/db/${clientId}/reset/${branch}?refreshSchema=true&skipIfSchemaCurrent=true&upstreamBranch=${upstreamBranch}`;
|
|
3221
3289
|
}
|
|
3222
|
-
const bar2 = new
|
|
3290
|
+
const bar2 = new Progress2("Syncing Project. :prog", 1);
|
|
3223
3291
|
try {
|
|
3224
3292
|
const res = await request({
|
|
3225
3293
|
token,
|
|
@@ -3260,7 +3328,7 @@ ${dangerText(e.message)}
|
|
|
3260
3328
|
}
|
|
3261
3329
|
}
|
|
3262
3330
|
async checkGraphqlSchema(configManager, database, apiURL, timestamp) {
|
|
3263
|
-
const bar2 = new
|
|
3331
|
+
const bar2 = new Progress2(
|
|
3264
3332
|
"Checking local GraphQL Schema matches server. :prog",
|
|
3265
3333
|
1
|
|
3266
3334
|
);
|
|
@@ -3282,11 +3350,11 @@ Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
|
3282
3350
|
}
|
|
3283
3351
|
throw new Error(errorMessage);
|
|
3284
3352
|
}
|
|
3285
|
-
const remoteGqlSchema =
|
|
3353
|
+
const remoteGqlSchema = buildClientSchema(remoteSchema);
|
|
3286
3354
|
const localSchemaDocument = await database.getGraphQLSchemaFromBridge();
|
|
3287
|
-
const localGraphqlSchema = (
|
|
3355
|
+
const localGraphqlSchema = buildASTSchema2(localSchemaDocument);
|
|
3288
3356
|
try {
|
|
3289
|
-
const diffResult = await
|
|
3357
|
+
const diffResult = await diff(remoteGqlSchema, localGraphqlSchema);
|
|
3290
3358
|
if (diffResult.length === 0) {
|
|
3291
3359
|
bar2.tick({
|
|
3292
3360
|
prog: "\u2705"
|
|
@@ -3334,13 +3402,13 @@ Additional info:
|
|
|
3334
3402
|
}
|
|
3335
3403
|
}
|
|
3336
3404
|
async checkTinaSchema(configManager, database, apiURL, previewName, verbose, timestamp) {
|
|
3337
|
-
const bar2 = new
|
|
3405
|
+
const bar2 = new Progress2(
|
|
3338
3406
|
"Checking local Tina Schema matches server. :prog",
|
|
3339
3407
|
1
|
|
3340
3408
|
);
|
|
3341
3409
|
const { config: config2 } = configManager;
|
|
3342
3410
|
const token = config2.token;
|
|
3343
|
-
const { clientId, branch, isLocalClient, host } = (
|
|
3411
|
+
const { clientId, branch, isLocalClient, host } = parseURL2(apiURL);
|
|
3344
3412
|
if (isLocalClient || !host || !clientId || !branch) {
|
|
3345
3413
|
if (verbose) {
|
|
3346
3414
|
logger.info(logText("Not using TinaCloud, skipping Tina Schema check"));
|
|
@@ -3368,11 +3436,11 @@ Additional info: Branch: ${config2.branch}, Client ID: ${config2.clientId} `;
|
|
|
3368
3436
|
}
|
|
3369
3437
|
const localTinaSchema = JSON.parse(
|
|
3370
3438
|
await database.bridge.get(
|
|
3371
|
-
|
|
3439
|
+
path9.join(database.tinaDirectory, "__generated__", "_schema.json")
|
|
3372
3440
|
)
|
|
3373
3441
|
);
|
|
3374
3442
|
localTinaSchema.version = void 0;
|
|
3375
|
-
const localTinaSchemaSha =
|
|
3443
|
+
const localTinaSchemaSha = crypto.createHash("sha256").update(JSON.stringify(localTinaSchema)).digest("hex");
|
|
3376
3444
|
if (localTinaSchemaSha === remoteTinaSchemaSha) {
|
|
3377
3445
|
bar2.tick({
|
|
3378
3446
|
prog: "\u2705"
|
|
@@ -3423,12 +3491,12 @@ async function request(args) {
|
|
|
3423
3491
|
Message from server: ${json.message}`;
|
|
3424
3492
|
}
|
|
3425
3493
|
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/
|
|
3494
|
+
`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
3495
|
);
|
|
3428
3496
|
}
|
|
3429
3497
|
if (json.errors) {
|
|
3430
3498
|
throw new Error(
|
|
3431
|
-
`Unable to fetch, please see our FAQ for more information: https://tina.io/docs/
|
|
3499
|
+
`Unable to fetch, please see our FAQ for more information: https://tina.io/docs/r/FAQ/
|
|
3432
3500
|
|
|
3433
3501
|
Errors:
|
|
3434
3502
|
${json.errors.map((error) => error.message).join("\n")}`
|
|
@@ -3450,7 +3518,7 @@ var fetchRemoteGraphqlSchema = async ({
|
|
|
3450
3518
|
headers.append("X-API-KEY", token);
|
|
3451
3519
|
}
|
|
3452
3520
|
const body = JSON.stringify({
|
|
3453
|
-
query:
|
|
3521
|
+
query: getIntrospectionQuery(),
|
|
3454
3522
|
variables: {}
|
|
3455
3523
|
});
|
|
3456
3524
|
headers.append("Content-Type", "application/json");
|
|
@@ -3483,14 +3551,14 @@ var fetchSchemaSha = async ({
|
|
|
3483
3551
|
};
|
|
3484
3552
|
|
|
3485
3553
|
// src/next/commands/audit-command/index.ts
|
|
3486
|
-
|
|
3487
|
-
|
|
3554
|
+
import { Command as Command4, Option as Option4 } from "clipanion";
|
|
3555
|
+
import { buildSchema as buildSchema3 } from "@tinacms/graphql";
|
|
3488
3556
|
|
|
3489
3557
|
// src/next/commands/audit-command/audit.ts
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3558
|
+
import prompts from "prompts";
|
|
3559
|
+
import { Telemetry } from "@tinacms/metrics";
|
|
3560
|
+
import { resolve } from "@tinacms/graphql";
|
|
3561
|
+
import chalk5 from "chalk";
|
|
3494
3562
|
var audit = async ({
|
|
3495
3563
|
database,
|
|
3496
3564
|
clean,
|
|
@@ -3498,7 +3566,7 @@ var audit = async ({
|
|
|
3498
3566
|
noTelemetry,
|
|
3499
3567
|
verbose
|
|
3500
3568
|
}) => {
|
|
3501
|
-
const telemetry = new
|
|
3569
|
+
const telemetry = new Telemetry({ disabled: noTelemetry });
|
|
3502
3570
|
await telemetry.submitRecord({
|
|
3503
3571
|
event: {
|
|
3504
3572
|
name: "tinacms:cli:audit:invoke",
|
|
@@ -3508,25 +3576,25 @@ var audit = async ({
|
|
|
3508
3576
|
});
|
|
3509
3577
|
if (clean) {
|
|
3510
3578
|
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 ${
|
|
3579
|
+
`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
3580
|
"clean git tree"
|
|
3513
3581
|
)} so unwanted changes can be undone.
|
|
3514
3582
|
|
|
3515
3583
|
`
|
|
3516
3584
|
);
|
|
3517
|
-
const res = await (
|
|
3585
|
+
const res = await prompts({
|
|
3518
3586
|
name: "useClean",
|
|
3519
3587
|
type: "confirm",
|
|
3520
3588
|
message: `Do you want to continue?`
|
|
3521
3589
|
});
|
|
3522
3590
|
if (!res.useClean) {
|
|
3523
|
-
logger.warn(
|
|
3591
|
+
logger.warn(chalk5.yellowBright("\u26A0\uFE0F Audit not complete"));
|
|
3524
3592
|
process.exit(0);
|
|
3525
3593
|
}
|
|
3526
3594
|
}
|
|
3527
3595
|
if (useDefaultValues && !clean) {
|
|
3528
3596
|
logger.warn(
|
|
3529
|
-
|
|
3597
|
+
chalk5.yellowBright(
|
|
3530
3598
|
"WARNING: using the `--useDefaultValues` without the `--clean` flag has no effect. Please re-run audit and add the `--clean` flag"
|
|
3531
3599
|
)
|
|
3532
3600
|
);
|
|
@@ -3554,10 +3622,10 @@ var audit = async ({
|
|
|
3554
3622
|
}
|
|
3555
3623
|
if (error) {
|
|
3556
3624
|
logger.error(
|
|
3557
|
-
|
|
3625
|
+
chalk5.redBright(`\u203C\uFE0F Audit ${chalk5.bold("failed")} with errors`)
|
|
3558
3626
|
);
|
|
3559
3627
|
} else {
|
|
3560
|
-
logger.info(
|
|
3628
|
+
logger.info(chalk5.greenBright("\u2705 Audit passed"));
|
|
3561
3629
|
}
|
|
3562
3630
|
};
|
|
3563
3631
|
var auditDocuments = async (args) => {
|
|
@@ -3574,7 +3642,7 @@ var auditDocuments = async (args) => {
|
|
|
3574
3642
|
}
|
|
3575
3643
|
}
|
|
3576
3644
|
}`;
|
|
3577
|
-
const docResult = await
|
|
3645
|
+
const docResult = await resolve({
|
|
3578
3646
|
database,
|
|
3579
3647
|
query: documentQuery,
|
|
3580
3648
|
variables: {},
|
|
@@ -3585,11 +3653,11 @@ var auditDocuments = async (args) => {
|
|
|
3585
3653
|
if (docResult.errors) {
|
|
3586
3654
|
error = true;
|
|
3587
3655
|
docResult.errors.forEach((err) => {
|
|
3588
|
-
logger.error(
|
|
3656
|
+
logger.error(chalk5.red(err.message));
|
|
3589
3657
|
if (err.originalError.originalError) {
|
|
3590
3658
|
logger.error(
|
|
3591
3659
|
// @ts-ignore FIXME: this doesn't seem right
|
|
3592
|
-
|
|
3660
|
+
chalk5.red(` ${err.originalError.originalError.message}`)
|
|
3593
3661
|
);
|
|
3594
3662
|
}
|
|
3595
3663
|
});
|
|
@@ -3616,7 +3684,7 @@ var auditDocuments = async (args) => {
|
|
|
3616
3684
|
params: $params
|
|
3617
3685
|
){__typename}
|
|
3618
3686
|
}`;
|
|
3619
|
-
const mutationRes = await
|
|
3687
|
+
const mutationRes = await resolve({
|
|
3620
3688
|
database,
|
|
3621
3689
|
query: mutation,
|
|
3622
3690
|
variables: {
|
|
@@ -3631,7 +3699,7 @@ var auditDocuments = async (args) => {
|
|
|
3631
3699
|
if (mutationRes.errors) {
|
|
3632
3700
|
mutationRes.errors.forEach((err) => {
|
|
3633
3701
|
error = true;
|
|
3634
|
-
logger.error(
|
|
3702
|
+
logger.error(chalk5.red(err.message));
|
|
3635
3703
|
});
|
|
3636
3704
|
}
|
|
3637
3705
|
}
|
|
@@ -3648,38 +3716,31 @@ function filterObject(obj) {
|
|
|
3648
3716
|
}
|
|
3649
3717
|
|
|
3650
3718
|
// 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
|
-
}
|
|
3719
|
+
import { AuditFileSystemBridge } from "@tinacms/graphql";
|
|
3720
|
+
var AuditCommand = class extends Command4 {
|
|
3721
|
+
static paths = [["audit"]];
|
|
3722
|
+
rootPath = Option4.String("--rootPath", {
|
|
3723
|
+
description: "Specify the root directory to run the CLI from"
|
|
3724
|
+
});
|
|
3725
|
+
verbose = Option4.Boolean("-v,--verbose", false, {
|
|
3726
|
+
description: "increase verbosity of logged output"
|
|
3727
|
+
});
|
|
3728
|
+
clean = Option4.Boolean("--clean", false, {
|
|
3729
|
+
description: "Clean the output"
|
|
3730
|
+
});
|
|
3731
|
+
useDefaultValues = Option4.Boolean("--useDefaultValues", false, {
|
|
3732
|
+
description: "When cleaning the output, use defaults on the config"
|
|
3733
|
+
});
|
|
3734
|
+
noTelemetry = Option4.Boolean("--noTelemetry", false, {
|
|
3735
|
+
description: "Disable anonymous telemetry that is collected"
|
|
3736
|
+
});
|
|
3737
|
+
datalayerPort = Option4.String("--datalayer-port", "9000", {
|
|
3738
|
+
description: "Specify a port to run the datalayer server on. (default 9000)"
|
|
3739
|
+
});
|
|
3740
|
+
static usage = Command4.Usage({
|
|
3741
|
+
category: `Commands`,
|
|
3742
|
+
description: `Audit config and content files`
|
|
3743
|
+
});
|
|
3683
3744
|
async catch(error) {
|
|
3684
3745
|
logger.error("Error occured during tinacms audit");
|
|
3685
3746
|
if (this.verbose) {
|
|
@@ -3700,9 +3761,9 @@ var AuditCommand = class extends import_clipanion4.Command {
|
|
|
3700
3761
|
const database = await createAndInitializeDatabase(
|
|
3701
3762
|
configManager,
|
|
3702
3763
|
Number(this.datalayerPort),
|
|
3703
|
-
this.clean ? void 0 : new
|
|
3764
|
+
this.clean ? void 0 : new AuditFileSystemBridge(configManager.rootPath)
|
|
3704
3765
|
);
|
|
3705
|
-
const { tinaSchema, graphQLSchema, lookup } = await (
|
|
3766
|
+
const { tinaSchema, graphQLSchema, lookup } = await buildSchema3(
|
|
3706
3767
|
configManager.config
|
|
3707
3768
|
);
|
|
3708
3769
|
const warnings = [];
|
|
@@ -3735,29 +3796,29 @@ var AuditCommand = class extends import_clipanion4.Command {
|
|
|
3735
3796
|
};
|
|
3736
3797
|
|
|
3737
3798
|
// src/next/commands/init-command/index.ts
|
|
3738
|
-
|
|
3799
|
+
import { Command as Command6, Option as Option6 } from "clipanion";
|
|
3739
3800
|
|
|
3740
3801
|
// src/cmds/init/detectEnvironment.ts
|
|
3741
|
-
|
|
3742
|
-
|
|
3802
|
+
import fs9 from "fs-extra";
|
|
3803
|
+
import path10 from "path";
|
|
3743
3804
|
var checkGitignoreForItem = async ({
|
|
3744
3805
|
baseDir,
|
|
3745
3806
|
line
|
|
3746
3807
|
}) => {
|
|
3747
|
-
const gitignoreContent =
|
|
3808
|
+
const gitignoreContent = fs9.readFileSync(path10.join(baseDir, ".gitignore")).toString();
|
|
3748
3809
|
return gitignoreContent.split("\n").some((item) => item === line);
|
|
3749
3810
|
};
|
|
3750
3811
|
var makeGeneratedFile = async (name2, generatedFileType, parentPath, opts) => {
|
|
3751
3812
|
const result = {
|
|
3752
|
-
fullPathTS:
|
|
3813
|
+
fullPathTS: path10.join(
|
|
3753
3814
|
parentPath,
|
|
3754
3815
|
`${name2}.${opts?.typescriptSuffix || opts?.extensionOverride || "ts"}`
|
|
3755
3816
|
),
|
|
3756
|
-
fullPathJS:
|
|
3817
|
+
fullPathJS: path10.join(
|
|
3757
3818
|
parentPath,
|
|
3758
3819
|
`${name2}.${opts?.extensionOverride || "js"}`
|
|
3759
3820
|
),
|
|
3760
|
-
fullPathOverride: opts?.extensionOverride ?
|
|
3821
|
+
fullPathOverride: opts?.extensionOverride ? path10.join(parentPath, `${name2}.${opts?.extensionOverride}`) : "",
|
|
3761
3822
|
generatedFileType,
|
|
3762
3823
|
name: name2,
|
|
3763
3824
|
parentPath,
|
|
@@ -3775,8 +3836,8 @@ var makeGeneratedFile = async (name2, generatedFileType, parentPath, opts) => {
|
|
|
3775
3836
|
};
|
|
3776
3837
|
}
|
|
3777
3838
|
};
|
|
3778
|
-
result.typescriptExists = await
|
|
3779
|
-
result.javascriptExists = await
|
|
3839
|
+
result.typescriptExists = await fs9.pathExists(result.fullPathTS);
|
|
3840
|
+
result.javascriptExists = await fs9.pathExists(result.fullPathJS);
|
|
3780
3841
|
return result;
|
|
3781
3842
|
};
|
|
3782
3843
|
var detectEnvironment = async ({
|
|
@@ -3785,21 +3846,21 @@ var detectEnvironment = async ({
|
|
|
3785
3846
|
rootPath,
|
|
3786
3847
|
debug = false
|
|
3787
3848
|
}) => {
|
|
3788
|
-
const hasForestryConfig = await
|
|
3789
|
-
|
|
3849
|
+
const hasForestryConfig = await fs9.pathExists(
|
|
3850
|
+
path10.join(pathToForestryConfig, ".forestry", "settings.yml")
|
|
3790
3851
|
);
|
|
3791
|
-
const sampleContentPath =
|
|
3852
|
+
const sampleContentPath = path10.join(
|
|
3792
3853
|
baseDir,
|
|
3793
3854
|
"content",
|
|
3794
3855
|
"posts",
|
|
3795
3856
|
"hello-world.md"
|
|
3796
3857
|
);
|
|
3797
|
-
const usingSrc =
|
|
3798
|
-
const tinaFolder =
|
|
3858
|
+
const usingSrc = fs9.pathExistsSync(path10.join(baseDir, "src")) && (fs9.pathExistsSync(path10.join(baseDir, "src", "app")) || fs9.pathExistsSync(path10.join(baseDir, "src", "pages")));
|
|
3859
|
+
const tinaFolder = path10.join(baseDir, "tina");
|
|
3799
3860
|
const tinaConfigExists = Boolean(
|
|
3800
3861
|
// Does the tina folder exist?
|
|
3801
|
-
await
|
|
3802
|
-
(await
|
|
3862
|
+
await fs9.pathExists(tinaFolder) && // Does the tina folder contain a config file?
|
|
3863
|
+
(await fs9.readdir(tinaFolder)).find((x) => x.includes("config"))
|
|
3803
3864
|
);
|
|
3804
3865
|
const pagesDir = [baseDir, usingSrc ? "src" : false, "pages"].filter(
|
|
3805
3866
|
Boolean
|
|
@@ -3811,12 +3872,12 @@ var detectEnvironment = async ({
|
|
|
3811
3872
|
"next-api-handler": await makeGeneratedFile(
|
|
3812
3873
|
"[...routes]",
|
|
3813
3874
|
"next-api-handler",
|
|
3814
|
-
|
|
3875
|
+
path10.join(...pagesDir, "api", "tina")
|
|
3815
3876
|
),
|
|
3816
3877
|
"reactive-example": await makeGeneratedFile(
|
|
3817
3878
|
"[filename]",
|
|
3818
3879
|
"reactive-example",
|
|
3819
|
-
|
|
3880
|
+
path10.join(...pagesDir, "demo", "blog"),
|
|
3820
3881
|
{
|
|
3821
3882
|
typescriptSuffix: "tsx"
|
|
3822
3883
|
}
|
|
@@ -3824,22 +3885,22 @@ var detectEnvironment = async ({
|
|
|
3824
3885
|
"users-json": await makeGeneratedFile(
|
|
3825
3886
|
"index",
|
|
3826
3887
|
"users-json",
|
|
3827
|
-
|
|
3888
|
+
path10.join(baseDir, "content", "users"),
|
|
3828
3889
|
{ extensionOverride: "json" }
|
|
3829
3890
|
),
|
|
3830
3891
|
"sample-content": await makeGeneratedFile(
|
|
3831
3892
|
"hello-world",
|
|
3832
3893
|
"sample-content",
|
|
3833
|
-
|
|
3894
|
+
path10.join(baseDir, "content", "posts"),
|
|
3834
3895
|
{ extensionOverride: "md" }
|
|
3835
3896
|
)
|
|
3836
3897
|
};
|
|
3837
|
-
const hasSampleContent = await
|
|
3838
|
-
const hasPackageJSON = await
|
|
3898
|
+
const hasSampleContent = await fs9.pathExists(sampleContentPath);
|
|
3899
|
+
const hasPackageJSON = await fs9.pathExists("package.json");
|
|
3839
3900
|
let hasTinaDeps = false;
|
|
3840
3901
|
if (hasPackageJSON) {
|
|
3841
3902
|
try {
|
|
3842
|
-
const packageJSON = await
|
|
3903
|
+
const packageJSON = await fs9.readJSON("package.json");
|
|
3843
3904
|
const deps = [];
|
|
3844
3905
|
if (packageJSON?.dependencies) {
|
|
3845
3906
|
deps.push(...Object.keys(packageJSON.dependencies));
|
|
@@ -3856,15 +3917,15 @@ var detectEnvironment = async ({
|
|
|
3856
3917
|
);
|
|
3857
3918
|
}
|
|
3858
3919
|
}
|
|
3859
|
-
const hasGitIgnore = await
|
|
3920
|
+
const hasGitIgnore = await fs9.pathExists(path10.join(".gitignore"));
|
|
3860
3921
|
const hasGitIgnoreNodeModules = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: "node_modules" });
|
|
3861
3922
|
const hasEnvTina = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: ".env.tina" });
|
|
3862
3923
|
const hasGitIgnoreEnv = hasGitIgnore && await checkGitignoreForItem({ baseDir, line: ".env" });
|
|
3863
3924
|
let frontMatterFormat;
|
|
3864
3925
|
if (hasForestryConfig) {
|
|
3865
|
-
const hugoConfigPath =
|
|
3866
|
-
if (await
|
|
3867
|
-
const hugoConfig = await
|
|
3926
|
+
const hugoConfigPath = path10.join(rootPath, "config.toml");
|
|
3927
|
+
if (await fs9.pathExists(hugoConfigPath)) {
|
|
3928
|
+
const hugoConfig = await fs9.readFile(hugoConfigPath, "utf8");
|
|
3868
3929
|
const metaDataFormat = hugoConfig.toString().match(/metaDataFormat = "(.*)"/)?.[1];
|
|
3869
3930
|
if (metaDataFormat && (metaDataFormat === "yaml" || metaDataFormat === "toml" || metaDataFormat === "json")) {
|
|
3870
3931
|
frontMatterFormat = metaDataFormat;
|
|
@@ -3895,10 +3956,10 @@ var detectEnvironment = async ({
|
|
|
3895
3956
|
var detectEnvironment_default = detectEnvironment;
|
|
3896
3957
|
|
|
3897
3958
|
// src/cmds/init/prompts/index.ts
|
|
3898
|
-
|
|
3959
|
+
import prompts6 from "prompts";
|
|
3899
3960
|
|
|
3900
3961
|
// src/cmds/init/prompts/askTinaCloudSetup.ts
|
|
3901
|
-
|
|
3962
|
+
import prompts2 from "prompts";
|
|
3902
3963
|
var tinaCloudSetupQuestions = [
|
|
3903
3964
|
{
|
|
3904
3965
|
name: "clientId",
|
|
@@ -3920,7 +3981,7 @@ ${logText(
|
|
|
3920
3981
|
}
|
|
3921
3982
|
];
|
|
3922
3983
|
var askTinaCloudSetup = async ({ config: config2 }) => {
|
|
3923
|
-
const { clientId, token } = await (
|
|
3984
|
+
const { clientId, token } = await prompts2(tinaCloudSetupQuestions);
|
|
3924
3985
|
config2.envVars.push(
|
|
3925
3986
|
{
|
|
3926
3987
|
key: "NEXT_PUBLIC_TINA_CLIENT_ID",
|
|
@@ -3934,7 +3995,7 @@ var askTinaCloudSetup = async ({ config: config2 }) => {
|
|
|
3934
3995
|
};
|
|
3935
3996
|
|
|
3936
3997
|
// src/cmds/init/prompts/gitProvider.ts
|
|
3937
|
-
|
|
3998
|
+
import prompts3 from "prompts";
|
|
3938
3999
|
var supportedGitProviders = {
|
|
3939
4000
|
github: {
|
|
3940
4001
|
imports: [
|
|
@@ -3956,7 +4017,7 @@ var supportedGitProviders = {
|
|
|
3956
4017
|
}
|
|
3957
4018
|
};
|
|
3958
4019
|
var chooseGitProvider = async ({ config: config2 }) => {
|
|
3959
|
-
const result = await (
|
|
4020
|
+
const result = await prompts3([
|
|
3960
4021
|
{
|
|
3961
4022
|
name: "githubToken",
|
|
3962
4023
|
type: "text",
|
|
@@ -3964,7 +4025,7 @@ var chooseGitProvider = async ({ config: config2 }) => {
|
|
|
3964
4025
|
${logText(
|
|
3965
4026
|
"Learn more here: "
|
|
3966
4027
|
)}${linkText(
|
|
3967
|
-
"https://tina.io/docs/self-
|
|
4028
|
+
"https://tina.io/docs/r/self-hosting-nextjs/#github-personal-access-token"
|
|
3968
4029
|
)}`,
|
|
3969
4030
|
initial: process.env.GITHUB_PERSONAL_ACCESS_TOKEN
|
|
3970
4031
|
},
|
|
@@ -4001,7 +4062,7 @@ ${logText(
|
|
|
4001
4062
|
};
|
|
4002
4063
|
|
|
4003
4064
|
// src/cmds/init/prompts/databaseAdapter.ts
|
|
4004
|
-
|
|
4065
|
+
import prompts4 from "prompts";
|
|
4005
4066
|
var supportedDatabaseAdapters = {
|
|
4006
4067
|
["upstash-redis"]: {
|
|
4007
4068
|
databaseAdapterClassText: `new RedisLevel({
|
|
@@ -4047,7 +4108,7 @@ var databaseAdapterUpdateConfig = {
|
|
|
4047
4108
|
other: async (_args) => {
|
|
4048
4109
|
},
|
|
4049
4110
|
mongodb: async ({ config: config2 }) => {
|
|
4050
|
-
const result = await (
|
|
4111
|
+
const result = await prompts4([
|
|
4051
4112
|
{
|
|
4052
4113
|
name: "mongoDBUri",
|
|
4053
4114
|
type: "text",
|
|
@@ -4062,7 +4123,7 @@ var databaseAdapterUpdateConfig = {
|
|
|
4062
4123
|
});
|
|
4063
4124
|
},
|
|
4064
4125
|
"upstash-redis": async ({ config: config2 }) => {
|
|
4065
|
-
const result = await (
|
|
4126
|
+
const result = await prompts4([
|
|
4066
4127
|
{
|
|
4067
4128
|
name: "kvRestApiUrl",
|
|
4068
4129
|
type: "text",
|
|
@@ -4093,7 +4154,7 @@ var chooseDatabaseAdapter = async ({
|
|
|
4093
4154
|
framework,
|
|
4094
4155
|
config: config2
|
|
4095
4156
|
}) => {
|
|
4096
|
-
const answers = await (
|
|
4157
|
+
const answers = await prompts4([
|
|
4097
4158
|
{
|
|
4098
4159
|
name: "dataLayerAdapter",
|
|
4099
4160
|
message: "Select a self-hosted Database Adapter",
|
|
@@ -4123,8 +4184,8 @@ var chooseDatabaseAdapter = async ({
|
|
|
4123
4184
|
};
|
|
4124
4185
|
|
|
4125
4186
|
// src/cmds/init/prompts/authProvider.ts
|
|
4126
|
-
|
|
4127
|
-
|
|
4187
|
+
import crypto2 from "crypto-js";
|
|
4188
|
+
import prompts5 from "prompts";
|
|
4128
4189
|
var supportedAuthProviders = {
|
|
4129
4190
|
other: {
|
|
4130
4191
|
name: "other"
|
|
@@ -4173,12 +4234,12 @@ var authProviderUpdateConfig = {
|
|
|
4173
4234
|
},
|
|
4174
4235
|
"tina-cloud": askTinaCloudSetup,
|
|
4175
4236
|
"next-auth": async ({ config: config2 }) => {
|
|
4176
|
-
const result = await (
|
|
4237
|
+
const result = await prompts5([
|
|
4177
4238
|
{
|
|
4178
4239
|
name: "nextAuthSecret",
|
|
4179
4240
|
type: "text",
|
|
4180
4241
|
message: `What is the NextAuth.js Secret? (Hit enter to use a randomly generated secret)`,
|
|
4181
|
-
initial: process.env.NEXTAUTH_SECRET ||
|
|
4242
|
+
initial: process.env.NEXTAUTH_SECRET || crypto2.lib.WordArray.random(16).toString()
|
|
4182
4243
|
}
|
|
4183
4244
|
]);
|
|
4184
4245
|
config2.envVars.push({
|
|
@@ -4203,7 +4264,7 @@ var forestryDisclaimer = logText(
|
|
|
4203
4264
|
`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
4265
|
);
|
|
4205
4266
|
var askCommonSetUp = async () => {
|
|
4206
|
-
const answers = await (
|
|
4267
|
+
const answers = await prompts6([
|
|
4207
4268
|
{
|
|
4208
4269
|
name: "framework",
|
|
4209
4270
|
type: "select",
|
|
@@ -4225,7 +4286,8 @@ var askCommonSetUp = async () => {
|
|
|
4225
4286
|
choices: [
|
|
4226
4287
|
{ title: "PNPM", value: "pnpm" },
|
|
4227
4288
|
{ title: "Yarn", value: "yarn" },
|
|
4228
|
-
{ title: "NPM", value: "npm" }
|
|
4289
|
+
{ title: "NPM", value: "npm" },
|
|
4290
|
+
{ title: "Bun", value: "bun" }
|
|
4229
4291
|
]
|
|
4230
4292
|
}
|
|
4231
4293
|
]);
|
|
@@ -4266,7 +4328,7 @@ ${forestryDisclaimer}`
|
|
|
4266
4328
|
message: `What format are you using in your frontmatter?`
|
|
4267
4329
|
});
|
|
4268
4330
|
}
|
|
4269
|
-
const answers = await (
|
|
4331
|
+
const answers = await prompts6(questions);
|
|
4270
4332
|
return answers;
|
|
4271
4333
|
};
|
|
4272
4334
|
var askTinaSetupPrompts = async (params) => {
|
|
@@ -4286,16 +4348,16 @@ var askTinaSetupPrompts = async (params) => {
|
|
|
4286
4348
|
message: `Where are public assets stored? (default: "public")
|
|
4287
4349
|
` + logText(
|
|
4288
4350
|
`Not sure what value to use? Refer to our "Frameworks" doc: ${linkText(
|
|
4289
|
-
"https://tina.io/docs/
|
|
4351
|
+
"https://tina.io/docs/r/framework-guides-overview"
|
|
4290
4352
|
)}`
|
|
4291
4353
|
)
|
|
4292
4354
|
});
|
|
4293
4355
|
}
|
|
4294
|
-
const answers = await (
|
|
4356
|
+
const answers = await prompts6(questions);
|
|
4295
4357
|
return answers;
|
|
4296
4358
|
};
|
|
4297
4359
|
var askIfUsingSelfHosted = async () => {
|
|
4298
|
-
const answers = await (
|
|
4360
|
+
const answers = await prompts6([
|
|
4299
4361
|
{
|
|
4300
4362
|
name: "hosting",
|
|
4301
4363
|
type: "select",
|
|
@@ -4328,20 +4390,20 @@ var makeImportString = (imports) => {
|
|
|
4328
4390
|
};
|
|
4329
4391
|
|
|
4330
4392
|
// src/cmds/init/prompts/generatedFiles.ts
|
|
4331
|
-
|
|
4393
|
+
import prompts7 from "prompts";
|
|
4332
4394
|
var askIfOverride = async ({
|
|
4333
4395
|
generatedFile,
|
|
4334
4396
|
usingTypescript
|
|
4335
4397
|
}) => {
|
|
4336
4398
|
if (usingTypescript) {
|
|
4337
|
-
const result = await (
|
|
4399
|
+
const result = await prompts7({
|
|
4338
4400
|
name: `override`,
|
|
4339
4401
|
type: "confirm",
|
|
4340
4402
|
message: `Found existing file at ${generatedFile.fullPathTS}. Would you like to overwrite?`
|
|
4341
4403
|
});
|
|
4342
4404
|
return Boolean(result.override);
|
|
4343
4405
|
} else {
|
|
4344
|
-
const result = await (
|
|
4406
|
+
const result = await prompts7({
|
|
4345
4407
|
name: `override`,
|
|
4346
4408
|
type: "confirm",
|
|
4347
4409
|
message: `Found existing file at ${generatedFile.fullPathJS}. Would you like to overwrite?`
|
|
@@ -4476,24 +4538,25 @@ var CLICommand = class {
|
|
|
4476
4538
|
};
|
|
4477
4539
|
|
|
4478
4540
|
// src/cmds/init/apply.ts
|
|
4479
|
-
|
|
4541
|
+
import path14 from "path";
|
|
4480
4542
|
|
|
4481
4543
|
// src/cmds/forestry-migrate/index.ts
|
|
4482
|
-
|
|
4483
|
-
|
|
4484
|
-
|
|
4485
|
-
|
|
4486
|
-
|
|
4487
|
-
|
|
4544
|
+
import fs11 from "fs-extra";
|
|
4545
|
+
import path12 from "path";
|
|
4546
|
+
import yaml2 from "js-yaml";
|
|
4547
|
+
import pkg from "minimatch";
|
|
4548
|
+
import { parseFile, stringifyFile } from "@tinacms/graphql";
|
|
4549
|
+
import { CONTENT_FORMATS } from "@tinacms/schema-tools";
|
|
4488
4550
|
|
|
4489
4551
|
// src/cmds/forestry-migrate/util/index.ts
|
|
4490
|
-
|
|
4491
|
-
|
|
4492
|
-
|
|
4493
|
-
|
|
4552
|
+
import fs10 from "fs-extra";
|
|
4553
|
+
import path11 from "path";
|
|
4554
|
+
import yaml from "js-yaml";
|
|
4555
|
+
import z from "zod";
|
|
4494
4556
|
|
|
4495
4557
|
// src/cmds/forestry-migrate/util/errorSingleton.ts
|
|
4496
4558
|
var ErrorSingleton = class _ErrorSingleton {
|
|
4559
|
+
static instance;
|
|
4497
4560
|
/**
|
|
4498
4561
|
* The Singleton's constructor should always be private to prevent direct
|
|
4499
4562
|
* construction calls with the `new` operator.
|
|
@@ -4513,6 +4576,7 @@ var ErrorSingleton = class _ErrorSingleton {
|
|
|
4513
4576
|
}
|
|
4514
4577
|
return _ErrorSingleton.instance;
|
|
4515
4578
|
}
|
|
4579
|
+
collectionNameErrors;
|
|
4516
4580
|
addErrorName(error) {
|
|
4517
4581
|
this.collectionNameErrors.push(error);
|
|
4518
4582
|
}
|
|
@@ -4535,8 +4599,8 @@ var ErrorSingleton = class _ErrorSingleton {
|
|
|
4535
4599
|
};
|
|
4536
4600
|
|
|
4537
4601
|
// src/cmds/forestry-migrate/util/codeTransformer.ts
|
|
4538
|
-
|
|
4539
|
-
|
|
4602
|
+
import { format } from "prettier";
|
|
4603
|
+
import TsParser from "prettier/parser-typescript.js";
|
|
4540
4604
|
var addVariablesToCode = (codeWithTinaPrefix) => {
|
|
4541
4605
|
const code = codeWithTinaPrefix.replace(
|
|
4542
4606
|
/"__TINA_INTERNAL__:::(.*?):::"/g,
|
|
@@ -4573,7 +4637,7 @@ var makeTemplateFile = async ({
|
|
|
4573
4637
|
`export function ${stringifyLabelWithField(
|
|
4574
4638
|
template.templateObj.label
|
|
4575
4639
|
)} (){
|
|
4576
|
-
return ${addVariablesToCode(JSON.stringify(template.fields, null, 2)).code} ${usingTypescript ? "as TinaField[]" : ""}
|
|
4640
|
+
return ${addVariablesToCode(JSON.stringify(template.fields, null, 2)).code} ${usingTypescript ? "as TinaField[]" : ""}
|
|
4577
4641
|
} `
|
|
4578
4642
|
);
|
|
4579
4643
|
}
|
|
@@ -4581,9 +4645,9 @@ var makeTemplateFile = async ({
|
|
|
4581
4645
|
${usingTypescript ? "import type { TinaField } from 'tinacms'" : ""}
|
|
4582
4646
|
${templateCodeText.join("\n")}
|
|
4583
4647
|
`;
|
|
4584
|
-
const formattedCode =
|
|
4648
|
+
const formattedCode = format(templateCode, {
|
|
4585
4649
|
parser: "typescript",
|
|
4586
|
-
plugins: [
|
|
4650
|
+
plugins: [TsParser]
|
|
4587
4651
|
});
|
|
4588
4652
|
return { importStatements, templateCodeText: formattedCode };
|
|
4589
4653
|
};
|
|
@@ -4615,82 +4679,82 @@ var stringifyTemplateName = (name2, template) => {
|
|
|
4615
4679
|
return newName;
|
|
4616
4680
|
}
|
|
4617
4681
|
};
|
|
4618
|
-
var forestryConfigSchema =
|
|
4619
|
-
sections:
|
|
4620
|
-
|
|
4621
|
-
type:
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
|
|
4626
|
-
|
|
4682
|
+
var forestryConfigSchema = z.object({
|
|
4683
|
+
sections: z.array(
|
|
4684
|
+
z.object({
|
|
4685
|
+
type: z.union([
|
|
4686
|
+
z.literal("directory"),
|
|
4687
|
+
z.literal("document"),
|
|
4688
|
+
z.literal("heading"),
|
|
4689
|
+
z.literal("jekyll-pages"),
|
|
4690
|
+
z.literal("jekyll-posts")
|
|
4627
4691
|
]),
|
|
4628
|
-
label:
|
|
4629
|
-
path:
|
|
4630
|
-
match:
|
|
4631
|
-
exclude:
|
|
4632
|
-
create:
|
|
4633
|
-
templates:
|
|
4634
|
-
new_doc_ext:
|
|
4635
|
-
read_only:
|
|
4692
|
+
label: z.string(),
|
|
4693
|
+
path: z.string().optional().nullable(),
|
|
4694
|
+
match: z.string().optional().nullable(),
|
|
4695
|
+
exclude: z.string().optional().nullable(),
|
|
4696
|
+
create: z.union([z.literal("all"), z.literal("documents"), z.literal("none")]).optional(),
|
|
4697
|
+
templates: z.array(z.string()).optional().nullable(),
|
|
4698
|
+
new_doc_ext: z.string().optional().nullable(),
|
|
4699
|
+
read_only: z.boolean().optional().nullable()
|
|
4636
4700
|
})
|
|
4637
4701
|
)
|
|
4638
4702
|
});
|
|
4639
|
-
var forestryFieldWithoutField =
|
|
4703
|
+
var forestryFieldWithoutField = z.object({
|
|
4640
4704
|
// TODO: maybe better type this?
|
|
4641
|
-
type:
|
|
4642
|
-
|
|
4643
|
-
|
|
4644
|
-
|
|
4645
|
-
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4649
|
-
|
|
4650
|
-
|
|
4651
|
-
|
|
4652
|
-
|
|
4653
|
-
|
|
4654
|
-
|
|
4655
|
-
|
|
4656
|
-
|
|
4705
|
+
type: z.union([
|
|
4706
|
+
z.literal("text"),
|
|
4707
|
+
z.literal("datetime"),
|
|
4708
|
+
z.literal("list"),
|
|
4709
|
+
z.literal("file"),
|
|
4710
|
+
z.literal("image_gallery"),
|
|
4711
|
+
z.literal("textarea"),
|
|
4712
|
+
z.literal("tag_list"),
|
|
4713
|
+
z.literal("number"),
|
|
4714
|
+
z.literal("boolean"),
|
|
4715
|
+
z.literal("field_group"),
|
|
4716
|
+
z.literal("field_group_list"),
|
|
4717
|
+
z.literal("select"),
|
|
4718
|
+
z.literal("include"),
|
|
4719
|
+
z.literal("blocks"),
|
|
4720
|
+
z.literal("color")
|
|
4657
4721
|
]),
|
|
4658
|
-
template_types:
|
|
4659
|
-
name:
|
|
4660
|
-
label:
|
|
4661
|
-
default:
|
|
4662
|
-
template:
|
|
4663
|
-
config:
|
|
4722
|
+
template_types: z.array(z.string()).optional().nullable(),
|
|
4723
|
+
name: z.string(),
|
|
4724
|
+
label: z.string(),
|
|
4725
|
+
default: z.any().optional(),
|
|
4726
|
+
template: z.string().optional(),
|
|
4727
|
+
config: z.object({
|
|
4664
4728
|
// min and max are used for lists
|
|
4665
|
-
min:
|
|
4666
|
-
max:
|
|
4667
|
-
required:
|
|
4668
|
-
use_select:
|
|
4669
|
-
date_format:
|
|
4670
|
-
time_format:
|
|
4671
|
-
options:
|
|
4672
|
-
source:
|
|
4673
|
-
type:
|
|
4674
|
-
|
|
4675
|
-
|
|
4676
|
-
|
|
4677
|
-
|
|
4729
|
+
min: z.number().optional().nullable(),
|
|
4730
|
+
max: z.number().optional().nullable(),
|
|
4731
|
+
required: z.boolean().optional().nullable(),
|
|
4732
|
+
use_select: z.boolean().optional().nullable(),
|
|
4733
|
+
date_format: z.string().optional().nullable(),
|
|
4734
|
+
time_format: z.string().optional().nullable(),
|
|
4735
|
+
options: z.array(z.string()).optional().nullable(),
|
|
4736
|
+
source: z.object({
|
|
4737
|
+
type: z.union([
|
|
4738
|
+
z.literal("custom"),
|
|
4739
|
+
z.literal("pages"),
|
|
4740
|
+
z.literal("documents"),
|
|
4741
|
+
z.literal("simple"),
|
|
4678
4742
|
// TODO: I want to ignore this key if its invalid
|
|
4679
|
-
|
|
4743
|
+
z.string()
|
|
4680
4744
|
]).optional().nullable(),
|
|
4681
|
-
section:
|
|
4745
|
+
section: z.string().optional().nullable()
|
|
4682
4746
|
}).optional()
|
|
4683
4747
|
}).optional()
|
|
4684
4748
|
});
|
|
4685
|
-
var forestryField =
|
|
4749
|
+
var forestryField = z.lazy(
|
|
4686
4750
|
() => forestryFieldWithoutField.extend({
|
|
4687
|
-
fields:
|
|
4751
|
+
fields: z.array(forestryField).optional()
|
|
4688
4752
|
})
|
|
4689
4753
|
);
|
|
4690
|
-
var FrontmatterTemplateSchema =
|
|
4691
|
-
label:
|
|
4692
|
-
hide_body:
|
|
4693
|
-
fields:
|
|
4754
|
+
var FrontmatterTemplateSchema = z.object({
|
|
4755
|
+
label: z.string(),
|
|
4756
|
+
hide_body: z.boolean().optional(),
|
|
4757
|
+
fields: z.array(forestryField).optional()
|
|
4694
4758
|
});
|
|
4695
4759
|
var transformForestryFieldsToTinaFields = ({
|
|
4696
4760
|
fields,
|
|
@@ -4913,7 +4977,7 @@ var transformForestryFieldsToTinaFields = ({
|
|
|
4913
4977
|
return tinaFields;
|
|
4914
4978
|
};
|
|
4915
4979
|
var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false }) => {
|
|
4916
|
-
const templatePath =
|
|
4980
|
+
const templatePath = path11.join(
|
|
4917
4981
|
pathToForestryConfig,
|
|
4918
4982
|
".forestry",
|
|
4919
4983
|
"front_matter",
|
|
@@ -4922,7 +4986,7 @@ var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false })
|
|
|
4922
4986
|
);
|
|
4923
4987
|
let templateString = "";
|
|
4924
4988
|
try {
|
|
4925
|
-
templateString =
|
|
4989
|
+
templateString = fs10.readFileSync(templatePath).toString();
|
|
4926
4990
|
} catch {
|
|
4927
4991
|
throw new Error(
|
|
4928
4992
|
`Could not find template ${tem} at ${templatePath}
|
|
@@ -4930,7 +4994,7 @@ var getFieldsFromTemplates = ({ tem, pathToForestryConfig, skipBlocks = false })
|
|
|
4930
4994
|
This will require manual migration.`
|
|
4931
4995
|
);
|
|
4932
4996
|
}
|
|
4933
|
-
const templateObj =
|
|
4997
|
+
const templateObj = yaml.load(templateString);
|
|
4934
4998
|
const template = parseTemplates({ val: templateObj });
|
|
4935
4999
|
const fields = transformForestryFieldsToTinaFields({
|
|
4936
5000
|
fields: template.fields,
|
|
@@ -4950,6 +5014,7 @@ var parseSections = ({ val }) => {
|
|
|
4950
5014
|
};
|
|
4951
5015
|
|
|
4952
5016
|
// src/cmds/forestry-migrate/index.ts
|
|
5017
|
+
var { minimatch } = pkg;
|
|
4953
5018
|
var BODY_FIELD = {
|
|
4954
5019
|
// This is the body field
|
|
4955
5020
|
type: "rich-text",
|
|
@@ -4978,7 +5043,7 @@ var transformForestryMatchToTinaMatch = (match) => {
|
|
|
4978
5043
|
};
|
|
4979
5044
|
function checkExt(ext) {
|
|
4980
5045
|
const extReal = ext.replace(".", "");
|
|
4981
|
-
if (
|
|
5046
|
+
if (CONTENT_FORMATS.includes(extReal)) {
|
|
4982
5047
|
return extReal;
|
|
4983
5048
|
} else {
|
|
4984
5049
|
return false;
|
|
@@ -4987,9 +5052,9 @@ function checkExt(ext) {
|
|
|
4987
5052
|
var generateAllTemplates = async ({
|
|
4988
5053
|
pathToForestryConfig
|
|
4989
5054
|
}) => {
|
|
4990
|
-
const allTemplates = (await
|
|
4991
|
-
|
|
4992
|
-
)).map((tem) =>
|
|
5055
|
+
const allTemplates = (await fs11.readdir(
|
|
5056
|
+
path12.join(pathToForestryConfig, ".forestry", "front_matter", "templates")
|
|
5057
|
+
)).map((tem) => path12.basename(tem, ".yml"));
|
|
4993
5058
|
const templateMap = /* @__PURE__ */ new Map();
|
|
4994
5059
|
const proms = allTemplates.map(async (tem) => {
|
|
4995
5060
|
try {
|
|
@@ -4999,7 +5064,7 @@ var generateAllTemplates = async ({
|
|
|
4999
5064
|
});
|
|
5000
5065
|
templateMap.set(tem, { fields, templateObj });
|
|
5001
5066
|
} catch (e) {
|
|
5002
|
-
logger.
|
|
5067
|
+
logger.warn(`Error parsing template frontmatter template, ${tem}.yml`);
|
|
5003
5068
|
console.error(e);
|
|
5004
5069
|
templateMap.set(tem, { fields: [], templateObj: {} });
|
|
5005
5070
|
}
|
|
@@ -5043,7 +5108,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5043
5108
|
}
|
|
5044
5109
|
if (section.type === "directory") {
|
|
5045
5110
|
if (!section?.path || section.path === "/" || section.path === "./" || section.path === ".") {
|
|
5046
|
-
logger.
|
|
5111
|
+
logger.warn(
|
|
5047
5112
|
warnText(
|
|
5048
5113
|
`Warning: Section ${section.label} is using a Root Path. Currently, Tina Does not support Root paths see ${linkText(
|
|
5049
5114
|
"https://github.com/tinacms/tinacms/issues/3768"
|
|
@@ -5064,7 +5129,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5064
5129
|
glob = section.path + "/" + section.match;
|
|
5065
5130
|
}
|
|
5066
5131
|
if (pages.some((page) => {
|
|
5067
|
-
return (
|
|
5132
|
+
return minimatch(page, glob);
|
|
5068
5133
|
})) {
|
|
5069
5134
|
forestryTemplates.push(templateKey);
|
|
5070
5135
|
}
|
|
@@ -5134,9 +5199,9 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5134
5199
|
return c;
|
|
5135
5200
|
} else if (section.type === "document") {
|
|
5136
5201
|
const filePath = section.path;
|
|
5137
|
-
const extname =
|
|
5138
|
-
const fileName =
|
|
5139
|
-
const dir =
|
|
5202
|
+
const extname = path12.extname(filePath);
|
|
5203
|
+
const fileName = path12.basename(filePath, extname);
|
|
5204
|
+
const dir = path12.dirname(filePath);
|
|
5140
5205
|
const ext = checkExt(extname);
|
|
5141
5206
|
if (ext) {
|
|
5142
5207
|
const fields = [];
|
|
@@ -5156,7 +5221,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5156
5221
|
name: "dummy",
|
|
5157
5222
|
label: "Dummy field",
|
|
5158
5223
|
type: "string",
|
|
5159
|
-
description: "This is a dummy field, please replace it with the fields you want to edit. See https://tina.io/docs/
|
|
5224
|
+
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"
|
|
5160
5225
|
});
|
|
5161
5226
|
logger.warn(
|
|
5162
5227
|
warnText(
|
|
@@ -5180,7 +5245,7 @@ var generateCollectionFromForestrySection = (args) => {
|
|
|
5180
5245
|
fields
|
|
5181
5246
|
};
|
|
5182
5247
|
} else {
|
|
5183
|
-
logger.
|
|
5248
|
+
logger.warn(
|
|
5184
5249
|
warnText(
|
|
5185
5250
|
`Error: document section has an unsupported file extension: ${extname} in ${section.path}`
|
|
5186
5251
|
)
|
|
@@ -5198,8 +5263,8 @@ var generateCollections = async ({
|
|
|
5198
5263
|
templateMap,
|
|
5199
5264
|
usingTypescript
|
|
5200
5265
|
});
|
|
5201
|
-
const forestryConfig = await
|
|
5202
|
-
|
|
5266
|
+
const forestryConfig = await fs11.readFile(
|
|
5267
|
+
path12.join(pathToForestryConfig, ".forestry", "settings.yml")
|
|
5203
5268
|
);
|
|
5204
5269
|
rewriteTemplateKeysInDocs({
|
|
5205
5270
|
templateMap,
|
|
@@ -5209,7 +5274,7 @@ var generateCollections = async ({
|
|
|
5209
5274
|
}
|
|
5210
5275
|
});
|
|
5211
5276
|
const collections = parseSections({
|
|
5212
|
-
val:
|
|
5277
|
+
val: yaml2.load(forestryConfig.toString())
|
|
5213
5278
|
}).sections.map(
|
|
5214
5279
|
(section) => generateCollectionFromForestrySection({
|
|
5215
5280
|
section,
|
|
@@ -5229,13 +5294,13 @@ var rewriteTemplateKeysInDocs = (args) => {
|
|
|
5229
5294
|
const { templateObj } = templateMap.get(templateKey);
|
|
5230
5295
|
templateObj?.pages?.forEach((page) => {
|
|
5231
5296
|
try {
|
|
5232
|
-
const filePath =
|
|
5233
|
-
if (
|
|
5297
|
+
const filePath = path12.join(page);
|
|
5298
|
+
if (fs11.lstatSync(filePath).isDirectory()) {
|
|
5234
5299
|
return;
|
|
5235
5300
|
}
|
|
5236
|
-
const extname =
|
|
5237
|
-
const fileContent =
|
|
5238
|
-
const content =
|
|
5301
|
+
const extname = path12.extname(filePath);
|
|
5302
|
+
const fileContent = fs11.readFileSync(filePath).toString();
|
|
5303
|
+
const content = parseFile(
|
|
5239
5304
|
fileContent,
|
|
5240
5305
|
extname,
|
|
5241
5306
|
(yup) => yup.object({}),
|
|
@@ -5245,9 +5310,9 @@ var rewriteTemplateKeysInDocs = (args) => {
|
|
|
5245
5310
|
_template: stringifyLabel(templateKey),
|
|
5246
5311
|
...content
|
|
5247
5312
|
};
|
|
5248
|
-
|
|
5313
|
+
fs11.writeFileSync(
|
|
5249
5314
|
filePath,
|
|
5250
|
-
|
|
5315
|
+
stringifyFile(newContent, extname, true, markdownParseConfig)
|
|
5251
5316
|
);
|
|
5252
5317
|
} catch (error) {
|
|
5253
5318
|
console.log(
|
|
@@ -5259,32 +5324,25 @@ var rewriteTemplateKeysInDocs = (args) => {
|
|
|
5259
5324
|
};
|
|
5260
5325
|
|
|
5261
5326
|
// src/cmds/init/apply.ts
|
|
5262
|
-
|
|
5263
|
-
|
|
5327
|
+
import { Telemetry as Telemetry2 } from "@tinacms/metrics";
|
|
5328
|
+
import fs14 from "fs-extra";
|
|
5264
5329
|
|
|
5265
5330
|
// src/next/commands/codemod-command/index.ts
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
var CodemodCommand = class extends
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5273
|
-
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
|
|
5278
|
-
|
|
5279
|
-
|
|
5280
|
-
|
|
5281
|
-
}
|
|
5282
|
-
static {
|
|
5283
|
-
this.usage = import_clipanion5.Command.Usage({
|
|
5284
|
-
category: `Commands`,
|
|
5285
|
-
description: `Use codemods for various Tina tasks`
|
|
5286
|
-
});
|
|
5287
|
-
}
|
|
5331
|
+
import { Command as Command5, Option as Option5 } from "clipanion";
|
|
5332
|
+
import fs12 from "fs-extra";
|
|
5333
|
+
import path13 from "path";
|
|
5334
|
+
var CodemodCommand = class extends Command5 {
|
|
5335
|
+
static paths = [["codemod"], ["codemod", "move-tina-folder"]];
|
|
5336
|
+
rootPath = Option5.String("--rootPath", {
|
|
5337
|
+
description: "Specify the root directory to run the CLI from"
|
|
5338
|
+
});
|
|
5339
|
+
verbose = Option5.Boolean("-v,--verbose", false, {
|
|
5340
|
+
description: "increase verbosity of logged output"
|
|
5341
|
+
});
|
|
5342
|
+
static usage = Command5.Usage({
|
|
5343
|
+
category: `Commands`,
|
|
5344
|
+
description: `Use codemods for various Tina tasks`
|
|
5345
|
+
});
|
|
5288
5346
|
async catch(error) {
|
|
5289
5347
|
console.log(error);
|
|
5290
5348
|
}
|
|
@@ -5313,13 +5371,13 @@ var moveTinaFolder = async (rootPath = process.cwd()) => {
|
|
|
5313
5371
|
logger.error(e.message);
|
|
5314
5372
|
process.exit(1);
|
|
5315
5373
|
}
|
|
5316
|
-
const tinaDestination =
|
|
5317
|
-
if (await
|
|
5374
|
+
const tinaDestination = path13.join(configManager.rootPath, "tina");
|
|
5375
|
+
if (await fs12.existsSync(tinaDestination)) {
|
|
5318
5376
|
logger.info(
|
|
5319
5377
|
`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.`
|
|
5320
5378
|
);
|
|
5321
5379
|
} else {
|
|
5322
|
-
await
|
|
5380
|
+
await fs12.moveSync(configManager.tinaFolderPath, tinaDestination);
|
|
5323
5381
|
await writeGitignore(configManager.rootPath);
|
|
5324
5382
|
logger.info(
|
|
5325
5383
|
"Move to 'tina' folder complete. Be sure to update any imports of the autogenerated client!"
|
|
@@ -5327,8 +5385,8 @@ var moveTinaFolder = async (rootPath = process.cwd()) => {
|
|
|
5327
5385
|
}
|
|
5328
5386
|
};
|
|
5329
5387
|
var writeGitignore = async (rootPath) => {
|
|
5330
|
-
await
|
|
5331
|
-
|
|
5388
|
+
await fs12.outputFileSync(
|
|
5389
|
+
path13.join(rootPath, "tina", ".gitignore"),
|
|
5332
5390
|
"__generated__"
|
|
5333
5391
|
);
|
|
5334
5392
|
};
|
|
@@ -5381,7 +5439,7 @@ const BlogPage = (props) => {
|
|
|
5381
5439
|
<div className='bg-green-100 text-center'>
|
|
5382
5440
|
Lost and looking for a place to start?
|
|
5383
5441
|
<a
|
|
5384
|
-
href='https://tina.io/
|
|
5442
|
+
href='https://tina.io/docs/r/beginner-series'
|
|
5385
5443
|
className='text-blue-500 underline'
|
|
5386
5444
|
>
|
|
5387
5445
|
{' '}
|
|
@@ -5663,7 +5721,7 @@ import { LocalAuthProvider } from "tinacms";`;
|
|
|
5663
5721
|
publicFolder: "${args.publicFolder}",
|
|
5664
5722
|
},
|
|
5665
5723
|
},
|
|
5666
|
-
// See docs on content modeling for more info on how to setup new content models: https://tina.io/docs/
|
|
5724
|
+
// See docs on content modeling for more info on how to setup new content models: https://tina.io/docs/r/content-modelling-collections/
|
|
5667
5725
|
schema: {
|
|
5668
5726
|
collections: ${generateCollectionString(args)},
|
|
5669
5727
|
},
|
|
@@ -5736,7 +5794,7 @@ Suspendisse facilisis, mi ac scelerisque interdum, ligula ex imperdiet felis, a
|
|
|
5736
5794
|
`;
|
|
5737
5795
|
|
|
5738
5796
|
// src/cmds/init/apply.ts
|
|
5739
|
-
|
|
5797
|
+
import { format as format2 } from "prettier";
|
|
5740
5798
|
|
|
5741
5799
|
// src/utils/script-helpers.ts
|
|
5742
5800
|
function generateGqlScript(scriptValue, opts) {
|
|
@@ -5759,38 +5817,38 @@ function extendNextScripts(scripts, opts) {
|
|
|
5759
5817
|
}
|
|
5760
5818
|
|
|
5761
5819
|
// src/cmds/init/codegen/index.ts
|
|
5762
|
-
|
|
5763
|
-
|
|
5820
|
+
import ts2 from "typescript";
|
|
5821
|
+
import fs13 from "fs-extra";
|
|
5764
5822
|
|
|
5765
5823
|
// src/cmds/init/codegen/util.ts
|
|
5766
|
-
|
|
5767
|
-
var makeTransformer = (makeVisitor) => (ctx) => (node) =>
|
|
5824
|
+
import ts from "typescript";
|
|
5825
|
+
var makeTransformer = (makeVisitor) => (ctx) => (node) => ts.visitNode(node, makeVisitor(ctx));
|
|
5768
5826
|
function parseExpression(expression) {
|
|
5769
|
-
const sourceFile =
|
|
5827
|
+
const sourceFile = ts.createSourceFile(
|
|
5770
5828
|
"temp.ts",
|
|
5771
5829
|
expression,
|
|
5772
|
-
|
|
5830
|
+
ts.ScriptTarget.Latest
|
|
5773
5831
|
);
|
|
5774
5832
|
if (sourceFile.statements.length !== 1) {
|
|
5775
5833
|
throw new Error("Expected one statement");
|
|
5776
5834
|
}
|
|
5777
5835
|
const statement = sourceFile.statements[0];
|
|
5778
|
-
if (!
|
|
5836
|
+
if (!ts.isExpressionStatement(statement)) {
|
|
5779
5837
|
throw new Error("Expected an expression statement");
|
|
5780
5838
|
}
|
|
5781
5839
|
return [sourceFile, statement.expression];
|
|
5782
5840
|
}
|
|
5783
5841
|
function parseVariableStatement(stmt) {
|
|
5784
|
-
const sourceFile =
|
|
5842
|
+
const sourceFile = ts.createSourceFile(
|
|
5785
5843
|
"temp.ts",
|
|
5786
5844
|
stmt,
|
|
5787
|
-
|
|
5845
|
+
ts.ScriptTarget.Latest
|
|
5788
5846
|
);
|
|
5789
5847
|
if (sourceFile.statements.length !== 1) {
|
|
5790
5848
|
throw new Error("Expected one statement");
|
|
5791
5849
|
}
|
|
5792
5850
|
const statement = sourceFile.statements[0];
|
|
5793
|
-
if (!
|
|
5851
|
+
if (!ts.isVariableStatement(statement)) {
|
|
5794
5852
|
throw new Error("Expected a variable statement");
|
|
5795
5853
|
}
|
|
5796
5854
|
return [sourceFile, statement];
|
|
@@ -5798,7 +5856,7 @@ function parseVariableStatement(stmt) {
|
|
|
5798
5856
|
|
|
5799
5857
|
// src/cmds/init/codegen/index.ts
|
|
5800
5858
|
var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variableStmt) => (ctx) => (node) => {
|
|
5801
|
-
if (
|
|
5859
|
+
if (ts2.isSourceFile(node)) {
|
|
5802
5860
|
const newStatements = [...node.statements];
|
|
5803
5861
|
let encounteredImports = false;
|
|
5804
5862
|
let firstNonImportStatementIdx = -1;
|
|
@@ -5806,7 +5864,7 @@ var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variable
|
|
|
5806
5864
|
const [newVarDec] = variableStmt.declarationList.declarations;
|
|
5807
5865
|
const newVarDecName = newVarDec.name.getText(variableStmtSourceFile);
|
|
5808
5866
|
for (let i = 0; i < newStatements.length; i++) {
|
|
5809
|
-
const isImport =
|
|
5867
|
+
const isImport = ts2.isImportDeclaration(newStatements[i]);
|
|
5810
5868
|
if (isImport && !encounteredImports) {
|
|
5811
5869
|
encounteredImports = true;
|
|
5812
5870
|
}
|
|
@@ -5814,9 +5872,9 @@ var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variable
|
|
|
5814
5872
|
firstNonImportStatementIdx = i;
|
|
5815
5873
|
}
|
|
5816
5874
|
const stmt = newStatements[i];
|
|
5817
|
-
if (
|
|
5875
|
+
if (ts2.isVariableStatement(stmt)) {
|
|
5818
5876
|
const [dec] = stmt.declarationList.declarations;
|
|
5819
|
-
if (dec.name &&
|
|
5877
|
+
if (dec.name && ts2.isIdentifier(dec.name) && dec.name.getText(sourceFile) === newVarDecName) {
|
|
5820
5878
|
existingStatementIdx = i;
|
|
5821
5879
|
}
|
|
5822
5880
|
}
|
|
@@ -5830,19 +5888,19 @@ var makeVariableStatementVisitor = (sourceFile, variableStmtSourceFile, variable
|
|
|
5830
5888
|
if (existingStatementIdx === -1) {
|
|
5831
5889
|
newStatements.splice(firstNonImportStatementIdx, 0, variableStmt);
|
|
5832
5890
|
}
|
|
5833
|
-
return
|
|
5891
|
+
return ts2.factory.updateSourceFile(node, newStatements);
|
|
5834
5892
|
}
|
|
5835
5893
|
};
|
|
5836
5894
|
var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
5837
|
-
if (
|
|
5895
|
+
if (ts2.isSourceFile(node)) {
|
|
5838
5896
|
const newStatements = [...node.statements];
|
|
5839
5897
|
let changed = false;
|
|
5840
5898
|
for (const [moduleName, imports] of Object.entries(importMap)) {
|
|
5841
5899
|
let foundImportStatement = false;
|
|
5842
5900
|
for (const statement of newStatements) {
|
|
5843
|
-
if (
|
|
5901
|
+
if (ts2.isImportDeclaration(statement) && ts2.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text === moduleName) {
|
|
5844
5902
|
foundImportStatement = true;
|
|
5845
|
-
const existingImports = statement.importClause?.namedBindings &&
|
|
5903
|
+
const existingImports = statement.importClause?.namedBindings && ts2.isNamedImports(statement.importClause.namedBindings) ? statement.importClause.namedBindings.elements.map(
|
|
5846
5904
|
(e) => e.name.text
|
|
5847
5905
|
) : [];
|
|
5848
5906
|
const newImports = [
|
|
@@ -5853,22 +5911,22 @@ var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
|
5853
5911
|
])
|
|
5854
5912
|
];
|
|
5855
5913
|
const importSpecifiers = newImports.map(
|
|
5856
|
-
(i) =>
|
|
5914
|
+
(i) => ts2.factory.createImportSpecifier(
|
|
5857
5915
|
void 0,
|
|
5858
|
-
|
|
5859
|
-
|
|
5916
|
+
ts2.factory.createIdentifier(i),
|
|
5917
|
+
ts2.factory.createIdentifier(i)
|
|
5860
5918
|
)
|
|
5861
5919
|
);
|
|
5862
|
-
const namedImports =
|
|
5863
|
-
const importClause =
|
|
5920
|
+
const namedImports = ts2.factory.createNamedImports(importSpecifiers);
|
|
5921
|
+
const importClause = ts2.factory.createImportClause(
|
|
5864
5922
|
false,
|
|
5865
5923
|
void 0,
|
|
5866
5924
|
namedImports
|
|
5867
5925
|
);
|
|
5868
|
-
const importDec =
|
|
5926
|
+
const importDec = ts2.factory.createImportDeclaration(
|
|
5869
5927
|
void 0,
|
|
5870
5928
|
importClause,
|
|
5871
|
-
|
|
5929
|
+
ts2.factory.createStringLiteral(moduleName)
|
|
5872
5930
|
);
|
|
5873
5931
|
newStatements[newStatements.indexOf(statement)] = importDec;
|
|
5874
5932
|
changed = true;
|
|
@@ -5876,45 +5934,45 @@ var makeImportsVisitor = (sourceFile, importMap) => (ctx) => (node) => {
|
|
|
5876
5934
|
}
|
|
5877
5935
|
if (!foundImportStatement) {
|
|
5878
5936
|
const importSpecifiers = imports.map(
|
|
5879
|
-
(i) =>
|
|
5937
|
+
(i) => ts2.factory.createImportSpecifier(
|
|
5880
5938
|
void 0,
|
|
5881
|
-
|
|
5882
|
-
|
|
5939
|
+
ts2.factory.createIdentifier(i),
|
|
5940
|
+
ts2.factory.createIdentifier(i)
|
|
5883
5941
|
)
|
|
5884
5942
|
);
|
|
5885
|
-
const namedImports =
|
|
5886
|
-
const importClause =
|
|
5943
|
+
const namedImports = ts2.factory.createNamedImports(importSpecifiers);
|
|
5944
|
+
const importClause = ts2.factory.createImportClause(
|
|
5887
5945
|
false,
|
|
5888
5946
|
void 0,
|
|
5889
5947
|
namedImports
|
|
5890
5948
|
);
|
|
5891
|
-
const importDec =
|
|
5949
|
+
const importDec = ts2.factory.createImportDeclaration(
|
|
5892
5950
|
void 0,
|
|
5893
5951
|
importClause,
|
|
5894
|
-
|
|
5952
|
+
ts2.factory.createStringLiteral(moduleName)
|
|
5895
5953
|
);
|
|
5896
5954
|
newStatements.unshift(importDec);
|
|
5897
5955
|
changed = true;
|
|
5898
5956
|
}
|
|
5899
5957
|
}
|
|
5900
5958
|
if (changed) {
|
|
5901
|
-
return
|
|
5959
|
+
return ts2.factory.updateSourceFile(node, newStatements);
|
|
5902
5960
|
}
|
|
5903
5961
|
}
|
|
5904
5962
|
};
|
|
5905
5963
|
var makeAddExpressionToSchemaCollectionVisitor = (sourceFile, functionName, newExpressionSourceFile, newExpression) => (ctx) => {
|
|
5906
5964
|
const visit2 = (node) => {
|
|
5907
|
-
if (
|
|
5965
|
+
if (ts2.isCallExpression(node) && ts2.isIdentifier(node.expression) && node.expression.text === functionName && node.arguments.length > 0 && ts2.isObjectLiteralExpression(node.arguments[0])) {
|
|
5908
5966
|
const configObject = node.arguments[0];
|
|
5909
5967
|
const updateProperties = configObject.properties.map((property) => {
|
|
5910
|
-
if (
|
|
5968
|
+
if (ts2.isPropertyAssignment(property)) {
|
|
5911
5969
|
const thisPropertyName = property.name.getText(sourceFile);
|
|
5912
|
-
if (thisPropertyName === "schema" &&
|
|
5970
|
+
if (thisPropertyName === "schema" && ts2.isPropertyAssignment(property) && ts2.isObjectLiteralExpression(property.initializer)) {
|
|
5913
5971
|
const schemaObject = property.initializer;
|
|
5914
5972
|
const collectionsProperty = schemaObject.properties.find(
|
|
5915
|
-
(p) =>
|
|
5973
|
+
(p) => ts2.isPropertyAssignment(p) && p.name.getText(sourceFile) === "collections"
|
|
5916
5974
|
);
|
|
5917
|
-
if (collectionsProperty &&
|
|
5975
|
+
if (collectionsProperty && ts2.isPropertyAssignment(collectionsProperty) && ts2.isArrayLiteralExpression(collectionsProperty.initializer)) {
|
|
5918
5976
|
const collectionsArray = collectionsProperty.initializer;
|
|
5919
5977
|
const collectionItems = collectionsArray.elements.map(
|
|
5920
5978
|
(e) => e.getText(sourceFile)
|
|
@@ -5924,16 +5982,16 @@ var makeAddExpressionToSchemaCollectionVisitor = (sourceFile, functionName, newE
|
|
|
5924
5982
|
)) {
|
|
5925
5983
|
return property;
|
|
5926
5984
|
}
|
|
5927
|
-
return
|
|
5985
|
+
return ts2.factory.updatePropertyAssignment(
|
|
5928
5986
|
property,
|
|
5929
5987
|
property.name,
|
|
5930
|
-
|
|
5988
|
+
ts2.factory.createObjectLiteralExpression(
|
|
5931
5989
|
schemaObject.properties.map((subProp) => {
|
|
5932
|
-
if (
|
|
5933
|
-
return
|
|
5990
|
+
if (ts2.isPropertyAssignment(subProp) && subProp.name.getText(sourceFile) === "collections" && ts2.isArrayLiteralExpression(subProp.initializer)) {
|
|
5991
|
+
return ts2.factory.updatePropertyAssignment(
|
|
5934
5992
|
subProp,
|
|
5935
5993
|
subProp.name,
|
|
5936
|
-
|
|
5994
|
+
ts2.factory.createArrayLiteralExpression(
|
|
5937
5995
|
[newExpression, ...subProp.initializer.elements],
|
|
5938
5996
|
true
|
|
5939
5997
|
)
|
|
@@ -5949,56 +6007,56 @@ var makeAddExpressionToSchemaCollectionVisitor = (sourceFile, functionName, newE
|
|
|
5949
6007
|
}
|
|
5950
6008
|
return property;
|
|
5951
6009
|
});
|
|
5952
|
-
return
|
|
6010
|
+
return ts2.factory.createCallExpression(
|
|
5953
6011
|
node.expression,
|
|
5954
6012
|
node.typeArguments,
|
|
5955
|
-
[
|
|
6013
|
+
[ts2.factory.createObjectLiteralExpression(updateProperties, true)]
|
|
5956
6014
|
);
|
|
5957
6015
|
}
|
|
5958
|
-
return
|
|
6016
|
+
return ts2.visitEachChild(node, visit2, ctx);
|
|
5959
6017
|
};
|
|
5960
6018
|
return (sourceFile2) => {
|
|
5961
|
-
return
|
|
6019
|
+
return ts2.visitEachChild(sourceFile2, visit2, ctx);
|
|
5962
6020
|
};
|
|
5963
6021
|
};
|
|
5964
6022
|
var makeUpdateObjectLiteralPropertyVisitor = (sourceFile, functionName, propertyName, propertyValueExpressionSourceFile, propertyValue) => (ctx) => {
|
|
5965
6023
|
const visitor = (node) => {
|
|
5966
|
-
if (
|
|
6024
|
+
if (ts2.isCallExpression(node) && ts2.isIdentifier(node.expression) && node.expression.text === functionName && node.arguments.length > 0 && ts2.isObjectLiteralExpression(node.arguments[0])) {
|
|
5967
6025
|
let foundProperty = false;
|
|
5968
6026
|
const configObject = node.arguments[0];
|
|
5969
6027
|
const updateProperties = configObject.properties.map((property) => {
|
|
5970
|
-
if (
|
|
6028
|
+
if (ts2.isPropertyAssignment(property) || ts2.isShorthandPropertyAssignment(property)) {
|
|
5971
6029
|
const name2 = property.name.getText(sourceFile);
|
|
5972
6030
|
if (name2 === propertyName) {
|
|
5973
6031
|
foundProperty = true;
|
|
5974
|
-
return
|
|
6032
|
+
return ts2.factory.createPropertyAssignment(name2, propertyValue);
|
|
5975
6033
|
}
|
|
5976
6034
|
}
|
|
5977
6035
|
return property;
|
|
5978
6036
|
});
|
|
5979
6037
|
if (!foundProperty) {
|
|
5980
6038
|
updateProperties.unshift(
|
|
5981
|
-
|
|
6039
|
+
ts2.factory.createPropertyAssignment(propertyName, propertyValue)
|
|
5982
6040
|
);
|
|
5983
6041
|
}
|
|
5984
|
-
return
|
|
6042
|
+
return ts2.factory.createCallExpression(
|
|
5985
6043
|
node.expression,
|
|
5986
6044
|
node.typeArguments,
|
|
5987
|
-
[
|
|
6045
|
+
[ts2.factory.createObjectLiteralExpression(updateProperties, true)]
|
|
5988
6046
|
);
|
|
5989
6047
|
}
|
|
5990
|
-
return
|
|
6048
|
+
return ts2.visitEachChild(node, visitor, ctx);
|
|
5991
6049
|
};
|
|
5992
6050
|
return (sourceFile2) => {
|
|
5993
|
-
return
|
|
6051
|
+
return ts2.visitNode(sourceFile2, visitor);
|
|
5994
6052
|
};
|
|
5995
6053
|
};
|
|
5996
6054
|
var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
5997
6055
|
const pathToConfig = configFile.resolve(config2.typescript).path;
|
|
5998
|
-
const sourceFile =
|
|
6056
|
+
const sourceFile = ts2.createSourceFile(
|
|
5999
6057
|
pathToConfig,
|
|
6000
|
-
|
|
6001
|
-
config2.typescript ?
|
|
6058
|
+
fs13.readFileSync(pathToConfig, "utf8"),
|
|
6059
|
+
config2.typescript ? ts2.ScriptTarget.Latest : ts2.ScriptTarget.ESNext
|
|
6002
6060
|
);
|
|
6003
6061
|
const { configImports, configAuthProviderClass, extraTinaCollections } = config2.authProvider;
|
|
6004
6062
|
const importMap = {
|
|
@@ -6011,7 +6069,7 @@ var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
|
6011
6069
|
{}
|
|
6012
6070
|
)
|
|
6013
6071
|
};
|
|
6014
|
-
const transformedSourceFileResult =
|
|
6072
|
+
const transformedSourceFileResult = ts2.transform(
|
|
6015
6073
|
sourceFile,
|
|
6016
6074
|
[
|
|
6017
6075
|
makeImportsVisitor(sourceFile, {
|
|
@@ -6047,13 +6105,14 @@ var addSelfHostedTinaAuthToConfig = async (config2, configFile) => {
|
|
|
6047
6105
|
)
|
|
6048
6106
|
].map((visitor) => makeTransformer(visitor))
|
|
6049
6107
|
);
|
|
6050
|
-
return
|
|
6108
|
+
return fs13.writeFile(
|
|
6051
6109
|
pathToConfig,
|
|
6052
|
-
|
|
6110
|
+
ts2.createPrinter({ omitTrailingSemicolon: true }).printFile(transformedSourceFileResult.transformed[0])
|
|
6053
6111
|
);
|
|
6054
6112
|
};
|
|
6055
6113
|
|
|
6056
6114
|
// src/cmds/init/apply.ts
|
|
6115
|
+
import { exec } from "child_process";
|
|
6057
6116
|
async function apply({
|
|
6058
6117
|
env,
|
|
6059
6118
|
params,
|
|
@@ -6164,8 +6223,8 @@ async function apply({
|
|
|
6164
6223
|
await addConfigFile({
|
|
6165
6224
|
configArgs: {
|
|
6166
6225
|
config: config2,
|
|
6167
|
-
publicFolder:
|
|
6168
|
-
|
|
6226
|
+
publicFolder: path14.join(
|
|
6227
|
+
path14.relative(process.cwd(), pathToForestryConfig),
|
|
6169
6228
|
config2.publicFolder
|
|
6170
6229
|
),
|
|
6171
6230
|
collections,
|
|
@@ -6222,7 +6281,7 @@ var reportTelemetry = async ({
|
|
|
6222
6281
|
if (noTelemetry) {
|
|
6223
6282
|
logger.info(logText("Telemetry disabled"));
|
|
6224
6283
|
}
|
|
6225
|
-
const telemetry = new
|
|
6284
|
+
const telemetry = new Telemetry2({ disabled: noTelemetry });
|
|
6226
6285
|
const schemaFileType = usingTypescript ? "ts" : "js";
|
|
6227
6286
|
await telemetry.submitRecord({
|
|
6228
6287
|
event: {
|
|
@@ -6238,18 +6297,18 @@ var createPackageJSON = async () => {
|
|
|
6238
6297
|
};
|
|
6239
6298
|
var createGitignore = async ({ baseDir }) => {
|
|
6240
6299
|
logger.info(logText("No .gitignore found, creating one"));
|
|
6241
|
-
|
|
6300
|
+
fs14.outputFileSync(path14.join(baseDir, ".gitignore"), "node_modules");
|
|
6242
6301
|
};
|
|
6243
6302
|
var updateGitIgnore = async ({
|
|
6244
6303
|
baseDir,
|
|
6245
6304
|
items
|
|
6246
6305
|
}) => {
|
|
6247
6306
|
logger.info(logText(`Adding ${items.join(",")} to .gitignore`));
|
|
6248
|
-
const gitignoreContent =
|
|
6307
|
+
const gitignoreContent = fs14.readFileSync(path14.join(baseDir, ".gitignore")).toString();
|
|
6249
6308
|
const newGitignoreContent = [...gitignoreContent.split("\n"), ...items].join(
|
|
6250
6309
|
"\n"
|
|
6251
6310
|
);
|
|
6252
|
-
await
|
|
6311
|
+
await fs14.writeFile(path14.join(baseDir, ".gitignore"), newGitignoreContent);
|
|
6253
6312
|
};
|
|
6254
6313
|
var addDependencies = async (config2, env, params) => {
|
|
6255
6314
|
const { packageManager } = config2;
|
|
@@ -6290,7 +6349,8 @@ var addDependencies = async (config2, env, params) => {
|
|
|
6290
6349
|
let packageManagers = {
|
|
6291
6350
|
pnpm: process.env.USE_WORKSPACE ? `pnpm add ${deps.join(" ")} --workspace` : `pnpm add ${deps.join(" ")}`,
|
|
6292
6351
|
npm: `npm install ${deps.join(" ")}`,
|
|
6293
|
-
yarn: `yarn add ${deps.join(" ")}
|
|
6352
|
+
yarn: `yarn add ${deps.join(" ")}`,
|
|
6353
|
+
bun: `bun add ${deps.join(" ")}`
|
|
6294
6354
|
};
|
|
6295
6355
|
if (packageManagers[packageManager] && deps.length > 0) {
|
|
6296
6356
|
logger.info(logText("Adding dependencies, this might take a moment..."));
|
|
@@ -6301,7 +6361,8 @@ var addDependencies = async (config2, env, params) => {
|
|
|
6301
6361
|
packageManagers = {
|
|
6302
6362
|
pnpm: process.env.USE_WORKSPACE ? `pnpm add -D ${devDeps.join(" ")} --workspace` : `pnpm add -D ${devDeps.join(" ")}`,
|
|
6303
6363
|
npm: `npm install -D ${devDeps.join(" ")}`,
|
|
6304
|
-
yarn: `yarn add -D ${devDeps.join(" ")}
|
|
6364
|
+
yarn: `yarn add -D ${devDeps.join(" ")}`,
|
|
6365
|
+
bun: `bun add -D ${devDeps.join(" ")}`
|
|
6305
6366
|
};
|
|
6306
6367
|
if (packageManagers[packageManager]) {
|
|
6307
6368
|
logger.info(
|
|
@@ -6318,22 +6379,22 @@ var writeGeneratedFile = async ({
|
|
|
6318
6379
|
content,
|
|
6319
6380
|
typescript
|
|
6320
6381
|
}) => {
|
|
6321
|
-
const { exists, path:
|
|
6382
|
+
const { exists, path: path15, parentPath } = generatedFile.resolve(typescript);
|
|
6322
6383
|
if (exists) {
|
|
6323
6384
|
if (overwrite) {
|
|
6324
|
-
logger.info(`Overwriting file at ${
|
|
6325
|
-
|
|
6385
|
+
logger.info(`Overwriting file at ${path15}... \u2705`);
|
|
6386
|
+
fs14.outputFileSync(path15, content);
|
|
6326
6387
|
} else {
|
|
6327
|
-
logger.info(`Not overwriting file at ${
|
|
6388
|
+
logger.info(`Not overwriting file at ${path15}.`);
|
|
6328
6389
|
logger.info(
|
|
6329
|
-
logText(`Please add the following to ${
|
|
6390
|
+
logText(`Please add the following to ${path15}:
|
|
6330
6391
|
${indentText(content)}}`)
|
|
6331
6392
|
);
|
|
6332
6393
|
}
|
|
6333
6394
|
} else {
|
|
6334
|
-
logger.info(`Adding file at ${
|
|
6335
|
-
await
|
|
6336
|
-
|
|
6395
|
+
logger.info(`Adding file at ${path15}... \u2705`);
|
|
6396
|
+
await fs14.ensureDir(parentPath);
|
|
6397
|
+
fs14.outputFileSync(path15, content);
|
|
6337
6398
|
}
|
|
6338
6399
|
};
|
|
6339
6400
|
var addConfigFile = async ({
|
|
@@ -6342,7 +6403,7 @@ var addConfigFile = async ({
|
|
|
6342
6403
|
generatedFile,
|
|
6343
6404
|
config: config2
|
|
6344
6405
|
}) => {
|
|
6345
|
-
const content = (
|
|
6406
|
+
const content = format2(generateConfig(configArgs), {
|
|
6346
6407
|
parser: "babel"
|
|
6347
6408
|
});
|
|
6348
6409
|
await writeGeneratedFile({
|
|
@@ -6372,7 +6433,7 @@ var addNextApiRoute = async ({
|
|
|
6372
6433
|
generatedFile,
|
|
6373
6434
|
env
|
|
6374
6435
|
}) => {
|
|
6375
|
-
const content = (
|
|
6436
|
+
const content = format2(nextApiRouteTemplate({ config: config2, env }), {
|
|
6376
6437
|
parser: "babel"
|
|
6377
6438
|
});
|
|
6378
6439
|
await writeGeneratedFile({
|
|
@@ -6411,7 +6472,7 @@ var addContentFile = async ({
|
|
|
6411
6472
|
return () => ({
|
|
6412
6473
|
exists: env.sampleContentExists,
|
|
6413
6474
|
path: env.sampleContentPath,
|
|
6414
|
-
parentPath:
|
|
6475
|
+
parentPath: path14.dirname(env.sampleContentPath)
|
|
6415
6476
|
});
|
|
6416
6477
|
}
|
|
6417
6478
|
},
|
|
@@ -6434,10 +6495,10 @@ ${titleText(" TinaCMS ")} backend initialized!`));
|
|
|
6434
6495
|
return `${x.key}=${x.value || "***"}`;
|
|
6435
6496
|
}).join("\n") + `
|
|
6436
6497
|
TINA_PUBLIC_IS_LOCAL=true`;
|
|
6437
|
-
const envFile =
|
|
6438
|
-
if (!
|
|
6498
|
+
const envFile = path14.join(process.cwd(), ".env");
|
|
6499
|
+
if (!fs14.existsSync(envFile)) {
|
|
6439
6500
|
logger.info(`Adding .env file to your project... \u2705`);
|
|
6440
|
-
|
|
6501
|
+
fs14.writeFileSync(envFile, envFileText);
|
|
6441
6502
|
} else {
|
|
6442
6503
|
logger.info(
|
|
6443
6504
|
"Please add the following environment variables to your .env file"
|
|
@@ -6459,9 +6520,7 @@ ${titleText(" TinaCMS ")} has been initialized!`));
|
|
|
6459
6520
|
);
|
|
6460
6521
|
if (framework.name === "hugo") {
|
|
6461
6522
|
logger.info(
|
|
6462
|
-
focusText("Hugo is required. ")
|
|
6463
|
-
"Don't have Hugo installed? Follow this guide to set it up: ",
|
|
6464
|
-
linkText("https://gohugo.io/installation/")
|
|
6523
|
+
focusText("Hugo is required. ") + "Don't have Hugo installed? Follow this guide to set it up: " + linkText("https://gohugo.io/installation/")
|
|
6465
6524
|
);
|
|
6466
6525
|
}
|
|
6467
6526
|
logger.info(
|
|
@@ -6480,7 +6539,8 @@ var other = ({ packageManager }) => {
|
|
|
6480
6539
|
pnpm: `pnpm`,
|
|
6481
6540
|
npm: `npx`,
|
|
6482
6541
|
// npx is the way to run executables that aren't in your "scripts"
|
|
6483
|
-
yarn: `yarn
|
|
6542
|
+
yarn: `yarn`,
|
|
6543
|
+
bun: `bun run`
|
|
6484
6544
|
};
|
|
6485
6545
|
return `${packageManagers[packageManager]} tinacms dev -c "<your dev command>"`;
|
|
6486
6546
|
};
|
|
@@ -6493,7 +6553,8 @@ var frameworkDevCmds = {
|
|
|
6493
6553
|
pnpm: `pnpm`,
|
|
6494
6554
|
npm: `npm run`,
|
|
6495
6555
|
// npx is the way to run executables that aren't in your "scripts"
|
|
6496
|
-
yarn: `yarn
|
|
6556
|
+
yarn: `yarn`,
|
|
6557
|
+
bun: `bun run`
|
|
6497
6558
|
};
|
|
6498
6559
|
return `${packageManagers[packageManager]} dev`;
|
|
6499
6560
|
}
|
|
@@ -6506,7 +6567,7 @@ var addReactiveFile = {
|
|
|
6506
6567
|
baseDir,
|
|
6507
6568
|
dataLayer
|
|
6508
6569
|
}) => {
|
|
6509
|
-
const packageJsonPath =
|
|
6570
|
+
const packageJsonPath = path14.join(baseDir, "package.json");
|
|
6510
6571
|
await writeGeneratedFile({
|
|
6511
6572
|
generatedFile,
|
|
6512
6573
|
typescript: config2.typescript,
|
|
@@ -6519,7 +6580,7 @@ var addReactiveFile = {
|
|
|
6519
6580
|
})
|
|
6520
6581
|
});
|
|
6521
6582
|
logger.info("Adding a nextjs example... \u2705");
|
|
6522
|
-
const packageJson = JSON.parse(
|
|
6583
|
+
const packageJson = JSON.parse(fs14.readFileSync(packageJsonPath).toString());
|
|
6523
6584
|
const scripts = packageJson.scripts || {};
|
|
6524
6585
|
const updatedPackageJson = JSON.stringify(
|
|
6525
6586
|
{
|
|
@@ -6532,11 +6593,10 @@ var addReactiveFile = {
|
|
|
6532
6593
|
null,
|
|
6533
6594
|
2
|
|
6534
6595
|
);
|
|
6535
|
-
|
|
6596
|
+
fs14.writeFileSync(packageJsonPath, updatedPackageJson);
|
|
6536
6597
|
}
|
|
6537
6598
|
};
|
|
6538
6599
|
function execShellCommand(cmd) {
|
|
6539
|
-
const exec = require("child_process").exec;
|
|
6540
6600
|
return new Promise((resolve2, reject) => {
|
|
6541
6601
|
exec(cmd, (error, stdout, stderr) => {
|
|
6542
6602
|
if (error) {
|
|
@@ -6582,34 +6642,27 @@ var command = new CLICommand({
|
|
|
6582
6642
|
});
|
|
6583
6643
|
|
|
6584
6644
|
// src/next/commands/init-command/index.ts
|
|
6585
|
-
var InitCommand = class extends
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
|
|
6601
|
-
|
|
6602
|
-
|
|
6603
|
-
|
|
6604
|
-
|
|
6605
|
-
|
|
6606
|
-
}
|
|
6607
|
-
static {
|
|
6608
|
-
this.usage = import_clipanion6.Command.Usage({
|
|
6609
|
-
category: `Commands`,
|
|
6610
|
-
description: `Add Tina to an existing project`
|
|
6611
|
-
});
|
|
6612
|
-
}
|
|
6645
|
+
var InitCommand = class extends Command6 {
|
|
6646
|
+
static paths = [["init"], ["init", "backend"]];
|
|
6647
|
+
pathToForestryConfig = Option6.String("--forestryPath", {
|
|
6648
|
+
description: "Specify the relative path to the .forestry directory, if importing an existing forestry site."
|
|
6649
|
+
});
|
|
6650
|
+
rootPath = Option6.String("--rootPath", {
|
|
6651
|
+
description: "Specify the root directory to run the CLI from (defaults to current working directory)"
|
|
6652
|
+
});
|
|
6653
|
+
debug = Option6.Boolean("--debug", false, {
|
|
6654
|
+
description: "Enable debug logging"
|
|
6655
|
+
});
|
|
6656
|
+
noTelemetry = Option6.Boolean("--noTelemetry", false, {
|
|
6657
|
+
description: "Disable anonymous telemetry that is collected"
|
|
6658
|
+
});
|
|
6659
|
+
tinaVersion = Option6.String("--tinaVersion", {
|
|
6660
|
+
description: "Specify a version for tina dependencies"
|
|
6661
|
+
});
|
|
6662
|
+
static usage = Command6.Usage({
|
|
6663
|
+
category: `Commands`,
|
|
6664
|
+
description: `Add Tina to an existing project`
|
|
6665
|
+
});
|
|
6613
6666
|
async catch(error) {
|
|
6614
6667
|
logger.error("Error occured during tinacms init");
|
|
6615
6668
|
console.error(error);
|
|
@@ -6631,28 +6684,24 @@ var InitCommand = class extends import_clipanion6.Command {
|
|
|
6631
6684
|
};
|
|
6632
6685
|
|
|
6633
6686
|
// src/next/commands/searchindex-command/index.ts
|
|
6634
|
-
|
|
6635
|
-
|
|
6636
|
-
|
|
6637
|
-
|
|
6638
|
-
|
|
6639
|
-
|
|
6640
|
-
|
|
6641
|
-
|
|
6642
|
-
|
|
6643
|
-
|
|
6644
|
-
|
|
6645
|
-
|
|
6646
|
-
|
|
6647
|
-
|
|
6648
|
-
|
|
6649
|
-
|
|
6650
|
-
|
|
6651
|
-
|
|
6652
|
-
category: `Commands`,
|
|
6653
|
-
description: `Index the site for search`
|
|
6654
|
-
});
|
|
6655
|
-
}
|
|
6687
|
+
import { Command as Command7, Option as Option7 } from "clipanion";
|
|
6688
|
+
import { createSchema, FilesystemBridge as FilesystemBridge4 } from "@tinacms/graphql";
|
|
6689
|
+
import {
|
|
6690
|
+
SearchIndexer as SearchIndexer3,
|
|
6691
|
+
TinaCMSSearchIndexClient as TinaCMSSearchIndexClient2
|
|
6692
|
+
} from "@tinacms/search";
|
|
6693
|
+
var SearchIndexCommand = class extends Command7 {
|
|
6694
|
+
static paths = [["search-index"]];
|
|
6695
|
+
rootPath = Option7.String("--rootPath", {
|
|
6696
|
+
description: "Specify the root directory to run the CLI from (defaults to current working directory)"
|
|
6697
|
+
});
|
|
6698
|
+
verbose = Option7.Boolean("-v,--verbose", false, {
|
|
6699
|
+
description: "increase verbosity of logged output"
|
|
6700
|
+
});
|
|
6701
|
+
static usage = Command7.Usage({
|
|
6702
|
+
category: `Commands`,
|
|
6703
|
+
description: `Index the site for search`
|
|
6704
|
+
});
|
|
6656
6705
|
async catch(error) {
|
|
6657
6706
|
logger.error("Error occured during tinacms search-index");
|
|
6658
6707
|
console.error(error);
|
|
@@ -6674,7 +6723,7 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6674
6723
|
process.exit(1);
|
|
6675
6724
|
}
|
|
6676
6725
|
const { schema } = configManager.config;
|
|
6677
|
-
const tinaSchema = await
|
|
6726
|
+
const tinaSchema = await createSchema({
|
|
6678
6727
|
schema: { ...schema, config: configManager.config }
|
|
6679
6728
|
});
|
|
6680
6729
|
let client;
|
|
@@ -6702,7 +6751,7 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6702
6751
|
"indexerToken not configured in tina search configuration."
|
|
6703
6752
|
);
|
|
6704
6753
|
}
|
|
6705
|
-
client = new
|
|
6754
|
+
client = new TinaCMSSearchIndexClient2({
|
|
6706
6755
|
apiUrl: `${configManager.config.tinaioConfig?.contentApiUrlOverride || "https://content.tinajs.io"}/searchIndex/${configManager.config?.clientId}`,
|
|
6707
6756
|
branch: configManager.config?.branch,
|
|
6708
6757
|
indexerToken: configManager.config?.search?.tina?.indexerToken,
|
|
@@ -6711,9 +6760,9 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6711
6760
|
} else {
|
|
6712
6761
|
client = configManager.config?.search?.searchClient;
|
|
6713
6762
|
}
|
|
6714
|
-
const searchIndexer = new
|
|
6763
|
+
const searchIndexer = new SearchIndexer3({
|
|
6715
6764
|
batchSize: configManager.config.search?.indexBatchSize || 100,
|
|
6716
|
-
bridge: new
|
|
6765
|
+
bridge: new FilesystemBridge4(
|
|
6717
6766
|
configManager.rootPath,
|
|
6718
6767
|
configManager.contentRootPath
|
|
6719
6768
|
),
|
|
@@ -6741,7 +6790,7 @@ var SearchIndexCommand = class extends import_clipanion7.Command {
|
|
|
6741
6790
|
};
|
|
6742
6791
|
|
|
6743
6792
|
// src/index.ts
|
|
6744
|
-
var cli = new
|
|
6793
|
+
var cli = new Cli({
|
|
6745
6794
|
binaryName: `tinacms`,
|
|
6746
6795
|
binaryLabel: `TinaCMS`,
|
|
6747
6796
|
binaryVersion: version
|
|
@@ -6752,7 +6801,10 @@ cli.register(AuditCommand);
|
|
|
6752
6801
|
cli.register(InitCommand);
|
|
6753
6802
|
cli.register(CodemodCommand);
|
|
6754
6803
|
cli.register(SearchIndexCommand);
|
|
6755
|
-
cli.register(
|
|
6756
|
-
cli.register(
|
|
6757
|
-
cli.register(
|
|
6804
|
+
cli.register(Builtins.DefinitionsCommand);
|
|
6805
|
+
cli.register(Builtins.HelpCommand);
|
|
6806
|
+
cli.register(Builtins.VersionCommand);
|
|
6758
6807
|
var index_default = cli;
|
|
6808
|
+
export {
|
|
6809
|
+
index_default as default
|
|
6810
|
+
};
|