diff --git a/guidemaker-ember-template/package.json b/guidemaker-ember-template/package.json index bcd963d5..fcba1124 100644 --- a/guidemaker-ember-template/package.json +++ b/guidemaker-ember-template/package.json @@ -96,8 +96,9 @@ "./components/table-of-contents.js": "./dist/_app_/components/table-of-contents.js", "./helpers/html-safe.js": "./dist/_app_/helpers/html-safe.js", "./helpers/starts-with.js": "./dist/_app_/helpers/starts-with.js", - "./initializers/ember-template-showdown-extensions.js": "./dist/_app_/initializers/ember-template-showdown-extensions.js", + "./instance-initializers/ember-template-showdown-extensions.js": "./dist/_app_/instance-initializers/ember-template-showdown-extensions.js", "./modifiers/highlight-active-title.js": "./dist/_app_/modifiers/highlight-active-title.js", + "./services/features.js": "./dist/_app_/services/features.js", "./services/search.js": "./dist/_app_/services/search.js", "./templates/application.js": "./dist/_app_/templates/application.js", "./templates/error.js": "./dist/_app_/templates/error.js", diff --git a/guidemaker-ember-template/rollup.config.mjs b/guidemaker-ember-template/rollup.config.mjs index a26ec70f..8b44dc22 100644 --- a/guidemaker-ember-template/rollup.config.mjs +++ b/guidemaker-ember-template/rollup.config.mjs @@ -31,7 +31,7 @@ export default { 'modifiers/**/*.js', 'services/**/*.js', 'templates/**/*.js', - 'initializers/**/*.js', + 'instance-initializers/**/*.js', ]), // Follow the V2 Addon rules about dependencies. Your code can import from diff --git a/guidemaker-ember-template/src/components/guides-article.hbs b/guidemaker-ember-template/src/components/guides-article.hbs index 1677b4b8..430c7ee5 100644 --- a/guidemaker-ember-template/src/components/guides-article.hbs +++ b/guidemaker-ember-template/src/components/guides-article.hbs @@ -66,7 +66,7 @@ diff --git a/guidemaker-ember-template/src/initializers/ember-template-showdown-extensions.js b/guidemaker-ember-template/src/instance-initializers/ember-template-showdown-extensions.js similarity index 58% rename from guidemaker-ember-template/src/initializers/ember-template-showdown-extensions.js rename to guidemaker-ember-template/src/instance-initializers/ember-template-showdown-extensions.js index 96fd6e3b..7eaaa8fe 100644 --- a/guidemaker-ember-template/src/initializers/ember-template-showdown-extensions.js +++ b/guidemaker-ember-template/src/instance-initializers/ember-template-showdown-extensions.js @@ -1,6 +1,6 @@ import showdown from 'showdown'; -export function initialize(/* application */) { +export function initialize(application) { showdown.extension('header-links', function () { return [ { @@ -12,6 +12,38 @@ export function initialize(/* application */) { }, ]; }); + + const features = application.lookup('service:features'); + showdown.extension('feature-flags', function () { + return [ + { + type: 'lang', + filter: function (text) { + return text + .replace( + /]+)>([\s\S]*?)<\/feature-flag-on-\1>/g, + function (match, featureName, content) { + if (features.isEnabled(featureName)) { + return content; + } else { + return ''; + } + }, + ) + .replace( + /]+)>([\s\S]*?)<\/feature-flag-off-\1>/g, + function (match, featureName, content) { + if (!features.isEnabled(featureName)) { + return content; + } else { + return ''; + } + }, + ); + }, + }, + ]; + }); } export default { diff --git a/guidemaker-ember-template/src/services/features.js b/guidemaker-ember-template/src/services/features.js new file mode 100644 index 00000000..f2ef7949 --- /dev/null +++ b/guidemaker-ember-template/src/services/features.js @@ -0,0 +1,12 @@ +import Service from '@ember/service'; + +export default class Features extends Service { + features = {}; + setupFeatures(features) { + this.features = features; + } + + isEnabled(featureName) { + return this.features[featureName]; + } +} diff --git a/test-app/tests/integration/components/guides-article-test.js b/test-app/tests/integration/components/guides-article-test.js index 0e607ea9..788e9580 100644 --- a/test-app/tests/integration/components/guides-article-test.js +++ b/test-app/tests/integration/components/guides-article-test.js @@ -98,4 +98,41 @@ module('Integration | Component | guides-article', function (hooks) { 'https://github.com/ember-learn/guidemaker-ember-template/edit/master/guides/v1.0.0/model-id.md', ); }); + + test('it renders content based on feature flags', async function (assert) { + this.owner.register('service:page', PageStub); + this.owner.lookup('service:features').setupFeatures({ + 'template-tag': true, + }); + + this.model = { + id: 'model-id', + content: ` + + This is template tag content. + + + + This is classic template content. +`, + }; + + await render(hbs` + + `); + + assert + .dom('.guides-article-content') + .includesText('This is template tag content.'); + assert + .dom('.guides-article-content') + .doesNotIncludeText('This is classic template content.'); + + assert + .dom('feature-flag-off-template-tag') + .doesNotExist('Feature flag tags are stripped'); + assert + .dom('feature-flag-on-template-tag') + .doesNotExist('Feature flag tags are stripped'); + }); });