import { stripIndent } from 'common-tags';
import docsifyInit from '../helpers/docsify-init.js';
import { test, expect } from './fixtures/docsify-init-fixture.js';
const vueURL = '/node_modules/vue/dist/vue.global.js';
test.describe('Vue.js Compatibility', () => {
function getSharedConfig() {
const config = {
config: {
vueComponents: {
'button-counter': {
template: `
`,
data: function () {
return {
counter: 0,
};
},
},
},
vueGlobalOptions: {
data: () => ({
counter: 0,
msg: 'vueglobaloptions',
}),
},
vueMounts: {
'#vuemounts': {
data() {
return {
counter: 0,
msg: 'vuemounts',
};
},
},
},
},
markdown: {
homepage: stripIndent`
{{ i }}
---
`,
},
};
return config;
}
// Tests
// ----------------------------------------------------------------------------
test('Parse templates and render content when import Vue resources', async ({
page,
}) => {
const docsifyInitConfig = {
config: {},
markdown: {
homepage: stripIndent`
{{ i }}
`,
},
};
docsifyInitConfig.scriptURLs = vueURL;
await docsifyInit(docsifyInitConfig);
await expect(page.locator('#vuefor')).toHaveText('12345');
});
for (const executeScript of [true, undefined]) {
test(`renders content when executeScript is ${executeScript}`, async ({
page,
}) => {
const docsifyInitConfig = getSharedConfig();
docsifyInitConfig.config.executeScript = executeScript;
docsifyInitConfig.scriptURLs = vueURL;
await docsifyInit(docsifyInitConfig);
// Static
await expect(page.locator('#vuefor')).toHaveText('12345');
await expect(page.locator('#vuecomponent')).toHaveText('0');
await expect(page.locator('#vueglobaloptions p')).toHaveText(
'vueglobaloptions',
);
await expect(page.locator('#vueglobaloptions > span')).toHaveText('0');
await expect(page.locator('#vuemounts p')).toHaveText('vuemounts');
await expect(page.locator('#vuemounts > span')).toHaveText('0');
await expect(page.locator('#vuescript p')).toHaveText('vuescript');
await expect(page.locator('#vuescript > span')).toHaveText('0');
// Reactive
await page.click('#vuecomponent');
await expect(page.locator('#vuecomponent')).toHaveText('1');
await page.click('#vueglobaloptions button');
await expect(page.locator('#vueglobaloptions > span')).toHaveText('1');
await page.click('#vuemounts button');
await expect(page.locator('#vuemounts > span')).toHaveText('1');
await page.click('#vuescript button');
await expect(page.locator('#vuescript > span')).toHaveText('1');
});
}
test('ignores content when Vue is not present', async ({ page }) => {
const docsifyInitConfig = getSharedConfig();
await docsifyInit(docsifyInitConfig);
await page.evaluate(() => 'Vue' in window === false);
await expect(page.locator('#vuefor')).toHaveText('{{ i }}');
await expect(page.locator('#vuecomponent')).toHaveText('---');
await expect(page.locator('#vueglobaloptions p')).toHaveText('---');
await expect(page.locator('#vuemounts p')).toHaveText('---');
await expect(page.locator('#vuescript p')).toHaveText('---');
});
test('ignores content when vueGlobalOptions is undefined', async ({
page,
}) => {
const docsifyInitConfig = getSharedConfig();
docsifyInitConfig.config.vueGlobalOptions = undefined;
docsifyInitConfig.scriptURLs = vueURL;
await docsifyInit(docsifyInitConfig);
await expect(page.locator('#vuefor')).toHaveText('12345');
await expect(page.locator('#vuecomponent')).toHaveText('0');
await expect(page.locator('#vuecomponent')).toHaveText('0');
// eslint-disable-next-line playwright/prefer-web-first-assertions
expect(await page.locator('#vueglobaloptions p').innerText()).toBe('');
await expect(page.locator('#vuemounts p')).toHaveText('vuemounts');
await expect(page.locator('#vuescript p')).toHaveText('vuescript');
});
test('ignores content when vueMounts is undefined', async ({ page }) => {
const docsifyInitConfig = getSharedConfig();
docsifyInitConfig.config.vueMounts['#vuemounts'] = undefined;
docsifyInitConfig.scriptURLs = vueURL;
await docsifyInit(docsifyInitConfig);
await expect(page.locator('#vuefor')).toHaveText('12345');
await expect(page.locator('#vuecomponent')).toHaveText('0');
await expect(page.locator('#vueglobaloptions p')).toHaveText(
'vueglobaloptions',
);
await expect(page.locator('#vuemounts p')).toHaveText('vueglobaloptions');
await expect(page.locator('#vuescript p')).toHaveText('vuescript');
});
test('ignores