@prismicio/cli 0.0.3-beta.11 → 0.0.3-beta.13
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 +6 -0
- package/dist/{cli-DhqlE1U5.js → cli-DDs8_xoz.js} +263 -508
- package/dist/{cli-DhqlE1U5.js.map → cli-DDs8_xoz.js.map} +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1 -1
- package/dist/commands/sync.d.ts +1 -0
- package/dist/core/framework.d.ts +2 -3
- package/dist/core/watch.d.ts +7 -0
- package/dist/{index-Dbm9IdwU.js → index-_sNPxHKB.js} +2 -2
- package/dist/{index-Dbm9IdwU.js.map → index-_sNPxHKB.js.map} +1 -1
- package/dist/index.js +1 -1
- package/dist/{multipart-parser-Ddo0in9P.js → multipart-parser-BFd74IrK.js} +2 -2
- package/dist/{multipart-parser-Ddo0in9P.js.map → multipart-parser-BFd74IrK.js.map} +1 -1
- package/package.json +5 -6
- package/src/cli.ts +9 -1
- package/src/commands/sync.ts +23 -17
- package/src/core/framework.ts +2 -12
- package/src/core/watch.ts +181 -0
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { F as FormData, a as File2 } from "./cli-
|
|
1
|
+
import { F as FormData, a as File2 } from "./cli-DDs8_xoz.js";
|
|
2
2
|
let s = 0;
|
|
3
3
|
const S = {
|
|
4
4
|
START_BOUNDARY: s++,
|
|
@@ -351,4 +351,4 @@ async function toFormData(Body, ct) {
|
|
|
351
351
|
export {
|
|
352
352
|
toFormData
|
|
353
353
|
};
|
|
354
|
-
//# sourceMappingURL=multipart-parser-
|
|
354
|
+
//# sourceMappingURL=multipart-parser-BFd74IrK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multipart-parser-Ddo0in9P.js","sources":["../../manager/dist/_node_modules/node-fetch/src/utils/multipart-parser.js"],"sourcesContent":["import \"../../../fetch-blob/from.js\";\nimport { FormData } from \"../../../formdata-polyfill/esm.min.js\";\nimport { File } from \"../../../fetch-blob/file.js\";\nlet s = 0;\nconst S = {\n START_BOUNDARY: s++,\n HEADER_FIELD_START: s++,\n HEADER_FIELD: s++,\n HEADER_VALUE_START: s++,\n HEADER_VALUE: s++,\n HEADER_VALUE_ALMOST_DONE: s++,\n HEADERS_ALMOST_DONE: s++,\n PART_DATA_START: s++,\n PART_DATA: s++,\n END: s++\n};\nlet f = 1;\nconst F = {\n PART_BOUNDARY: f,\n LAST_BOUNDARY: f *= 2\n};\nconst LF = 10;\nconst CR = 13;\nconst SPACE = 32;\nconst HYPHEN = 45;\nconst COLON = 58;\nconst A = 97;\nconst Z = 122;\nconst lower = (c) => c | 32;\nconst noop = () => {\n};\nclass MultipartParser {\n /**\n * @param {string} boundary\n */\n constructor(boundary) {\n this.index = 0;\n this.flags = 0;\n this.onHeaderEnd = noop;\n this.onHeaderField = noop;\n this.onHeadersEnd = noop;\n this.onHeaderValue = noop;\n this.onPartBegin = noop;\n this.onPartData = noop;\n this.onPartEnd = noop;\n this.boundaryChars = {};\n boundary = \"\\r\\n--\" + boundary;\n const ui8a = new Uint8Array(boundary.length);\n for (let i = 0; i < boundary.length; i++) {\n ui8a[i] = boundary.charCodeAt(i);\n this.boundaryChars[ui8a[i]] = true;\n }\n this.boundary = ui8a;\n this.lookbehind = new Uint8Array(this.boundary.length + 8);\n this.state = S.START_BOUNDARY;\n }\n /**\n * @param {Uint8Array} data\n */\n write(data) {\n let i = 0;\n const length_ = data.length;\n let previousIndex = this.index;\n let { lookbehind, boundary, boundaryChars, index, state, flags } = this;\n const boundaryLength = this.boundary.length;\n const boundaryEnd = boundaryLength - 1;\n const bufferLength = data.length;\n let c;\n let cl;\n const mark = (name) => {\n this[name + \"Mark\"] = i;\n };\n const clear = (name) => {\n delete this[name + \"Mark\"];\n };\n const callback = (callbackSymbol, start, end, ui8a) => {\n if (start === void 0 || start !== end) {\n this[callbackSymbol](ui8a && ui8a.subarray(start, end));\n }\n };\n const dataCallback = (name, clear2) => {\n const markSymbol = name + \"Mark\";\n if (!(markSymbol in this)) {\n return;\n }\n if (clear2) {\n callback(name, this[markSymbol], i, data);\n delete this[markSymbol];\n } else {\n callback(name, this[markSymbol], data.length, data);\n this[markSymbol] = 0;\n }\n };\n for (i = 0; i < length_; i++) {\n c = data[i];\n switch (state) {\n case S.START_BOUNDARY:\n if (index === boundary.length - 2) {\n if (c === HYPHEN) {\n flags |= F.LAST_BOUNDARY;\n } else if (c !== CR) {\n return;\n }\n index++;\n break;\n } else if (index - 1 === boundary.length - 2) {\n if (flags & F.LAST_BOUNDARY && c === HYPHEN) {\n state = S.END;\n flags = 0;\n } else if (!(flags & F.LAST_BOUNDARY) && c === LF) {\n index = 0;\n callback(\"onPartBegin\");\n state = S.HEADER_FIELD_START;\n } else {\n return;\n }\n break;\n }\n if (c !== boundary[index + 2]) {\n index = -2;\n }\n if (c === boundary[index + 2]) {\n index++;\n }\n break;\n case S.HEADER_FIELD_START:\n state = S.HEADER_FIELD;\n mark(\"onHeaderField\");\n index = 0;\n // falls through\n case S.HEADER_FIELD:\n if (c === CR) {\n clear(\"onHeaderField\");\n state = S.HEADERS_ALMOST_DONE;\n break;\n }\n index++;\n if (c === HYPHEN) {\n break;\n }\n if (c === COLON) {\n if (index === 1) {\n return;\n }\n dataCallback(\"onHeaderField\", true);\n state = S.HEADER_VALUE_START;\n break;\n }\n cl = lower(c);\n if (cl < A || cl > Z) {\n return;\n }\n break;\n case S.HEADER_VALUE_START:\n if (c === SPACE) {\n break;\n }\n mark(\"onHeaderValue\");\n state = S.HEADER_VALUE;\n // falls through\n case S.HEADER_VALUE:\n if (c === CR) {\n dataCallback(\"onHeaderValue\", true);\n callback(\"onHeaderEnd\");\n state = S.HEADER_VALUE_ALMOST_DONE;\n }\n break;\n case S.HEADER_VALUE_ALMOST_DONE:\n if (c !== LF) {\n return;\n }\n state = S.HEADER_FIELD_START;\n break;\n case S.HEADERS_ALMOST_DONE:\n if (c !== LF) {\n return;\n }\n callback(\"onHeadersEnd\");\n state = S.PART_DATA_START;\n break;\n case S.PART_DATA_START:\n state = S.PART_DATA;\n mark(\"onPartData\");\n // falls through\n case S.PART_DATA:\n previousIndex = index;\n if (index === 0) {\n i += boundaryEnd;\n while (i < bufferLength && !(data[i] in boundaryChars)) {\n i += boundaryLength;\n }\n i -= boundaryEnd;\n c = data[i];\n }\n if (index < boundary.length) {\n if (boundary[index] === c) {\n if (index === 0) {\n dataCallback(\"onPartData\", true);\n }\n index++;\n } else {\n index = 0;\n }\n } else if (index === boundary.length) {\n index++;\n if (c === CR) {\n flags |= F.PART_BOUNDARY;\n } else if (c === HYPHEN) {\n flags |= F.LAST_BOUNDARY;\n } else {\n index = 0;\n }\n } else if (index - 1 === boundary.length) {\n if (flags & F.PART_BOUNDARY) {\n index = 0;\n if (c === LF) {\n flags &= ~F.PART_BOUNDARY;\n callback(\"onPartEnd\");\n callback(\"onPartBegin\");\n state = S.HEADER_FIELD_START;\n break;\n }\n } else if (flags & F.LAST_BOUNDARY) {\n if (c === HYPHEN) {\n callback(\"onPartEnd\");\n state = S.END;\n flags = 0;\n } else {\n index = 0;\n }\n } else {\n index = 0;\n }\n }\n if (index > 0) {\n lookbehind[index - 1] = c;\n } else if (previousIndex > 0) {\n const _lookbehind = new Uint8Array(lookbehind.buffer, lookbehind.byteOffset, lookbehind.byteLength);\n callback(\"onPartData\", 0, previousIndex, _lookbehind);\n previousIndex = 0;\n mark(\"onPartData\");\n i--;\n }\n break;\n case S.END:\n break;\n default:\n throw new Error(`Unexpected state entered: ${state}`);\n }\n }\n dataCallback(\"onHeaderField\");\n dataCallback(\"onHeaderValue\");\n dataCallback(\"onPartData\");\n this.index = index;\n this.state = state;\n this.flags = flags;\n }\n end() {\n if (this.state === S.HEADER_FIELD_START && this.index === 0 || this.state === S.PART_DATA && this.index === this.boundary.length) {\n this.onPartEnd();\n } else if (this.state !== S.END) {\n throw new Error(\"MultipartParser.end(): stream ended unexpectedly\");\n }\n }\n}\nfunction _fileName(headerValue) {\n const m = headerValue.match(/\\bfilename=(\"(.*?)\"|([^()<>@,;:\\\\\"/[\\]?={}\\s\\t]+))($|;\\s)/i);\n if (!m) {\n return;\n }\n const match = m[2] || m[3] || \"\";\n let filename = match.slice(match.lastIndexOf(\"\\\\\") + 1);\n filename = filename.replace(/%22/g, '\"');\n filename = filename.replace(/&#(\\d{4});/g, (m2, code) => {\n return String.fromCharCode(code);\n });\n return filename;\n}\nasync function toFormData(Body, ct) {\n if (!/multipart/i.test(ct)) {\n throw new TypeError(\"Failed to fetch\");\n }\n const m = ct.match(/boundary=(?:\"([^\"]+)\"|([^;]+))/i);\n if (!m) {\n throw new TypeError(\"no or bad content-type header, no multipart boundary\");\n }\n const parser = new MultipartParser(m[1] || m[2]);\n let headerField;\n let headerValue;\n let entryValue;\n let entryName;\n let contentType;\n let filename;\n const entryChunks = [];\n const formData = new FormData();\n const onPartData = (ui8a) => {\n entryValue += decoder.decode(ui8a, { stream: true });\n };\n const appendToFile = (ui8a) => {\n entryChunks.push(ui8a);\n };\n const appendFileToFormData = () => {\n const file = new File(entryChunks, filename, { type: contentType });\n formData.append(entryName, file);\n };\n const appendEntryToFormData = () => {\n formData.append(entryName, entryValue);\n };\n const decoder = new TextDecoder(\"utf-8\");\n decoder.decode();\n parser.onPartBegin = function() {\n parser.onPartData = onPartData;\n parser.onPartEnd = appendEntryToFormData;\n headerField = \"\";\n headerValue = \"\";\n entryValue = \"\";\n entryName = \"\";\n contentType = \"\";\n filename = null;\n entryChunks.length = 0;\n };\n parser.onHeaderField = function(ui8a) {\n headerField += decoder.decode(ui8a, { stream: true });\n };\n parser.onHeaderValue = function(ui8a) {\n headerValue += decoder.decode(ui8a, { stream: true });\n };\n parser.onHeaderEnd = function() {\n headerValue += decoder.decode();\n headerField = headerField.toLowerCase();\n if (headerField === \"content-disposition\") {\n const m2 = headerValue.match(/\\bname=(\"([^\"]*)\"|([^()<>@,;:\\\\\"/[\\]?={}\\s\\t]+))/i);\n if (m2) {\n entryName = m2[2] || m2[3] || \"\";\n }\n filename = _fileName(headerValue);\n if (filename) {\n parser.onPartData = appendToFile;\n parser.onPartEnd = appendFileToFormData;\n }\n } else if (headerField === \"content-type\") {\n contentType = headerValue;\n }\n headerValue = \"\";\n headerField = \"\";\n };\n for await (const chunk of Body) {\n parser.write(chunk);\n }\n parser.end();\n return formData;\n}\nexport {\n toFormData\n};\n//# sourceMappingURL=multipart-parser.js.map\n"],"names":["File"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"multipart-parser-BFd74IrK.js","sources":["../../manager/dist/_node_modules/node-fetch/src/utils/multipart-parser.js"],"sourcesContent":["import \"../../../fetch-blob/from.js\";\nimport { FormData } from \"../../../formdata-polyfill/esm.min.js\";\nimport { File } from \"../../../fetch-blob/file.js\";\nlet s = 0;\nconst S = {\n START_BOUNDARY: s++,\n HEADER_FIELD_START: s++,\n HEADER_FIELD: s++,\n HEADER_VALUE_START: s++,\n HEADER_VALUE: s++,\n HEADER_VALUE_ALMOST_DONE: s++,\n HEADERS_ALMOST_DONE: s++,\n PART_DATA_START: s++,\n PART_DATA: s++,\n END: s++\n};\nlet f = 1;\nconst F = {\n PART_BOUNDARY: f,\n LAST_BOUNDARY: f *= 2\n};\nconst LF = 10;\nconst CR = 13;\nconst SPACE = 32;\nconst HYPHEN = 45;\nconst COLON = 58;\nconst A = 97;\nconst Z = 122;\nconst lower = (c) => c | 32;\nconst noop = () => {\n};\nclass MultipartParser {\n /**\n * @param {string} boundary\n */\n constructor(boundary) {\n this.index = 0;\n this.flags = 0;\n this.onHeaderEnd = noop;\n this.onHeaderField = noop;\n this.onHeadersEnd = noop;\n this.onHeaderValue = noop;\n this.onPartBegin = noop;\n this.onPartData = noop;\n this.onPartEnd = noop;\n this.boundaryChars = {};\n boundary = \"\\r\\n--\" + boundary;\n const ui8a = new Uint8Array(boundary.length);\n for (let i = 0; i < boundary.length; i++) {\n ui8a[i] = boundary.charCodeAt(i);\n this.boundaryChars[ui8a[i]] = true;\n }\n this.boundary = ui8a;\n this.lookbehind = new Uint8Array(this.boundary.length + 8);\n this.state = S.START_BOUNDARY;\n }\n /**\n * @param {Uint8Array} data\n */\n write(data) {\n let i = 0;\n const length_ = data.length;\n let previousIndex = this.index;\n let { lookbehind, boundary, boundaryChars, index, state, flags } = this;\n const boundaryLength = this.boundary.length;\n const boundaryEnd = boundaryLength - 1;\n const bufferLength = data.length;\n let c;\n let cl;\n const mark = (name) => {\n this[name + \"Mark\"] = i;\n };\n const clear = (name) => {\n delete this[name + \"Mark\"];\n };\n const callback = (callbackSymbol, start, end, ui8a) => {\n if (start === void 0 || start !== end) {\n this[callbackSymbol](ui8a && ui8a.subarray(start, end));\n }\n };\n const dataCallback = (name, clear2) => {\n const markSymbol = name + \"Mark\";\n if (!(markSymbol in this)) {\n return;\n }\n if (clear2) {\n callback(name, this[markSymbol], i, data);\n delete this[markSymbol];\n } else {\n callback(name, this[markSymbol], data.length, data);\n this[markSymbol] = 0;\n }\n };\n for (i = 0; i < length_; i++) {\n c = data[i];\n switch (state) {\n case S.START_BOUNDARY:\n if (index === boundary.length - 2) {\n if (c === HYPHEN) {\n flags |= F.LAST_BOUNDARY;\n } else if (c !== CR) {\n return;\n }\n index++;\n break;\n } else if (index - 1 === boundary.length - 2) {\n if (flags & F.LAST_BOUNDARY && c === HYPHEN) {\n state = S.END;\n flags = 0;\n } else if (!(flags & F.LAST_BOUNDARY) && c === LF) {\n index = 0;\n callback(\"onPartBegin\");\n state = S.HEADER_FIELD_START;\n } else {\n return;\n }\n break;\n }\n if (c !== boundary[index + 2]) {\n index = -2;\n }\n if (c === boundary[index + 2]) {\n index++;\n }\n break;\n case S.HEADER_FIELD_START:\n state = S.HEADER_FIELD;\n mark(\"onHeaderField\");\n index = 0;\n // falls through\n case S.HEADER_FIELD:\n if (c === CR) {\n clear(\"onHeaderField\");\n state = S.HEADERS_ALMOST_DONE;\n break;\n }\n index++;\n if (c === HYPHEN) {\n break;\n }\n if (c === COLON) {\n if (index === 1) {\n return;\n }\n dataCallback(\"onHeaderField\", true);\n state = S.HEADER_VALUE_START;\n break;\n }\n cl = lower(c);\n if (cl < A || cl > Z) {\n return;\n }\n break;\n case S.HEADER_VALUE_START:\n if (c === SPACE) {\n break;\n }\n mark(\"onHeaderValue\");\n state = S.HEADER_VALUE;\n // falls through\n case S.HEADER_VALUE:\n if (c === CR) {\n dataCallback(\"onHeaderValue\", true);\n callback(\"onHeaderEnd\");\n state = S.HEADER_VALUE_ALMOST_DONE;\n }\n break;\n case S.HEADER_VALUE_ALMOST_DONE:\n if (c !== LF) {\n return;\n }\n state = S.HEADER_FIELD_START;\n break;\n case S.HEADERS_ALMOST_DONE:\n if (c !== LF) {\n return;\n }\n callback(\"onHeadersEnd\");\n state = S.PART_DATA_START;\n break;\n case S.PART_DATA_START:\n state = S.PART_DATA;\n mark(\"onPartData\");\n // falls through\n case S.PART_DATA:\n previousIndex = index;\n if (index === 0) {\n i += boundaryEnd;\n while (i < bufferLength && !(data[i] in boundaryChars)) {\n i += boundaryLength;\n }\n i -= boundaryEnd;\n c = data[i];\n }\n if (index < boundary.length) {\n if (boundary[index] === c) {\n if (index === 0) {\n dataCallback(\"onPartData\", true);\n }\n index++;\n } else {\n index = 0;\n }\n } else if (index === boundary.length) {\n index++;\n if (c === CR) {\n flags |= F.PART_BOUNDARY;\n } else if (c === HYPHEN) {\n flags |= F.LAST_BOUNDARY;\n } else {\n index = 0;\n }\n } else if (index - 1 === boundary.length) {\n if (flags & F.PART_BOUNDARY) {\n index = 0;\n if (c === LF) {\n flags &= ~F.PART_BOUNDARY;\n callback(\"onPartEnd\");\n callback(\"onPartBegin\");\n state = S.HEADER_FIELD_START;\n break;\n }\n } else if (flags & F.LAST_BOUNDARY) {\n if (c === HYPHEN) {\n callback(\"onPartEnd\");\n state = S.END;\n flags = 0;\n } else {\n index = 0;\n }\n } else {\n index = 0;\n }\n }\n if (index > 0) {\n lookbehind[index - 1] = c;\n } else if (previousIndex > 0) {\n const _lookbehind = new Uint8Array(lookbehind.buffer, lookbehind.byteOffset, lookbehind.byteLength);\n callback(\"onPartData\", 0, previousIndex, _lookbehind);\n previousIndex = 0;\n mark(\"onPartData\");\n i--;\n }\n break;\n case S.END:\n break;\n default:\n throw new Error(`Unexpected state entered: ${state}`);\n }\n }\n dataCallback(\"onHeaderField\");\n dataCallback(\"onHeaderValue\");\n dataCallback(\"onPartData\");\n this.index = index;\n this.state = state;\n this.flags = flags;\n }\n end() {\n if (this.state === S.HEADER_FIELD_START && this.index === 0 || this.state === S.PART_DATA && this.index === this.boundary.length) {\n this.onPartEnd();\n } else if (this.state !== S.END) {\n throw new Error(\"MultipartParser.end(): stream ended unexpectedly\");\n }\n }\n}\nfunction _fileName(headerValue) {\n const m = headerValue.match(/\\bfilename=(\"(.*?)\"|([^()<>@,;:\\\\\"/[\\]?={}\\s\\t]+))($|;\\s)/i);\n if (!m) {\n return;\n }\n const match = m[2] || m[3] || \"\";\n let filename = match.slice(match.lastIndexOf(\"\\\\\") + 1);\n filename = filename.replace(/%22/g, '\"');\n filename = filename.replace(/&#(\\d{4});/g, (m2, code) => {\n return String.fromCharCode(code);\n });\n return filename;\n}\nasync function toFormData(Body, ct) {\n if (!/multipart/i.test(ct)) {\n throw new TypeError(\"Failed to fetch\");\n }\n const m = ct.match(/boundary=(?:\"([^\"]+)\"|([^;]+))/i);\n if (!m) {\n throw new TypeError(\"no or bad content-type header, no multipart boundary\");\n }\n const parser = new MultipartParser(m[1] || m[2]);\n let headerField;\n let headerValue;\n let entryValue;\n let entryName;\n let contentType;\n let filename;\n const entryChunks = [];\n const formData = new FormData();\n const onPartData = (ui8a) => {\n entryValue += decoder.decode(ui8a, { stream: true });\n };\n const appendToFile = (ui8a) => {\n entryChunks.push(ui8a);\n };\n const appendFileToFormData = () => {\n const file = new File(entryChunks, filename, { type: contentType });\n formData.append(entryName, file);\n };\n const appendEntryToFormData = () => {\n formData.append(entryName, entryValue);\n };\n const decoder = new TextDecoder(\"utf-8\");\n decoder.decode();\n parser.onPartBegin = function() {\n parser.onPartData = onPartData;\n parser.onPartEnd = appendEntryToFormData;\n headerField = \"\";\n headerValue = \"\";\n entryValue = \"\";\n entryName = \"\";\n contentType = \"\";\n filename = null;\n entryChunks.length = 0;\n };\n parser.onHeaderField = function(ui8a) {\n headerField += decoder.decode(ui8a, { stream: true });\n };\n parser.onHeaderValue = function(ui8a) {\n headerValue += decoder.decode(ui8a, { stream: true });\n };\n parser.onHeaderEnd = function() {\n headerValue += decoder.decode();\n headerField = headerField.toLowerCase();\n if (headerField === \"content-disposition\") {\n const m2 = headerValue.match(/\\bname=(\"([^\"]*)\"|([^()<>@,;:\\\\\"/[\\]?={}\\s\\t]+))/i);\n if (m2) {\n entryName = m2[2] || m2[3] || \"\";\n }\n filename = _fileName(headerValue);\n if (filename) {\n parser.onPartData = appendToFile;\n parser.onPartEnd = appendFileToFormData;\n }\n } else if (headerField === \"content-type\") {\n contentType = headerValue;\n }\n headerValue = \"\";\n headerField = \"\";\n };\n for await (const chunk of Body) {\n parser.write(chunk);\n }\n parser.end();\n return formData;\n}\nexport {\n toFormData\n};\n//# sourceMappingURL=multipart-parser.js.map\n"],"names":["File"],"mappings":"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","x_google_ignoreList":[0]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prismicio/cli",
|
|
3
|
-
"version": "0.0.3-beta.
|
|
3
|
+
"version": "0.0.3-beta.13",
|
|
4
4
|
"description": "Prismic CLI",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -54,11 +54,10 @@
|
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@eslint/js": "9.39.1",
|
|
57
|
-
"@prismicio/adapter-next": "0.0.3-beta.
|
|
58
|
-
"@prismicio/adapter-nuxt": "0.0.3-beta.
|
|
59
|
-
"@prismicio/adapter-
|
|
60
|
-
"@prismicio/
|
|
61
|
-
"@prismicio/manager": "0.0.3-beta.11",
|
|
57
|
+
"@prismicio/adapter-next": "0.0.3-beta.15",
|
|
58
|
+
"@prismicio/adapter-nuxt": "0.0.3-beta.15",
|
|
59
|
+
"@prismicio/adapter-sveltekit": "0.0.3-beta.13",
|
|
60
|
+
"@prismicio/manager": "0.0.3-beta.13",
|
|
62
61
|
"@sentry/node": "10.28.0",
|
|
63
62
|
"@trivago/prettier-plugin-sort-imports": "6.0.0",
|
|
64
63
|
"@types/semver": "7.7.1",
|
package/src/cli.ts
CHANGED
|
@@ -23,9 +23,11 @@ VERSION
|
|
|
23
23
|
USAGE
|
|
24
24
|
$ npx prismic@latest init --repository <repository-id>
|
|
25
25
|
$ npx prismic@latest sync
|
|
26
|
+
$ npx prismic@latest sync --watch
|
|
26
27
|
|
|
27
28
|
OPTIONS
|
|
28
29
|
--repository, -r Specify a Prismic repository to use when initializing a project
|
|
30
|
+
--watch, -w Watch for changes and sync continuously (polls every 5s)
|
|
29
31
|
|
|
30
32
|
--help, -h Display CLI help
|
|
31
33
|
--version, -v Display CLI version
|
|
@@ -37,6 +39,11 @@ OPTIONS
|
|
|
37
39
|
type: "string",
|
|
38
40
|
shortFlag: "r",
|
|
39
41
|
},
|
|
42
|
+
watch: {
|
|
43
|
+
type: "boolean",
|
|
44
|
+
shortFlag: "w",
|
|
45
|
+
default: false,
|
|
46
|
+
},
|
|
40
47
|
help: {
|
|
41
48
|
type: "boolean",
|
|
42
49
|
shortFlag: "h",
|
|
@@ -68,6 +75,7 @@ export const CLIArgs = z.discriminatedUnion("commandType", [
|
|
|
68
75
|
commandType: z.literal("sync"),
|
|
69
76
|
help: z.boolean().optional(),
|
|
70
77
|
version: z.boolean().optional(),
|
|
78
|
+
watch: z.boolean().optional(),
|
|
71
79
|
}),
|
|
72
80
|
]);
|
|
73
81
|
|
|
@@ -156,7 +164,7 @@ export async function run(): Promise<void> {
|
|
|
156
164
|
}
|
|
157
165
|
|
|
158
166
|
if (commandType === "sync") {
|
|
159
|
-
await sync({ manager });
|
|
167
|
+
await sync({ manager, watch: cliArgs.data.watch });
|
|
160
168
|
process.exit(0);
|
|
161
169
|
}
|
|
162
170
|
|
package/src/commands/sync.ts
CHANGED
|
@@ -7,14 +7,16 @@ import { detectProjectContext, detectProjectState } from "../core/project";
|
|
|
7
7
|
import { validateRepository } from "../core/repository";
|
|
8
8
|
import { saveSlices } from "../core/slices";
|
|
9
9
|
import { checkCLIVersion } from "../core/version";
|
|
10
|
+
import { watchForChanges } from "../core/watch";
|
|
10
11
|
import { displaySuccess } from "../utils/output";
|
|
11
12
|
|
|
12
13
|
type SyncArgs = {
|
|
13
14
|
manager: PrismicManager;
|
|
15
|
+
watch?: boolean;
|
|
14
16
|
};
|
|
15
17
|
|
|
16
18
|
export async function sync(args: SyncArgs): Promise<void> {
|
|
17
|
-
const { manager } = args;
|
|
19
|
+
const { manager, watch = false } = args;
|
|
18
20
|
|
|
19
21
|
// Authentication - Also updates Sentry context
|
|
20
22
|
await login(manager);
|
|
@@ -37,22 +39,26 @@ export async function sync(args: SyncArgs): Promise<void> {
|
|
|
37
39
|
// Initialize the plugin system
|
|
38
40
|
await manager.plugins.initPlugins();
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
if (watch) {
|
|
43
|
+
// Watch mode: sync then poll for changes continuously
|
|
44
|
+
await watchForChanges({ manager, repositoryName });
|
|
45
|
+
} else {
|
|
46
|
+
// One-time sync
|
|
47
|
+
await saveSlices({ manager });
|
|
48
|
+
await saveCustomTypes({ manager });
|
|
42
49
|
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
await manager.telemetry.track({
|
|
51
|
+
event: "prismic-cli:end",
|
|
52
|
+
commandType: "sync",
|
|
53
|
+
repository: repositoryName,
|
|
54
|
+
fullCommand: process.argv.join(" "),
|
|
55
|
+
success: true,
|
|
56
|
+
watch: false,
|
|
57
|
+
});
|
|
45
58
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
success: true,
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
displaySuccess(
|
|
55
|
-
"Sync completed successfully!",
|
|
56
|
-
"Your local types are up to date.",
|
|
57
|
-
);
|
|
59
|
+
displaySuccess(
|
|
60
|
+
"Sync completed successfully!",
|
|
61
|
+
"Your local types are up to date.",
|
|
62
|
+
);
|
|
63
|
+
}
|
|
58
64
|
}
|
package/src/core/framework.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { join } from "node:path";
|
|
|
3
3
|
|
|
4
4
|
import adapterNextPlugin from "@prismicio/adapter-next";
|
|
5
5
|
import adapterNuxtPlugin from "@prismicio/adapter-nuxt";
|
|
6
|
-
import adapterNuxt2Plugin from "@prismicio/adapter-nuxt2";
|
|
7
6
|
import adapterSveltekitPlugin from "@prismicio/adapter-sveltekit";
|
|
8
7
|
import { type PrismicManager } from "@prismicio/manager";
|
|
9
8
|
import semver from "semver";
|
|
@@ -19,9 +18,9 @@ export type Framework = {
|
|
|
19
18
|
name: string;
|
|
20
19
|
|
|
21
20
|
/**
|
|
22
|
-
* Framework 's id sent to Segment
|
|
21
|
+
* Framework 's id sent to Segment
|
|
23
22
|
*/
|
|
24
|
-
telemetryID: "next" | "nuxt
|
|
23
|
+
telemetryID: "next" | "nuxt" | "sveltekit-1" | "sveltekit-2";
|
|
25
24
|
|
|
26
25
|
/**
|
|
27
26
|
* Package name of the adapter responsible for this framework
|
|
@@ -42,14 +41,6 @@ export type Framework = {
|
|
|
42
41
|
* higher it is the more priority it has in case multiple matches)
|
|
43
42
|
*/
|
|
44
43
|
export const FRAMEWORKS: Record<string, Framework> = {
|
|
45
|
-
"nuxt-2": {
|
|
46
|
-
name: "Nuxt 2",
|
|
47
|
-
telemetryID: "nuxt-2",
|
|
48
|
-
adapterName: "@prismicio/adapter-nuxt2",
|
|
49
|
-
compatibility: {
|
|
50
|
-
nuxt: "^2.0.0",
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
44
|
nuxt: {
|
|
54
45
|
name: "Nuxt",
|
|
55
46
|
telemetryID: "nuxt",
|
|
@@ -175,6 +166,5 @@ export async function initFramework(args: InitFrameworkArgs): Promise<void> {
|
|
|
175
166
|
export const FRAMEWORK_PLUGINS = {
|
|
176
167
|
"@prismicio/adapter-next": adapterNextPlugin,
|
|
177
168
|
"@prismicio/adapter-nuxt": adapterNuxtPlugin,
|
|
178
|
-
"@prismicio/adapter-nuxt2": adapterNuxt2Plugin,
|
|
179
169
|
"@prismicio/adapter-sveltekit": adapterSveltekitPlugin,
|
|
180
170
|
};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import type { PrismicManager } from "@prismicio/manager";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import crypto from "crypto";
|
|
4
|
+
|
|
5
|
+
import { displaySuccess } from "../utils/output";
|
|
6
|
+
|
|
7
|
+
import { saveCustomTypes } from "./customType";
|
|
8
|
+
import { saveSlices } from "./slices";
|
|
9
|
+
|
|
10
|
+
// 5 seconds balances responsiveness with API load
|
|
11
|
+
const POLL_INTERVAL_MS = 5000;
|
|
12
|
+
const MAX_BACKOFF_MS = 60000; // Cap backoff at 1 minute
|
|
13
|
+
const MAX_CONSECUTIVE_ERRORS = 10;
|
|
14
|
+
const SHUTDOWN_TIMEOUT_MS = 3000; // Max time to wait for telemetry on shutdown
|
|
15
|
+
|
|
16
|
+
type WatchForChangesArgs = {
|
|
17
|
+
manager: PrismicManager;
|
|
18
|
+
repositoryName: string;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export async function watchForChanges(
|
|
22
|
+
args: WatchForChangesArgs,
|
|
23
|
+
): Promise<void> {
|
|
24
|
+
const { manager, repositoryName } = args;
|
|
25
|
+
|
|
26
|
+
// Perform initial sync and capture hashes
|
|
27
|
+
const initialSlices = await manager.slices.fetchRemoteSlices();
|
|
28
|
+
const initialCustomTypes = await manager.customTypes.fetchRemoteCustomTypes();
|
|
29
|
+
|
|
30
|
+
await saveSlices({ manager });
|
|
31
|
+
await saveCustomTypes({ manager });
|
|
32
|
+
|
|
33
|
+
let lastSlicesHash = computeHash(initialSlices);
|
|
34
|
+
let lastCustomTypesHash = computeHash(initialCustomTypes);
|
|
35
|
+
|
|
36
|
+
displaySuccess("Initial sync completed!", "Now watching for changes...");
|
|
37
|
+
displayWatching({ intervalMs: POLL_INTERVAL_MS });
|
|
38
|
+
|
|
39
|
+
// Graceful shutdown handling
|
|
40
|
+
const shutdown = async () => {
|
|
41
|
+
displayStandout("Watch stopped. Goodbye!");
|
|
42
|
+
|
|
43
|
+
// Best-effort telemetry with timeout (don't hang forever if telemetry fails)
|
|
44
|
+
await Promise.race([
|
|
45
|
+
manager.telemetry.track({
|
|
46
|
+
event: "prismic-cli:end",
|
|
47
|
+
commandType: "sync",
|
|
48
|
+
repository: repositoryName,
|
|
49
|
+
fullCommand: process.argv.join(" "),
|
|
50
|
+
success: true,
|
|
51
|
+
watch: true,
|
|
52
|
+
}),
|
|
53
|
+
new Promise((resolve) => setTimeout(resolve, SHUTDOWN_TIMEOUT_MS)),
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
process.exit(0);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Handle all common termination signals
|
|
60
|
+
process.on("SIGINT", shutdown); // Ctrl+C
|
|
61
|
+
process.on("SIGTERM", shutdown); // kill command
|
|
62
|
+
process.on("SIGHUP", shutdown); // terminal closed
|
|
63
|
+
process.on("SIGQUIT", shutdown); // Ctrl+\
|
|
64
|
+
if (process.platform === "win32") {
|
|
65
|
+
process.on("SIGBREAK", shutdown); // Windows Ctrl+Break
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let consecutiveErrors = 0;
|
|
69
|
+
|
|
70
|
+
// Watch loop - runs indefinitely until terminated by signal (Ctrl+C, etc.)
|
|
71
|
+
while (true) {
|
|
72
|
+
await sleep(consecutiveErrors);
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
const remoteSlices = await manager.slices.fetchRemoteSlices();
|
|
76
|
+
const remoteCustomTypes =
|
|
77
|
+
await manager.customTypes.fetchRemoteCustomTypes();
|
|
78
|
+
|
|
79
|
+
const slicesHash = computeHash(remoteSlices);
|
|
80
|
+
const customTypesHash = computeHash(remoteCustomTypes);
|
|
81
|
+
|
|
82
|
+
const slicesChanged = slicesHash !== lastSlicesHash;
|
|
83
|
+
const customTypesChanged = customTypesHash !== lastCustomTypesHash;
|
|
84
|
+
|
|
85
|
+
if (slicesChanged || customTypesChanged) {
|
|
86
|
+
displayChange({
|
|
87
|
+
slices: slicesChanged,
|
|
88
|
+
customTypes: customTypesChanged,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
if (slicesChanged) {
|
|
92
|
+
await saveSlices({ manager });
|
|
93
|
+
lastSlicesHash = slicesHash;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (customTypesChanged) {
|
|
97
|
+
await saveCustomTypes({ manager });
|
|
98
|
+
lastCustomTypesHash = customTypesHash;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
displaySyncComplete();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Reset error count on success
|
|
105
|
+
consecutiveErrors = 0;
|
|
106
|
+
} catch (error) {
|
|
107
|
+
consecutiveErrors++;
|
|
108
|
+
|
|
109
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
110
|
+
|
|
111
|
+
const nextDelay = Math.min(
|
|
112
|
+
POLL_INTERVAL_MS * Math.pow(2, consecutiveErrors - 1),
|
|
113
|
+
MAX_BACKOFF_MS,
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
displayRetryWarning(
|
|
117
|
+
`Error checking for changes: ${message}. Retrying in ${nextDelay / 1000}s...`,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
`Too many consecutive errors (${MAX_CONSECUTIVE_ERRORS}), stopping watch.`,
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function computeHash(data: unknown): string {
|
|
130
|
+
return crypto.createHash("sha256").update(JSON.stringify(data)).digest("hex");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Exponential backoff: 5s, 10s, 20s, 40s, 60s (capped)
|
|
134
|
+
function sleep(errorCount: number): Promise<void> {
|
|
135
|
+
const delay =
|
|
136
|
+
errorCount === 0
|
|
137
|
+
? POLL_INTERVAL_MS
|
|
138
|
+
: Math.min(
|
|
139
|
+
POLL_INTERVAL_MS * Math.pow(2, errorCount - 1),
|
|
140
|
+
MAX_BACKOFF_MS,
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
return new Promise((resolve) => setTimeout(resolve, delay));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function displayWatching({ intervalMs }: { intervalMs: number }): void {
|
|
147
|
+
const seconds = intervalMs / 1000;
|
|
148
|
+
console.info(
|
|
149
|
+
chalk.cyan(`\n Watching for changes (polling every ${seconds}s)...`),
|
|
150
|
+
);
|
|
151
|
+
console.info(chalk.gray(" Press Ctrl+C to stop\n"));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function displayChange({
|
|
155
|
+
slices,
|
|
156
|
+
customTypes,
|
|
157
|
+
}: {
|
|
158
|
+
slices: boolean;
|
|
159
|
+
customTypes: boolean;
|
|
160
|
+
}): void {
|
|
161
|
+
const timestamp = new Date().toLocaleTimeString();
|
|
162
|
+
const changes = [slices && "slices", customTypes && "custom types"]
|
|
163
|
+
.filter(Boolean)
|
|
164
|
+
.join(" and ");
|
|
165
|
+
|
|
166
|
+
console.info(chalk.blue(`\n [${timestamp}] Changes detected in ${changes}`));
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function displaySyncComplete(): void {
|
|
170
|
+
console.info(chalk.green(" ✓ Changes synced successfully\n"));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Message with padding to visually stand out from the continuous watch output
|
|
174
|
+
function displayStandout(message: string): void {
|
|
175
|
+
console.info(chalk.blue(`\n ${message}\n`));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Inline warning without extra padding to keep retry messages compact
|
|
179
|
+
function displayRetryWarning(message: string): void {
|
|
180
|
+
console.warn(chalk.yellow(` ⚠ ${message}`));
|
|
181
|
+
}
|