diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 2a016d21c..142c2a456 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.0.0-beta.8", + "version": "2.0.0-beta.9", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index 3e02707ec..a464b2416 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -32,15 +32,18 @@ export class CreateApi { return this; } - async findSketchByPath( - path: string, + public sketchCompareByPath = (param: string) => { + return (sketch: Create.Sketch) => { + const [, spath] = splitSketchPath(sketch.path); + return param === spath; + }; + }; + + async findSketchInCache( + compareFn: (sketch: Create.Sketch) => boolean, trustCache = true ): Promise { - const skatches = sketchCache; - const sketch = skatches.find((sketch) => { - const [, spath] = splitSketchPath(sketch.path); - return path === spath; - }); + const sketch = sketchCache.find((sketch) => compareFn(sketch)); if (trustCache) { return Promise.resolve(sketch); } @@ -148,7 +151,9 @@ export class CreateApi { } const [, spath] = createPaths.splitSketchPath(res.path); - const sketch = await this.findSketchByPath(spath); + const sketch = await this.findSketchInCache( + this.sketchCompareByPath(spath) + ); if ( sketch && sketch.secrets && @@ -159,7 +164,9 @@ export class CreateApi { }); if (posixPath !== posix.sep) { - const sketch = await this.findSketchByPath(posixPath); + const sketch = await this.findSketchInCache( + this.sketchCompareByPath(posixPath) + ); if ( sketch && sketch.secrets && @@ -214,7 +221,9 @@ export class CreateApi { let resources; if (basename === Create.arduino_secrets_file) { - const sketch = await this.findSketchByPath(parentPosixPath); + const sketch = await this.findSketchInCache( + this.sketchCompareByPath(parentPosixPath) + ); resources = sketch ? [this.getSketchSecretStat(sketch)] : []; } else { resources = await this.readDirectory(parentPosixPath, { @@ -230,12 +239,51 @@ export class CreateApi { return resource; } + private async toggleSecretsInclude( + path: string, + data: string, + mode: 'add' | 'remove' + ) { + const includeString = `#include "${Create.arduino_secrets_file}"`; + const includeRegexp = new RegExp(includeString + '\\s*', 'g'); + + const basename = createPaths.basename(path); + if (mode === 'add') { + const doesIncludeSecrets = includeRegexp.test(data); + + if (doesIncludeSecrets) { + return data; + } + + const sketch = await this.findSketchInCache((sketch) => { + const [, spath] = splitSketchPath(sketch.path); + return spath === createPaths.parentPosix(path); + }, true); + + if ( + sketch && + (sketch.name + '.ino' === basename || + sketch.name + '.pde' === basename) && + sketch.secrets && + sketch.secrets.length > 0 + ) { + return includeString + '\n' + data; + } + } else if (mode === 'remove') { + return data.replace(includeRegexp, ''); + } + return data; + } + async readFile(posixPath: string): Promise { const basename = createPaths.basename(posixPath); if (basename === Create.arduino_secrets_file) { const parentPosixPath = createPaths.parentPosix(posixPath); - const sketch = await this.findSketchByPath(parentPosixPath, false); + const sketch = await this.findSketchInCache( + this.sketchCompareByPath(parentPosixPath), + false + ); let file = ''; if (sketch && sketch.secrets) { @@ -250,12 +298,15 @@ export class CreateApi { `${this.domain()}/files/f/$HOME/sketches_v2${posixPath}` ); const headers = await this.headers(); - const result = await this.run<{ data: string }>(url, { + const result = await this.run<{ data: string; path: string }>(url, { method: 'GET', headers, }); - const { data } = result; - return atob(data); + let { data } = result; + + // add includes to main arduino file + data = await this.toggleSecretsInclude(posixPath, atob(data), 'add'); + return data; } async writeFile( @@ -266,7 +317,9 @@ export class CreateApi { if (basename === Create.arduino_secrets_file) { const parentPosixPath = createPaths.parentPosix(posixPath); - const sketch = await this.findSketchByPath(parentPosixPath); + const sketch = await this.findSketchInCache( + this.sketchCompareByPath(parentPosixPath) + ); if (sketch) { const url = new URL(`${this.domain()}/sketches/${sketch.id}`); const headers = await this.headers(); @@ -300,7 +353,7 @@ export class CreateApi { ); } - if (name.length === 0 || value.length === 0) { + if (name.length === 0) { return prev; } @@ -331,12 +384,14 @@ export class CreateApi { `${this.domain()}/files/f/$HOME/sketches_v2${posixPath}` ); const headers = await this.headers(); - const data = btoa( + + let data: string = typeof content === 'string' ? content - : new TextDecoder().decode(content) - ); - const payload = { data }; + : new TextDecoder().decode(content); + data = await this.toggleSecretsInclude(posixPath, data, 'remove'); + + const payload = { data: btoa(data) }; const init = { method: 'POST', body: JSON.stringify(payload), diff --git a/browser-app/package.json b/browser-app/package.json index 8289d4290..755239b88 100644 --- a/browser-app/package.json +++ b/browser-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "browser-app", - "version": "2.0.0-beta.8", + "version": "2.0.0-beta.9", "license": "AGPL-3.0-or-later", "dependencies": { "@theia/core": "next", @@ -19,7 +19,7 @@ "@theia/process": "next", "@theia/terminal": "next", "@theia/workspace": "next", - "arduino-ide-extension": "2.0.0-beta.8" + "arduino-ide-extension": "2.0.0-beta.9" }, "devDependencies": { "@theia/cli": "next" diff --git a/electron-app/package.json b/electron-app/package.json index 9ce8f5c92..dc19d2b19 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.0.0-beta.8", + "version": "2.0.0-beta.9", "license": "AGPL-3.0-or-later", "main": "src-gen/frontend/electron-main.js", "dependencies": { @@ -21,7 +21,7 @@ "@theia/process": "next", "@theia/terminal": "next", "@theia/workspace": "next", - "arduino-ide-extension": "2.0.0-beta.8" + "arduino-ide-extension": "2.0.0-beta.9" }, "devDependencies": { "@theia/cli": "next" diff --git a/package.json b/package.json index 9016bf1f8..e664a4a4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.0.0-beta.8", + "version": "2.0.0-beta.9", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA",