diff --git a/README.md b/README.md index 0841ddc..d68745b 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Once the installation is complete, you can verify the install using ```sh $ appwrite -v -6.0.0-rc.2 +6.0.0-rc.3 ``` ### Install using prebuilt binaries @@ -60,7 +60,7 @@ $ scoop install https://raw.githubusercontent.com/appwrite/sdk-for-cli/master/sc Once the installation completes, you can verify your install using ``` $ appwrite -v -6.0.0-rc.2 +6.0.0-rc.3 ``` ## Getting Started diff --git a/install.ps1 b/install.ps1 index f6a9445..109a34b 100644 --- a/install.ps1 +++ b/install.ps1 @@ -13,8 +13,8 @@ # You can use "View source" of this page to see the full script. # REPO -$GITHUB_x64_URL = "https://github.com/appwrite/sdk-for-cli/releases/download/6.0.0-rc.2/appwrite-cli-win-x64.exe" -$GITHUB_arm64_URL = "https://github.com/appwrite/sdk-for-cli/releases/download/6.0.0-rc.2/appwrite-cli-win-arm64.exe" +$GITHUB_x64_URL = "https://github.com/appwrite/sdk-for-cli/releases/download/6.0.0-rc.3/appwrite-cli-win-x64.exe" +$GITHUB_arm64_URL = "https://github.com/appwrite/sdk-for-cli/releases/download/6.0.0-rc.3/appwrite-cli-win-arm64.exe" $APPWRITE_BINARY_NAME = "appwrite.exe" diff --git a/install.sh b/install.sh index 7d41d28..9079e66 100644 --- a/install.sh +++ b/install.sh @@ -97,7 +97,7 @@ printSuccess() { downloadBinary() { echo "[2/4] Downloading executable for $OS ($ARCH) ..." - GITHUB_LATEST_VERSION="6.0.0-rc.2" + GITHUB_LATEST_VERSION="6.0.0-rc.3" GITHUB_FILE="appwrite-cli-${OS}-${ARCH}" GITHUB_URL="https://github.com/$GITHUB_REPOSITORY_NAME/releases/download/$GITHUB_LATEST_VERSION/$GITHUB_FILE" diff --git a/lib/client.js b/lib/client.js index 050c65e..aad186a 100644 --- a/lib/client.js +++ b/lib/client.js @@ -16,8 +16,8 @@ class Client { 'x-sdk-name': 'Command Line', 'x-sdk-platform': 'console', 'x-sdk-language': 'cli', - 'x-sdk-version': '6.0.0-rc.2', - 'user-agent' : `AppwriteCLI/6.0.0-rc.2 (${os.type()} ${os.version()}; ${os.arch()})`, + 'x-sdk-version': '6.0.0-rc.3', + 'user-agent' : `AppwriteCLI/6.0.0-rc.3 (${os.type()} ${os.version()}; ${os.arch()})`, 'X-Appwrite-Response-Format' : '1.5.0', }; } @@ -168,7 +168,7 @@ class Client { body = formData; } else { - body = JSON.stringify(params); + body = JSONbig.stringify(params); } let response = undefined; @@ -224,7 +224,7 @@ class Client { const text = await response.text(); let json = undefined; try { - json = JSON.parse(text); + json = JSONbig.parse(text); } catch (error) { return text; } diff --git a/lib/commands/pull.js b/lib/commands/pull.js index 5063e51..d133f20 100644 --- a/lib/commands/pull.js +++ b/lib/commands/pull.js @@ -11,7 +11,7 @@ const { databasesGet, databasesListCollections, databasesList } = require("./dat const { storageListBuckets } = require("./storage"); const { localConfig } = require("../config"); const { paginate } = require("../paginate"); -const { questionsPullCollection, questionsPullFunctions, questionsPullResources } = require("../questions"); +const { questionsPullCollection, questionsPullFunctions, questionsPullFunctionsCode, questionsPullResources } = require("../questions"); const { cliConfig, success, log, warn, actionRunner, commandDescriptions } = require("../parser"); const pullResources = async () => { @@ -56,7 +56,7 @@ const pullSettings = async () => { } } -const pullFunctions = async () => { +const pullFunctions = async ({ code }) => { log("Fetching functions ..."); let total = 0; @@ -74,11 +74,15 @@ const pullFunctions = async () => { ? (await paginate(functionsList, { parseOutput: false }, 100, 'functions')).functions : (await inquirer.prompt(questionsPullFunctions)).functions; + let allowCodePull = cliConfig.force === true ? true : null; + for (let func of functions) { total++; log(`Pulling function ${chalk.bold(func['name'])} ...`); const localFunction = localConfig.getFunction(func.$id); + + func['path'] = localFunction['path']; if(!localFunction['path']) { func['path'] = `functions/${func.$id}`; } @@ -88,28 +92,40 @@ const pullFunctions = async () => { if (!fs.existsSync(func['path'])) { fs.mkdirSync(func['path'], { recursive: true }); } - - if(func['deployment']) { - const compressedFileName = `${func['$id']}-${+new Date()}.tar.gz` - await functionsDownloadDeployment({ - functionId: func['$id'], - deploymentId: func['deployment'], - destination: compressedFileName, - overrideForCli: true, - parseOutput: false - }); - - tar.extract({ - sync: true, - cwd: func['path'], - file: compressedFileName, - strict: false, - }); - - fs.rmSync(compressedFileName); - } - } + + if(code === false) { + warn("Source code download skipped."); + } else if(!func['deployment']) { + warn("Source code download skipped because function doesn't have active deployment."); + } else { + if(allowCodePull === null) { + const codeAnswer = await inquirer.prompt(questionsPullFunctionsCode); + allowCodePull = codeAnswer.override; + } + + if(allowCodePull) { + log("Pulling active deployment's code ..."); + + const compressedFileName = `${func['$id']}-${+new Date()}.tar.gz` + await functionsDownloadDeployment({ + functionId: func['$id'], + deploymentId: func['deployment'], + destination: compressedFileName, + overrideForCli: true, + parseOutput: false + }); + tar.extract({ + sync: true, + cwd: func['path'], + file: compressedFileName, + strict: false, + }); + + fs.rmSync(compressedFileName); + } + } + success(`Successfully pulled ${chalk.bold(total)} functions.`); } @@ -261,6 +277,7 @@ pull .command("function") .alias("functions") .description("Pulling your Appwrite cloud function") + .option("--no-code", "Don't pull the function's code") .action(actionRunner(pullFunctions)) pull diff --git a/lib/commands/push.js b/lib/commands/push.js index 949b299..d516f8b 100644 --- a/lib/commands/push.js +++ b/lib/commands/push.js @@ -67,7 +67,7 @@ const { checkDeployConditions } = require('../utils'); const STEP_SIZE = 100; // Resources const POLL_DEBOUNCE = 2000; // Milliseconds -const POLL_MAX_DEBOUNCE = 30; // Times +const POLL_MAX_DEBOUNCE = 1800; // Times of POLL_DEBOUNCE (1 hour) let pollMaxDebounces = 30; @@ -354,8 +354,8 @@ const createAttribute = async (databaseId, collectionId, attribute) => { collectionId, key: attribute.key, required: attribute.required, - min: parseInt(attribute.min.toString()), - max: parseInt(attribute.max.toString()), + min: attribute.min, + max: attribute.max, xdefault: attribute.default, array: attribute.array, parseOutput: false @@ -366,8 +366,8 @@ const createAttribute = async (databaseId, collectionId, attribute) => { collectionId, key: attribute.key, required: attribute.required, - min: parseFloat(attribute.min.toString()), - max: parseFloat(attribute.max.toString()), + min: attribute.min, + max: attribute.max, xdefault: attribute.default, array: attribute.array, parseOutput: false @@ -471,8 +471,8 @@ const updateAttribute = async (databaseId, collectionId, attribute) => { collectionId, key: attribute.key, required: attribute.required, - min: parseInt(attribute.min.toString()), - max: parseInt(attribute.max.toString()), + min: attribute.min, + max: attribute.max, xdefault: attribute.default, array: attribute.array, parseOutput: false @@ -483,8 +483,8 @@ const updateAttribute = async (databaseId, collectionId, attribute) => { collectionId, key: attribute.key, required: attribute.required, - min: parseFloat(attribute.min.toString()), - max: parseFloat(attribute.max.toString()), + min: attribute.min, + max: attribute.max, xdefault: attribute.default, array: attribute.array, parseOutput: false @@ -884,6 +884,7 @@ const pushFunction = async ({ functionId, async, returnOnZero } = { returnOnZero logging: func.logging, entrypoint: func.entrypoint, commands: func.commands, + scopes: func.scopes, providerRepositoryId: func.providerRepositoryId ?? "", installationId: func.installationId ?? '', providerBranch: func.providerBranch ?? '', diff --git a/lib/commands/run.js b/lib/commands/run.js index 425e6d6..0ea914a 100644 --- a/lib/commands/run.js +++ b/lib/commands/run.js @@ -86,12 +86,12 @@ const runFunction = async ({ port, functionId, noVariables, noReload, userId } = log("If you wish to change your local settings, update the appwrite.json file and rerun the 'appwrite run' command."); hint("Permissions, events, CRON and timeouts dont apply when running locally."); - await dockerCleanup(); + await dockerCleanup(func.$id); process.on('SIGINT', async () => { log('Cleaning up ...'); - await dockerCleanup(); - success(); + await dockerCleanup(func.$id); + success("Local function successfully stopped."); process.exit(); }); @@ -135,7 +135,7 @@ const runFunction = async ({ port, functionId, noVariables, noReload, userId } = variables['APPWRITE_FUNCTION_RUNTIME_VERSION'] = func.runtime; try { - await JwtManager.setup(userId); + await JwtManager.setup(userId, func.scopes ?? []); } catch(err) { warn("Dynamic API key not generated. Header x-appwrite-key will not be set. Reason: " + err.message); } @@ -149,18 +149,12 @@ const runFunction = async ({ port, functionId, noVariables, noReload, userId } = variables['OPEN_RUNTIMES_HEADERS'] = JSON.stringify(headers); await dockerPull(func); - await dockerBuild(func, variables); - - log('Starting function using Docker ...'); - hint('Function automatically restarts when you edit your code.'); - - await dockerStart(func, variables, port); new Tail(logsPath).on("line", function(data) { - process.stdout.write(chalk.blackBright(`${data}\n`)); + process.stdout.write(chalk.white(`${data}\n`)); }); new Tail(errorsPath).on("line", function(data) { - process.stdout.write(chalk.blackBright(`${data}\n`)); + process.stdout.write(chalk.white(`${data}\n`)); }); if(!noReload) { @@ -181,8 +175,14 @@ const runFunction = async ({ port, functionId, noVariables, noReload, userId } = const dependencyFile = files.find((filePath) => tool.dependencyFiles.includes(filePath)); if(tool.isCompiled || dependencyFile) { - log(`Rebuilding the function ...`); + log(`Rebuilding the function due to file changes ...`); await dockerBuild(func, variables); + + if(!Queue.isEmpty()) { + Queue.unlock(); + return; + } + await dockerStart(func, variables, port); } else { log('Hot-swapping function.. Files with change are ' + files.join(', ')); @@ -247,6 +247,22 @@ const runFunction = async ({ port, functionId, noVariables, noReload, userId } = Queue.unlock(); } }); + + Queue.lock(); + + log('Building function using Docker ...'); + await dockerBuild(func, variables); + + if(!Queue.isEmpty()) { + Queue.unlock(); + return; + } + + log('Starting function using Docker ...'); + hint('Function automatically restarts when you edit your code.'); + await dockerStart(func, variables, port); + + Queue.unlock(); } const run = new Command("run") diff --git a/lib/config.js b/lib/config.js index af4c95d..665e983 100644 --- a/lib/config.js +++ b/lib/config.js @@ -4,15 +4,36 @@ const _path = require("path"); const process = require("process"); const JSONbig = require("json-bigint")({ storeAsString: false }); -const KeysFunction = ["path", "$id", "execute", "name", "enabled", "logging", "runtime", "scopes", "events", "schedule", "timeout", "entrypoint", "commands"]; -const KeysDatabase = ["$id", "name", "enabled"]; -const KeysCollection = ["$id", "$permissions", "databaseId", "name", "enabled", "documentSecurity", "attributes", "indexes"]; -const KeysStorage = ["$id", "$permissions", "fileSecurity", "name", "enabled", "maximumFileSize", "allowedFileExtensions", "compression", "encryption", "antivirus"]; -const KeyTopics = ["$id", "name", "subscribe"]; -const KeyAttributes = ["key", "type", "required", "array", "size", "default"]; -const KeyIndexes = ["key", "type", "status", "attributes", "orders"]; - -function whitelistKeys(value, keys, nestedKeys = []) { +const KeysFunction = new Set(["path", "$id", "execute", "name", "enabled", "logging", "runtime", "scopes", "events", "schedule", "timeout", "entrypoint", "commands"]); +const KeysDatabase = new Set(["$id", "name", "enabled"]); +const KeysCollection = new Set(["$id", "$permissions", "databaseId", "name", "enabled", "documentSecurity", "attributes", "indexes"]); +const KeysStorage = new Set(["$id", "$permissions", "fileSecurity", "name", "enabled", "maximumFileSize", "allowedFileExtensions", "compression", "encryption", "antivirus"]); +const KeyTopics = new Set(["$id", "name", "subscribe"]); +const KeyAttributes = new Set([ + "key", + "type", + "required", + "array", + "size", + "default", + // integer and float + "min", + "max", + // email, enum, URL, IP, and datetime + "format", + // enum + "elements", + // relationship + "relatedCollection", + "relationType", + "twoWay", + "twoWayKey", + "onDelete", + "side" +]); +const KeyIndexes = new Set(["key", "type", "status", "attributes", "orders"]); + +function whitelistKeys(value, keys, nestedKeys = {}) { if(Array.isArray(value)) { const newValue = []; @@ -25,7 +46,7 @@ function whitelistKeys(value, keys, nestedKeys = []) { const newValue = {}; Object.keys(value).forEach((key) => { - if(keys.includes(key)) { + if(keys.has(key)) { if(nestedKeys[key]) { newValue[key] = whitelistKeys(value[key], nestedKeys[key]); } else { diff --git a/lib/emulation/docker.js b/lib/emulation/docker.js index 2dde55f..d93f280 100644 --- a/lib/emulation/docker.js +++ b/lib/emulation/docker.js @@ -4,11 +4,15 @@ const { localConfig } = require("../config"); const path = require('path'); const fs = require('fs'); const { log, success, hint } = require("../parser"); -const { openRuntimesVersion, systemTools } = require("./utils"); +const { openRuntimesVersion, systemTools, Queue } = require("./utils"); async function dockerStop(id) { const stopProcess = childProcess.spawn('docker', ['rm', '--force', id], { stdio: 'pipe', + env: { + ...process.env, + DOCKER_CLI_HINTS: 'false' + } }); await new Promise((res) => { stopProcess.on('close', res) }); @@ -20,45 +24,20 @@ async function dockerPull(func) { const runtimeName = runtimeChunks.join("-"); const imageName = `openruntimes/${runtimeName}:${openRuntimesVersion}-${runtimeVersion}`; - const checkProcess = childProcess.spawn('docker', ['images', '--format', 'json', imageName], { - stdio: 'pipe', - pwd: path.join(process.cwd(), func.path) - }); - - let hasImage = false; - - checkProcess.stdout.on('data', (data) => { - if(data) { - hasImage = false; - } - }); - - checkProcess.stderr.on('data', (data) => { - if(data) { - hasImage = false; - } - }); - - await new Promise((res) => { checkProcess.on('close', res) }); - - if(hasImage) { - return; - } - - log('Pulling Docker image ...'); - hint('This may take a few minutes, but we only need to do this once.'); + log('Verifying Docker image ...'); const pullProcess = childProcess.spawn('docker', ['pull', imageName], { stdio: 'pipe', - pwd: path.join(process.cwd(), func.path) + env: { + ...process.env, + DOCKER_CLI_HINTS: 'false' + } }); await new Promise((res) => { pullProcess.on('close', res) }); } async function dockerBuild(func, variables) { - log('Building function using Docker ...'); - const runtimeChunks = func.runtime.split("-"); const runtimeVersion = runtimeChunks.pop(); const runtimeName = runtimeChunks.join("-"); @@ -74,7 +53,6 @@ async function dockerBuild(func, variables) { params.push('-e', 'APPWRITE_ENV=development'); params.push('-e', 'OPEN_RUNTIMES_ENV=development'); params.push('-e', 'OPEN_RUNTIMES_SECRET='); - params.push('-l', 'appwrite-env=dev'); params.push('-e', `OPEN_RUNTIMES_ENTRYPOINT=${func.entrypoint}`); for(const k of Object.keys(variables)) { @@ -85,7 +63,11 @@ async function dockerBuild(func, variables) { const buildProcess = childProcess.spawn('docker', params, { stdio: 'pipe', - pwd: functionDir + pwd: functionDir, + env: { + ...process.env, + DOCKER_CLI_HINTS: 'false' + } }); buildProcess.stdout.on('data', (data) => { @@ -96,8 +78,25 @@ async function dockerBuild(func, variables) { process.stderr.write(chalk.blackBright(`${data}\n`)); }); + const killInterval = setInterval(() => { + if(!Queue.isEmpty()) { + log('Cancelling build ...'); + buildProcess.stdout.destroy(); + buildProcess.stdin.destroy(); + buildProcess.stderr.destroy(); + buildProcess.kill("SIGKILL"); + clearInterval(killInterval); + } + }, 100); + await new Promise((res) => { buildProcess.on('close', res) }); + clearInterval(interval); + + if(!Queue.isEmpty()) { + return; + } + const copyPath = path.join(process.cwd(), func.path, '.appwrite', 'build.tar.gz'); const copyDir = path.dirname(copyPath); if (!fs.existsSync(copyDir)) { @@ -106,7 +105,11 @@ async function dockerBuild(func, variables) { const copyProcess = childProcess.spawn('docker', ['cp', `${id}:/mnt/code/code.tar.gz`, copyPath], { stdio: 'pipe', - pwd: functionDir + pwd: functionDir, + env: { + ...process.env, + DOCKER_CLI_HINTS: 'false' + } }); await new Promise((res) => { copyProcess.on('close', res) }); @@ -133,10 +136,8 @@ async function dockerStart(func, variables, port) { const params = [ 'run' ]; params.push('--rm'); - params.push('-d'); params.push('--name', id); params.push('-p', `${port}:3000`); - params.push('-l', 'appwrite-env=dev'); params.push('-e', 'APPWRITE_ENV=development'); params.push('-e', 'OPEN_RUNTIMES_ENV=development'); params.push('-e', 'OPEN_RUNTIMES_SECRET='); @@ -150,58 +151,38 @@ async function dockerStart(func, variables, port) { params.push('-v', `${functionDir}/.appwrite/build.tar.gz:/mnt/code/code.tar.gz:ro`); params.push(imageName, 'sh', '-c', `helpers/start.sh "${tool.startCommand}"`); - childProcess.spawn('docker', params, { + const startProcess = childProcess.spawn('docker', params, { stdio: 'pipe', - pwd: functionDir + pwd: functionDir, + env: { + ...process.env, + DOCKER_CLI_HINTS: 'false' + } }); - success(`Visit http://localhost:${port}/ to execute your function.`); -} - -async function dockerCleanup() { - await dockerStopActive(); + startProcess.stdout.on('data', (data) => { + process.stdout.write(chalk.blackBright(data)); + }); - const functions = localConfig.getFunctions(); - for(const func of functions) { - const appwritePath = path.join(process.cwd(), func.path, '.appwrite'); - if (fs.existsSync(appwritePath)) { - fs.rmSync(appwritePath, { recursive: true, force: true }); - } + startProcess.stderr.on('data', (data) => { + process.stdout.write(chalk.blackBright(data)); + }); - const tempPath = path.join(process.cwd(), func.path, 'code.tar.gz'); - if (fs.existsSync(tempPath)) { - fs.rmSync(tempPath, { force: true }); - } - } + success(`Visit http://localhost:${port}/ to execute your function.`); } -async function dockerStopActive() { - const listProcess = childProcess.spawn('docker', ['ps', '-a', '-q', '--filter', 'label=appwrite-env=dev'], { - stdio: 'pipe', - }); +async function dockerCleanup(functionId) { + await dockerStop(functionId); - const ids = []; - function handleOutput(data) { - const list = data.toString().split('\n'); - for(const id of list) { - if(id && !id.includes(' ')) { - ids.push(id); - } - } + const func = localConfig.getFunction(functionId); + const appwritePath = path.join(process.cwd(), func.path, '.appwrite'); + if (fs.existsSync(appwritePath)) { + fs.rmSync(appwritePath, { recursive: true, force: true }); } - listProcess.stdout.on('data', (data) => { - handleOutput(data); - }); - - listProcess.stderr.on('data', (data) => { - handleOutput(data); - }); - - await new Promise((res) => { listProcess.on('close', res) }); - - for(const id of ids) { - await dockerStop(id); + const tempPath = path.join(process.cwd(), func.path, 'code.tar.gz'); + if (fs.existsSync(tempPath)) { + fs.rmSync(tempPath, { force: true }); } } @@ -210,6 +191,5 @@ module.exports = { dockerBuild, dockerStart, dockerCleanup, - dockerStopActive, dockerStop, } diff --git a/lib/emulation/utils.js b/lib/emulation/utils.js index 496aa55..f32a6b9 100644 --- a/lib/emulation/utils.js +++ b/lib/emulation/utils.js @@ -1,6 +1,8 @@ const EventEmitter = require('node:events'); const { projectsCreateJWT } = require('../commands/projects'); const { localConfig } = require("../config"); +const { usersGet, usersCreateJWT } = require("../commands/users"); +const { log } = require("../parser"); const openRuntimesVersion = 'v4'; @@ -95,7 +97,7 @@ const JwtManager = { timerWarn: null, timerError: null, - async setup(userId = null) { + async setup(userId = null, projectScopes = []) { if(this.timerWarn) { clearTimeout(this.timerWarn); } @@ -128,8 +130,7 @@ const JwtManager = { const functionResponse = await projectsCreateJWT({ projectId: localConfig.getProject().projectId, - // TODO: Once we have endpoint for this, use it - scopes: ["sessions.write","users.read","users.write","teams.read","teams.write","databases.read","databases.write","collections.read","collections.write","attributes.read","attributes.write","indexes.read","indexes.write","documents.read","documents.write","files.read","files.write","buckets.read","buckets.write","functions.read","functions.write","execution.read","execution.write","locale.read","avatars.read","health.read","providers.read","providers.write","messages.read","messages.write","topics.read","topics.write","subscribers.read","subscribers.write","targets.read","targets.write","rules.read","rules.write","migrations.read","migrations.write","vcs.read","vcs.write","assistant.read"], + scopes: projectScopes, duration: 60*60, parseOutput: false }); @@ -155,6 +156,9 @@ const Queue = { this.files = []; this.locked = true; }, + isEmpty() { + return this.files.length === 0 + }, unlock() { this.locked = false; if(this.files.length > 0) { diff --git a/lib/parser.js b/lib/parser.js index a8d75b4..fecdf21 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -131,7 +131,7 @@ const parseError = (err) => { } catch { } - const version = '6.0.0-rc.2'; + const version = '6.0.0-rc.3'; const stepsToReproduce = `Running \`appwrite ${cliConfig.reportData.data.args.join(' ')}\``; const yourEnvironment = `CLI version: ${version}\nOperation System: ${os.type()}\nAppwrite version: ${appwriteVersion}\nIs Cloud: ${isCloud}`; diff --git a/lib/questions.js b/lib/questions.js index b347469..8798bd5 100644 --- a/lib/questions.js +++ b/lib/questions.js @@ -258,6 +258,14 @@ const questionsPullFunctions = [ } ]; +const questionsPullFunctionsCode = [ + { + type: "confirm", + name: "override", + message: "Do you want to pull source code of active deployment?" + }, +]; + const questionsCreateFunction = [ { type: "input", @@ -841,6 +849,7 @@ module.exports = { questionsCreateCollection, questionsCreateMessagingTopic, questionsPullFunctions, + questionsPullFunctionsCode, questionsLogin, questionsPullResources, questionsLogout, diff --git a/lib/sdks.js b/lib/sdks.js index f8cb8fc..9208e8f 100644 --- a/lib/sdks.js +++ b/lib/sdks.js @@ -30,7 +30,7 @@ const sdkForProject = async () => { let selfSigned = globalConfig.getSelfSigned() if (!project) { - throw new Error("Project is not set. Please run `appwrite init` to initialize the current directory with an Appwrite project."); + throw new Error("Project is not set. Please run `appwrite init project` to initialize the current directory with an Appwrite project."); } client diff --git a/package.json b/package.json index 0fe8b81..9b28ba9 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "appwrite-cli", "homepage": "https://appwrite.io/support", "description": "Appwrite is an open-source self-hosted backend server that abstract and simplify complex and repetitive development tasks behind a very simple REST API", - "version": "6.0.0-rc.2", + "version": "6.0.0-rc.3", "license": "BSD-3-Clause", "main": "index.js", "bin": { diff --git a/scoop/appwrite.json b/scoop/appwrite.json index 85d84c6..4f7d728 100644 --- a/scoop/appwrite.json +++ b/scoop/appwrite.json @@ -1,12 +1,12 @@ { "$schema": "https://raw.githubusercontent.com/ScoopInstaller/Scoop/master/schema.json", - "version": "6.0.0-rc.2", + "version": "6.0.0-rc.3", "description": "The Appwrite CLI is a command-line application that allows you to interact with Appwrite and perform server-side tasks using your terminal.", "homepage": "https://github.com/appwrite/sdk-for-cli", "license": "BSD-3-Clause", "architecture": { "64bit": { - "url": "https://github.com/appwrite/sdk-for-cli/releases/download/6.0.0-rc.2/appwrite-cli-win-x64.exe", + "url": "https://github.com/appwrite/sdk-for-cli/releases/download/6.0.0-rc.3/appwrite-cli-win-x64.exe", "bin": [ [ "appwrite-cli-win-x64.exe", @@ -15,7 +15,7 @@ ] }, "arm64": { - "url": "https://github.com/appwrite/sdk-for-cli/releases/download/6.0.0-rc.2/appwrite-cli-win-arm64.exe", + "url": "https://github.com/appwrite/sdk-for-cli/releases/download/6.0.0-rc.3/appwrite-cli-win-arm64.exe", "bin": [ [ "appwrite-cli-win-arm64.exe",