From d294945ef0f2d018ed25a962a5a5a8f817bf7026 Mon Sep 17 00:00:00 2001 From: Kevin <kevin@dendron.so> Date: Tue, 26 Jul 2022 12:16:16 -0700 Subject: [PATCH 1/8] support enterprise build --- bootstrap/scripts/buildPatch.sh | 3 +++ packages/dendron-cli/src/commands/devCLICommand.ts | 4 ++++ packages/dendron-cli/src/utils/build.ts | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/bootstrap/scripts/buildPatch.sh b/bootstrap/scripts/buildPatch.sh index 4b07ac35d3..e18fa338b0 100755 --- a/bootstrap/scripts/buildPatch.sh +++ b/bootstrap/scripts/buildPatch.sh @@ -30,6 +30,9 @@ EXT_TARGET=dendron if [ $SCRIPT_EXT_TARGET = "nightly" ]; then EXT_TARGET=nightly fi +if [ $SCRIPT_EXT_TARGET = "enterprise" ]; then + EXT_TARGET=enterprise +fi if [ -z $FAST ]; then LOG_LEVEL=info $DENDRON_CLI dev build --upgradeType $UPGRADE_TYPE --publishEndpoint $PUBLISH_ENDPOINT --extensionTarget $EXT_TARGET diff --git a/packages/dendron-cli/src/commands/devCLICommand.ts b/packages/dendron-cli/src/commands/devCLICommand.ts index d98dfb682a..2173f4fbb7 100644 --- a/packages/dendron-cli/src/commands/devCLICommand.ts +++ b/packages/dendron-cli/src/commands/devCLICommand.ts @@ -472,6 +472,10 @@ export class DevCLICommand extends CLICommand<CommandOpts, CommandOutput> { this.print("modifying plugin manifest for nightly target..."); await BuildUtils.prepPluginPkg(ExtensionTarget.NIGHTLY); } + if (opts.extensionTarget === ExtensionTarget.ENTERPRISE) { + this.print("modifying plugin manifest for enterprisetarget..."); + await BuildUtils.prepPluginPkg(ExtensionTarget.ENTERPRISE); + } this.print("package deps..."); await BuildUtils.packagePluginDependencies(opts); diff --git a/packages/dendron-cli/src/utils/build.ts b/packages/dendron-cli/src/utils/build.ts index 7e40c57821..9583fb8688 100644 --- a/packages/dendron-cli/src/utils/build.ts +++ b/packages/dendron-cli/src/utils/build.ts @@ -39,6 +39,7 @@ export enum PublishEndpoint { export enum ExtensionTarget { DENDRON = "dendron", NIGHTLY = "nightly", + ENTERPRISE = "enterprise", } const LOCAL_NPM_ENDPOINT = "http://localhost:4873"; @@ -200,6 +201,10 @@ export class BuildUtils { "This is a prerelease version of Dendron that may be unstable. Please install the main dendron extension instead."; icon = "media/logo-bw.png"; } + if (target === ExtensionTarget.ENTERPRISE) { + version = await this.getIncrementedVerForNightly(); + description = "Dendron - Enterprise Version"; + } this.updatePkgMeta({ pkgPath, From db78a04dc9a64023838075e1e1de29f934065030 Mon Sep 17 00:00:00 2001 From: Kevin <kevin@dendron.so> Date: Tue, 26 Jul 2022 12:24:42 -0700 Subject: [PATCH 2/8] add enterprise build --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 49efd4e579..f04fae36f3 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "build:patch:local": "cross-env UPGRADE_TYPE=patch PUBLISH_ENDPOINT=local USE_IN_MEMORY_REGISTRY=1 ./bootstrap/scripts/buildPatch.sh", "build:patch:local:ci": "cross-env UPGRADE_TYPE=patch PUBLISH_ENDPOINT=local BUILD_ENV=ci USE_IN_MEMORY_REGISTRY=1 ./bootstrap/scripts/buildPatch.sh", "build:patch:local:ci:nightly": "cross-env UPGRADE_TYPE=patch PUBLISH_ENDPOINT=local BUILD_ENV=ci USE_IN_MEMORY_REGISTRY=1 EXT_TARGET=nightly ./bootstrap/scripts/buildPatch.sh", + "build:patch:local:ci:enterprise": "cross-env UPGRADE_TYPE=patch PUBLISH_ENDPOINT=local BUILD_ENV=ci USE_IN_MEMORY_REGISTRY=1 EXT_TARGET=enterprise ./bootstrap/scripts/buildPatch.sh", "build:patch:remote": "cross-env UPGRADE_TYPE=patch PUBLISH_ENDPOINT=remote ./bootstrap/scripts/buildPatch.sh", "build:patch:remote:ci": "cross-env UPGRADE_TYPE=patch PUBLISH_ENDPOINT=remote BUILD_ENV=ci ./bootstrap/scripts/buildPatch.sh", "build:minor:local": "cross-env UPGRADE_TYPE=minor PUBLISH_ENDPOINT=local ./bootstrap/scripts/buildPatch.sh", From 1deec03b492ffbd999718bb1a9ba733ff961d2d2 Mon Sep 17 00:00:00 2001 From: Kevin <kevin@dendron.so> Date: Tue, 26 Jul 2022 14:21:31 -0700 Subject: [PATCH 3/8] update name --- packages/dendron-cli/src/utils/build.ts | 46 ++++++++++++++++++------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/packages/dendron-cli/src/utils/build.ts b/packages/dendron-cli/src/utils/build.ts index 9583fb8688..8098f5383b 100644 --- a/packages/dendron-cli/src/utils/build.ts +++ b/packages/dendron-cli/src/utils/build.ts @@ -1,5 +1,9 @@ /* eslint-disable no-console */ -import { DendronError, error2PlainObject } from "@dendronhq/common-all"; +import { + assertUnreachable, + DendronError, + error2PlainObject, +} from "@dendronhq/common-all"; import { createLogger, findUpTo } from "@dendronhq/common-server"; import execa from "execa"; import fs from "fs-extra"; @@ -194,22 +198,38 @@ export class BuildUtils { let version; let description; let icon; - - if (target === ExtensionTarget.NIGHTLY) { - version = await this.getIncrementedVerForNightly(); - description = - "This is a prerelease version of Dendron that may be unstable. Please install the main dendron extension instead."; - icon = "media/logo-bw.png"; - } - if (target === ExtensionTarget.ENTERPRISE) { - version = await this.getIncrementedVerForNightly(); - description = "Dendron - Enterprise Version"; + let license: string = "GPLv3"; + let name: string; + switch (target) { + case ExtensionTarget.DENDRON: { + name = target.toString(); + break; + } + case ExtensionTarget.NIGHTLY: { + name = target.toString(); + version = await this.getIncrementedVerForNightly(); + description = + "This is a prerelease version of Dendron that may be unstable. Please install the main dendron extension instead."; + icon = "media/logo-bw.png"; + break; + } + case ExtensionTarget.ENTERPRISE: { + name = `dendron-enterprise`; + version = await this.getIncrementedVerForNightly(); + description = "Dendron - Enterprise Version"; + license = + "see license in https://github.com/dendronhq/dendron/wiki/Enterprise-EULA"; + break; + } + default: { + assertUnreachable(target); + } } this.updatePkgMeta({ pkgPath, - name: target.toString(), - displayName: target.toString(), + name, + displayName: name, description, main: "./dist/extension.js", repository: { From 5b8009126f2cfe14cee3ddd48c4969a9d1b06973 Mon Sep 17 00:00:00 2001 From: Kevin <kevin@dendron.so> Date: Tue, 26 Jul 2022 14:26:50 -0700 Subject: [PATCH 4/8] add license --- packages/dendron-cli/src/utils/build.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/dendron-cli/src/utils/build.ts b/packages/dendron-cli/src/utils/build.ts index 8098f5383b..00c6687d47 100644 --- a/packages/dendron-cli/src/utils/build.ts +++ b/packages/dendron-cli/src/utils/build.ts @@ -20,6 +20,7 @@ type PkgJson = { repository: PkgRepository; devDependencies: { [key: string]: string }; icon: string; + license: string; }; type PkgRepository = { @@ -229,6 +230,7 @@ export class BuildUtils { this.updatePkgMeta({ pkgPath, name, + license, displayName: name, description, main: "./dist/extension.js", @@ -455,11 +457,13 @@ export class BuildUtils { main, repository, version, + license, icon, }: { pkgPath: string; name: string; displayName: string; + license: string; } & Partial<PkgJson>) { const pkg = fs.readJSONSync(pkgPath) as PkgJson; pkg.name = name; @@ -482,6 +486,7 @@ export class BuildUtils { pkg.icon = icon; } pkg.main = "dist/extension.js"; + pkg.license = license; fs.writeJSONSync(pkgPath, pkg, { spaces: 4 }); } From 5f6e12ed43526c5145d6cc8478617a1e567baed8 Mon Sep 17 00:00:00 2001 From: Kevin <kevin@dendron.so> Date: Tue, 26 Jul 2022 15:06:44 -0700 Subject: [PATCH 5/8] update readme --- packages/plugin-core/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/plugin-core/README.md b/packages/plugin-core/README.md index b4259458aa..3c5705931e 100644 --- a/packages/plugin-core/README.md +++ b/packages/plugin-core/README.md @@ -175,7 +175,7 @@ Dendron sends out a weekly newsletter highlighting: There are a variety of ways to connect with Dendron devs, contributors, and other members of the Dendron community: -- Join the [Dendron on Discord](https://link.dendron.so/discord) +- Join the [Dendron on Discord](https://link.dendron.so/discord) - Follow [Dendron on Twitter (`@dendronhq`)](https://link.dendron.so/twitter) - Checkout [Dendron on GitHub](https://link.dendron.so/github) - Read the [Dendron Blog](https://blog.dendron.so/) @@ -363,3 +363,5 @@ This project follows the [all-contributors](https://github.com/all-contributors/ Dendron is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3. See [LICENSE](https://github.com/dendronhq/dendron/blob/master/LICENSE.md) and [NOTICE](https://github.com/dendronhq/dendron/blob/master/NOTICE.md) for more information. + +Dendron Enterprise is distributed and licensed separately under the [Dendron Enterprise END-USER LICENSE AGREEMENT](https://github.com/dendronhq/dendron/wiki/Enterprise-EULA) From fd090a886ed2e42fec0df33b776fe91f5874b000 Mon Sep 17 00:00:00 2001 From: Kevin <kevin@dendron.so> Date: Tue, 26 Jul 2022 16:05:48 -0700 Subject: [PATCH 6/8] add license check --- packages/plugin-core/src/_extension.ts | 20 +++++++++ packages/plugin-core/src/survey.ts | 43 ++++++++++++++++--- .../plugin-core/src/utils/ExtensionUtils.ts | 17 ++++++++ 3 files changed, 74 insertions(+), 6 deletions(-) diff --git a/packages/plugin-core/src/_extension.ts b/packages/plugin-core/src/_extension.ts index 36f528309b..37d08f7356 100644 --- a/packages/plugin-core/src/_extension.ts +++ b/packages/plugin-core/src/_extension.ts @@ -68,6 +68,8 @@ import { DendronExtension, getDWorkspace, getExtension } from "./workspace"; import { TutorialInitializer } from "./workspace/tutorialInitializer"; import { WorkspaceActivator } from "./workspace/workspaceActivator"; import { WSUtils } from "./WSUtils"; +import { SurveyUtils } from "./survey"; +import _ from "lodash"; const MARKDOWN_WORD_PATTERN = new RegExp("([\\w\\.\\#]+)"); // === Main @@ -353,6 +355,24 @@ export async function _activate( showcase.showToast(); }, ONE_MINUTE_IN_MS); } + if (ExtensionUtils.isEnterprise(context)) { + let resp: boolean | undefined | string = true; + while (!ExtensionUtils.hasValidLicense() && resp !== undefined) { + // eslint-disable-next-line no-await-in-loop + resp = await SurveyUtils.showEnterpriseLicenseSurvey(); + } + if (resp === undefined) { + vscode.window.showInformationMessage( + "Please reload to enter your license key", + { + modal: true, + detail: + "Dendron will be inactive until you enter a license key. You can reload your vscode instance to be prompted again", + } + ); + return false; + } + } } else { // ws not active Logger.info({ ctx, msg: "dendron not active" }); diff --git a/packages/plugin-core/src/survey.ts b/packages/plugin-core/src/survey.ts index a4b657ac8a..b7d1cd8800 100644 --- a/packages/plugin-core/src/survey.ts +++ b/packages/plugin-core/src/survey.ts @@ -1,10 +1,4 @@ import { ConfirmStatus, getStage, SurveyEvents } from "@dendronhq/common-all"; -import { AnalyticsUtils } from "./utils/analytics"; -import * as vscode from "vscode"; -import _ from "lodash"; -import { Logger } from "./logger"; -import { resolve } from "path"; -import { VSCodeUtils } from "./vsCodeUtils"; import { InactvieUserMsgStatusEnum, InitialSurveyStatusEnum, @@ -12,6 +6,12 @@ import { MetadataService, PriorTools, } from "@dendronhq/engine-server"; +import _ from "lodash"; +import { resolve } from "path"; +import * as vscode from "vscode"; +import { Logger } from "./logger"; +import { AnalyticsUtils } from "./utils/analytics"; +import { VSCodeUtils } from "./vsCodeUtils"; export class DendronQuickInputSurvey { opts: { @@ -491,6 +491,37 @@ export class LapsedUserPlugDiscordSurvey extends DendronQuickPickSurvey { } export class SurveyUtils { + static async showEnterpriseLicenseSurvey() { + AnalyticsUtils.track("EnterpriseLicenseSurveyPrompted"); + return vscode.window + .showInformationMessage( + "Welcome to Dendron! 🌱", + { + modal: true, + detail: "Please enter your enterprise license key to proceed", + }, + { title: "Enter" } + ) + .then(async (resp) => { + if (resp === undefined) { + return undefined; + } + const licenseKey = await vscode.window.showInputBox({ + ignoreFocusOut: true, + placeHolder: "license key", + prompt: "Please paste your license key here", + title: "License key", + }); + const meta = MetadataService.instance(); + if (licenseKey !== undefined) { + // @ts-ignore + meta.setMeta("enterpriseLicense", licenseKey); + return true; + } + return undefined; + }); + } + /** * Asks three questions about background, use case, and prior tools used. */ diff --git a/packages/plugin-core/src/utils/ExtensionUtils.ts b/packages/plugin-core/src/utils/ExtensionUtils.ts index bff48a2bcf..79f8334fe0 100644 --- a/packages/plugin-core/src/utils/ExtensionUtils.ts +++ b/packages/plugin-core/src/utils/ExtensionUtils.ts @@ -159,6 +159,23 @@ export class ExtensionUtils { return ext as vscode.Extension<any>; } + static isEnterprise(context: vscode.ExtensionContext) { + // return context.extension.id === "dendron.@dendronhq/plugin-core"; + return context.extension.id === "dendron.dendron-enterprise"; + } + + static hasValidLicense() { + // @ts-ignore + const enterpriseLicense = MetadataService.instance().getMeta()[ + "enterpriseLicense" + ] as string; + // TODO + if (!enterpriseLicense) { + return false; + } + return true; + } + static _TUTORIAL_IDS: Set<string> | undefined; static getTutorialIds(): Set<string> { if (_.isUndefined(ExtensionUtils._TUTORIAL_IDS)) { From dbb289b48df2d6efa8e82f5ba8985b8e7d2273f3 Mon Sep 17 00:00:00 2001 From: Kevin <kevin@dendron.so> Date: Wed, 27 Jul 2022 08:34:35 -0700 Subject: [PATCH 7/8] update build step --- packages/dendron-cli/src/commands/devCLICommand.ts | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/dendron-cli/src/commands/devCLICommand.ts b/packages/dendron-cli/src/commands/devCLICommand.ts index 2173f4fbb7..cc18f56ca2 100644 --- a/packages/dendron-cli/src/commands/devCLICommand.ts +++ b/packages/dendron-cli/src/commands/devCLICommand.ts @@ -449,8 +449,8 @@ export class DevCLICommand extends CLICommand<CommandOpts, CommandOutput> { this.print("sync assets..."); await this.syncAssets(opts); - this.print("prep repo..."); - await BuildUtils.prepPluginPkg(); + this.print(`prep repo... extensionTarget: ${opts.extensionTarget}`); + await BuildUtils.prepPluginPkg(opts.extensionTarget); if (!shouldPublishLocal) { this.print( @@ -468,15 +468,6 @@ export class DevCLICommand extends CLICommand<CommandOpts, CommandOutput> { this.print("compiling plugin..."); await BuildUtils.compilePlugin(opts); - if (opts.extensionTarget === ExtensionTarget.NIGHTLY) { - this.print("modifying plugin manifest for nightly target..."); - await BuildUtils.prepPluginPkg(ExtensionTarget.NIGHTLY); - } - if (opts.extensionTarget === ExtensionTarget.ENTERPRISE) { - this.print("modifying plugin manifest for enterprisetarget..."); - await BuildUtils.prepPluginPkg(ExtensionTarget.ENTERPRISE); - } - this.print("package deps..."); await BuildUtils.packagePluginDependencies(opts); From 5391c951a2fd02c4818b5d5b6a2be704f7d3cb9f Mon Sep 17 00:00:00 2001 From: Kevin <kevin@dendron.so> Date: Wed, 27 Jul 2022 08:43:15 -0700 Subject: [PATCH 8/8] track extension version --- packages/plugin-core/src/utils/ExtensionUtils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/plugin-core/src/utils/ExtensionUtils.ts b/packages/plugin-core/src/utils/ExtensionUtils.ts index 79f8334fe0..f6dc988a22 100644 --- a/packages/plugin-core/src/utils/ExtensionUtils.ts +++ b/packages/plugin-core/src/utils/ExtensionUtils.ts @@ -416,6 +416,7 @@ export class ExtensionUtils { const workspaceConfig = ConfigUtils.getWorkspace(dendronConfig); const { workspaceFile, workspaceFolders } = vscode.workspace; const trackProps = { + extensionId: ext.context.extension.id, duration: durationReloadWorkspace, noCaching: dendronConfig.noCaching || false, numNotes,