diff --git a/src/extension.ts b/src/extension.ts index 698ad414..35424034 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -22,7 +22,8 @@ import { clearRegisteredTutorials, getOpenAtStartupSetting, clearOutputChannels, registerTutorialWithJSON, getAutoInstallDefaultTutorialsSetting, addNewTutorialWithNameAndCategoryForDidactUri, removeTutorialByNameAndCategory, - registerEmbeddedTutorials} from './utils'; + registerEmbeddedTutorials, + appendAdditionalTutorialsFromEnv} from './utils'; import { DidactUriCompletionItemProvider } from './didactUriCompletionItemProvider'; import { DidactPanelSerializer } from './didactPanelSerializer'; import { didactManager, VIEW_TYPE } from './didactManager'; @@ -116,6 +117,9 @@ export async function activate(context: vscode.ExtensionContext): Promise { await registerEmbeddedTutorials(context, 'Writing Your First Didact Tutorial', './demos/markdown/tutorial/tutorial.didact.md'); } + // append any additional tutorials if we have them + await appendAdditionalTutorialsFromEnv(); + // create the view createIntegrationsView(); diff --git a/src/test/suite/registry.test.ts b/src/test/suite/registry.test.ts index 90562519..9dd195ef 100644 --- a/src/test/suite/registry.test.ts +++ b/src/test/suite/registry.test.ts @@ -1,5 +1,5 @@ import * as assert from 'assert'; -import {getRegisteredTutorials, getDidactCategories, getTutorialsForCategory, getUriForDidactNameAndCategory, registerTutorialWithCategory, clearRegisteredTutorials, registerTutorialWithArgs} from '../../utils'; +import {getRegisteredTutorials, getDidactCategories, getTutorialsForCategory, getUriForDidactNameAndCategory, registerTutorialWithCategory, clearRegisteredTutorials, registerTutorialWithArgs, DIDACT_APPEND_REGISTERED_SETTING, getAppendRegisteredSettingFromEnv, appendAdditionalTutorialsFromEnv} from '../../utils'; import {before} from 'mocha'; import * as vscode from 'vscode'; import { ADD_TUTORIAL_TO_REGISTRY, getContext, REGISTER_TUTORIAL } from '../../extensionFunctions'; @@ -115,6 +115,24 @@ suite('Didact registry test suite', () => { assert.ok(foundTutorial, `Did not find new-tutorial-4 registered via JSON`); }); + test('append registry from environment variable', async() => { + const tutsToAppend : String = '[{"name":"AppendMe2","category":"AppendedCat2","sourceUri":"https%3A%2F%2Fraw.githubusercontent.com%2Fredhat-developer%2Fvscode-didact%2Fmaster%2Fexamples%2Fregistry.example.didact.md"}]'; + process.env[DIDACT_APPEND_REGISTERED_SETTING] = tutsToAppend.toString(); + + const envVarJson = getAppendRegisteredSettingFromEnv(); + console.log(`envVar = ` + envVarJson); + assert.ok(envVarJson, `Did not find envVarJson`); + + const registry = getRegisteredTutorials(); + assert.notStrictEqual(registry, undefined); + + const tutName = `AppendMe2`; + await appendAdditionalTutorialsFromEnv(); + const foundTutorial = verifyTutorialInRegistry(tutName); + delete process.env.DIDACT_APPEND_REGISTERED_SETTING; + assert.ok(foundTutorial, `Did not find ${tutName} registered after appending to tutorial list from settings`); + }); + test('Clear all the tutorials', async() => { const registry = getRegisteredTutorials(); assert.notStrictEqual(registry, undefined); diff --git a/src/utils.ts b/src/utils.ts index b38937e9..09b11a96 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -30,6 +30,7 @@ export const DIDACT_OPEN_AT_STARTUP = 'didact.openDefaultTutorialAtStartup'; export const DIDACT_AUTO_INSTALL_DEFAULT_TUTORIALS = 'didact.autoAddDefaultTutorials'; export const DIDACT_CLI_LINK_LF_SETTING = 'didact.edit.cliLinkLF'; export const DIDACT_CLI_LINK_TEXT_SETTING = 'didact.edit.cliLinkText'; +export const DIDACT_APPEND_REGISTERED_SETTING = 'DIDACT_APPEND_REGISTRY'; const CACHED_OUTPUT_CHANNELS: OutputChannel[] = new Array(); @@ -500,3 +501,28 @@ export function getFileExtension(pathAsString: string) : string | undefined { } return undefined; } + +export function getAppendRegisteredSettingFromEnv() : string | undefined { + const envVar = process.env[DIDACT_APPEND_REGISTERED_SETTING]; + if (!envVar || (typeof envVar !== 'string')) { + return; + } + return envVar as string; +} + +export async function appendAdditionalTutorialsFromEnv() : Promise { + try { + const appendTutorialsAtStartup: string | undefined = getAppendRegisteredSettingFromEnv(); + if (appendTutorialsAtStartup) { + await extensionFunctions.sendTextToOutputChannel(`Didact tutorials appended at startup via ${DIDACT_APPEND_REGISTERED_SETTING}`); + const jsonTutorials = JSON.parse(appendTutorialsAtStartup); + for (const jsonTutorial of jsonTutorials) { + await extensionFunctions.sendTextToOutputChannel(`--Adding tutorial ${jsonTutorial.sourceUri} as ${jsonTutorial.name}/${jsonTutorial.category}`); + await registerTutorialWithCategory(jsonTutorial.name, jsonTutorial.sourceUri, jsonTutorial.category); + } + } + } catch (ex) { + await extensionFunctions.sendTextToOutputChannel(ex); + return Promise.reject(ex); + } +}