Merge branch 'main' into aggregation

This commit is contained in:
rijkvanzanten
2021-06-23 18:16:21 -04:00
6 changed files with 51 additions and 32 deletions

View File

@@ -2,13 +2,13 @@ import express, { Router } from 'express';
import path from 'path';
import { AppExtensionType, Extension, ExtensionType } from '@directus/shared/types';
import {
ensureExtensionsDirs,
generateExtensionsEntry,
getLocalExtensions,
getPackageExtensions,
pluralize,
resolvePackage,
} from '@directus/shared/utils';
import { APP_EXTENSION_TYPES, EXTENSION_TYPES, SHARED_DEPS } from '@directus/shared/constants';
import { APP_EXTENSION_TYPES, SHARED_DEPS } from '@directus/shared/constants';
import getDatabase from './database';
import emitter from './emitter';
import env from './env';
@@ -31,11 +31,17 @@ let extensions: Extension[] = [];
let extensionBundles: Partial<Record<AppExtensionType, string>> = {};
export async function initializeExtensions(): Promise<void> {
await ensureDirsExist();
await ensureExtensionsDirs(env.EXTENSIONS_PATH);
extensions = await getExtensions();
extensionBundles = await generateExtensionBundles();
logger.info(`Loaded extensions: ${listExtensions().join(', ')}`);
if (!('DIRECTUS_DEV' in process.env)) {
extensionBundles = await generateExtensionBundles();
}
const loadedExtensions = listExtensions();
if (loadedExtensions.length > 0) {
logger.info(`Loaded extensions: ${loadedExtensions.join(', ')}`);
}
}
export function listExtensions(type?: ExtensionType): string[] {
@@ -81,7 +87,7 @@ async function generateExtensionBundles() {
const bundle = await rollup({
input: 'entry',
external: SHARED_DEPS,
external: Object.values(sharedDepsMapping),
plugins: [virtual({ entry }), alias({ entries: internalImports })],
});
const { output } = await bundle.generate({ format: 'es' });
@@ -94,17 +100,6 @@ async function generateExtensionBundles() {
return bundles;
}
async function ensureDirsExist() {
for (const extensionType of EXTENSION_TYPES) {
const dirPath = path.resolve(env.EXTENSIONS_PATH, pluralize(extensionType));
try {
await fse.ensureDir(dirPath);
} catch (err) {
logger.warn(err);
}
}
}
async function getSharedDepsMapping(deps: string[]) {
const appDir = await fse.readdir(path.join(resolvePackage('@directus/app'), 'dist'));
@@ -115,7 +110,7 @@ async function getSharedDepsMapping(deps: string[]) {
if (depName) {
depsMapping[dep] = `${env.PUBLIC_URL}/admin/${depName}`;
} else {
logger.warn(`Couldn't find extension internal dependency "${dep}"`);
logger.warn(`Couldn't find shared extension dependency "${dep}"`);
}
}

View File

@@ -2,7 +2,12 @@ import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import yaml from '@rollup/plugin-yaml';
import path from 'path';
import { getPackageExtensions, getLocalExtensions, generateExtensionsEntry } from '@directus/shared/utils';
import {
ensureExtensionsDirs,
getPackageExtensions,
getLocalExtensions,
generateExtensionsEntry,
} from '@directus/shared/utils';
import { SHARED_DEPS, APP_EXTENSION_TYPES } from '@directus/shared/constants';
// https://vitejs.dev/config/
@@ -38,7 +43,7 @@ function directusExtensions() {
const virtualIds = APP_EXTENSION_TYPES.map((type) => `${prefix}${type}`);
let extensionEntrys = {};
loadExtensions();
if (process.env.NODE_ENV !== 'production') loadExtensions();
return [
{
@@ -84,8 +89,12 @@ function directusExtensions() {
];
async function loadExtensions() {
const packageExtensions = await getPackageExtensions(path.join('..', 'api'));
const localExtensions = await getLocalExtensions(path.join('..', 'api', 'extensions'));
const apiPath = path.join('..', 'api');
const extensionsPath = path.join(apiPath, 'extensions');
await ensureExtensionsDirs(extensionsPath);
const packageExtensions = await getPackageExtensions(apiPath);
const localExtensions = await getLocalExtensions(extensionsPath);
const extensions = [...packageExtensions, ...localExtensions];

View File

@@ -0,0 +1,11 @@
import path from 'path';
import fse from 'fs-extra';
import { pluralize } from './pluralize';
import { EXTENSION_TYPES } from '../constants';
export async function ensureExtensionsDirs(extensionsPath: string): Promise<void> {
for (const extensionType of EXTENSION_TYPES) {
const dirPath = path.resolve(extensionsPath, pluralize(extensionType));
await fse.ensureDir(dirPath);
}
}

View File

@@ -0,0 +1,10 @@
import path from 'path';
import { AppExtensionType, Extension } from '../types';
export function generateExtensionsEntry(type: AppExtensionType, extensions: Extension[]): string {
const filteredExtensions = extensions.filter((extension) => extension.type === type);
return `${filteredExtensions
.map((extension, i) => `import e${i} from '${path.resolve(extension.path, extension.entrypoint || '')}';\n`)
.join('')}export default [${filteredExtensions.map((_, i) => `e${i}`).join(',')}];`;
}

View File

@@ -1,6 +1,6 @@
import path from 'path';
import fse from 'fs-extra';
import { AppExtensionType, Extension } from '../types';
import { Extension } from '../types';
import { resolvePackage } from './resolve-package';
import { listFolders } from './list-folders';
import { EXTENSION_NAME_REGEX, EXTENSION_TYPES } from '../constants';
@@ -85,11 +85,3 @@ export async function getLocalExtensions(root: string): Promise<Extension[]> {
return extensions;
}
export function generateExtensionsEntry(type: AppExtensionType, extensions: Extension[]): string {
const filteredExtensions = extensions.filter((extension) => extension.type === type);
return `${filteredExtensions
.map((extension, i) => `import e${i} from '${path.resolve(extension.path, extension.entrypoint || '')}';\n`)
.join('')}export default [${filteredExtensions.map((_, i) => `e${i}`).join(',')}];`;
}

View File

@@ -1,4 +1,6 @@
export * from './ensure-extensions-dirs';
export * from './generate-extensions-entry';
export * from './get-extensions';
export * from './list-folders';
export * from './load-extensions';
export * from './pluralize';
export * from './resolve-package';