@directus/extensions-sdk 10.2.0 → 10.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1,5 @@
1
- export default function add(): Promise<void>;
1
+ type AddOptions = {
2
+ install?: boolean;
3
+ };
4
+ export default function add(options: AddOptions): Promise<void>;
5
+ export {};
@@ -13,24 +13,34 @@ import { getLanguageFromPath, isLanguage, languageToShort } from '../utils/langu
13
13
  import { log } from '../utils/logger.js';
14
14
  import copyTemplate from './helpers/copy-template.js';
15
15
  import getExtensionDevDeps from './helpers/get-extension-dev-deps.js';
16
- export default async function add() {
16
+ export default async function add(options) {
17
+ const install = options.install ?? true;
17
18
  const extensionPath = process.cwd();
18
19
  const packagePath = path.resolve('package.json');
19
20
  if (!(await fse.pathExists(packagePath))) {
20
- log(`Current directory is not a valid package.`, 'error');
21
+ log(`Current directory is not a valid Directus extension:`, 'error');
22
+ log(`Missing "package.json" file.`, 'error');
23
+ process.exit(1);
24
+ }
25
+ let extensionManifestFile;
26
+ try {
27
+ extensionManifestFile = await fse.readFile(packagePath, 'utf8');
28
+ }
29
+ catch {
30
+ log(`Failed to read "package.json" file from current directory.`, 'error');
21
31
  process.exit(1);
22
32
  }
23
33
  let extensionManifest;
24
- let indent = null;
25
34
  try {
26
- const extensionManifestFile = await fse.readFile(packagePath, 'utf8');
27
- extensionManifest = ExtensionManifest.passthrough().parse(JSON.parse(extensionManifestFile));
28
- indent = detectJsonIndent(extensionManifestFile);
35
+ extensionManifest = JSON.parse(extensionManifestFile);
36
+ ExtensionManifest.parse(extensionManifest);
29
37
  }
30
- catch (e) {
31
- log(`Current directory is not a valid Directus extension.`, 'error');
38
+ catch {
39
+ log(`Current directory is not a valid Directus extension:`, 'error');
40
+ log(`Invalid "package.json" file.`, 'error');
32
41
  process.exit(1);
33
42
  }
43
+ const indent = detectJsonIndent(extensionManifestFile);
34
44
  const extensionOptions = extensionManifest[EXTENSION_PKG_KEY];
35
45
  const sourceExists = await fse.pathExists(path.resolve('src'));
36
46
  if (extensionOptions.type === 'bundle') {
@@ -86,12 +96,21 @@ export default async function add() {
86
96
  const newExtensionManifest = {
87
97
  ...extensionManifest,
88
98
  [EXTENSION_PKG_KEY]: newExtensionOptions,
89
- devDependencies: await getExtensionDevDeps(newEntries.map((entry) => entry.type), getLanguageFromEntries(newEntries)),
99
+ devDependencies: {
100
+ ...extensionManifest.devDependencies,
101
+ ...(await getExtensionDevDeps(newEntries.map((entry) => entry.type), getLanguageFromEntries(newEntries))),
102
+ },
90
103
  };
91
104
  await fse.writeJSON(packagePath, newExtensionManifest, { spaces: indent ?? '\t' });
92
105
  const packageManager = getPackageManager();
93
- await execa(packageManager, ['install'], { cwd: extensionPath });
106
+ if (install) {
107
+ await execa(packageManager, ['install'], { cwd: extensionPath });
108
+ }
109
+ else {
110
+ spinner.info(`Dependency installation skipped, to install run: ${chalk.blue(`${packageManager}`)} install`);
111
+ }
94
112
  spinner.succeed(chalk.bold('Done'));
113
+ log(`Your ${type} extension has been added.`);
95
114
  }
96
115
  else {
97
116
  const { proceed } = await inquirer.prompt([
@@ -197,12 +216,21 @@ export default async function add() {
197
216
  name: EXTENSION_NAME_REGEX.test(extensionName) ? extensionName : `directus-extension-${extensionName}`,
198
217
  keywords: ['directus', 'directus-extension', `directus-custom-bundle`],
199
218
  [EXTENSION_PKG_KEY]: newExtensionOptions,
200
- devDependencies: await getExtensionDevDeps(entries.map((entry) => entry.type), getLanguageFromEntries(entries)),
219
+ devDependencies: {
220
+ ...extensionManifest.devDependencies,
221
+ ...(await getExtensionDevDeps(entries.map((entry) => entry.type), getLanguageFromEntries(entries))),
222
+ },
201
223
  };
202
224
  await fse.writeJSON(packagePath, newExtensionManifest, { spaces: indent ?? '\t' });
203
225
  const packageManager = getPackageManager();
204
- await execa(packageManager, ['install'], { cwd: extensionPath });
226
+ if (install) {
227
+ await execa(packageManager, ['install'], { cwd: extensionPath });
228
+ }
229
+ else {
230
+ spinner.info(`Dependency installation skipped, to install run: ${chalk.blue(`${packageManager}`)} install`);
231
+ }
205
232
  spinner.succeed(chalk.bold('Done'));
233
+ log(`Your ${type} extension has been added.`);
206
234
  }
207
235
  }
208
236
  function getLanguageFromEntries(entries) {
@@ -6,7 +6,7 @@ import { nodeResolve } from '@rollup/plugin-node-resolve';
6
6
  import replaceDefault from '@rollup/plugin-replace';
7
7
  import terserDefault from '@rollup/plugin-terser';
8
8
  import virtualDefault from '@rollup/plugin-virtual';
9
- import vueDefault from '@vitejs/plugin-vue';
9
+ import vue from '@vitejs/plugin-vue';
10
10
  import chalk from 'chalk';
11
11
  import fse from 'fs-extra';
12
12
  import ora from 'ora';
@@ -22,7 +22,6 @@ import loadConfig from './helpers/load-config.js';
22
22
  import { validateSplitEntrypointOption } from './helpers/validate-cli-options.js';
23
23
  // Workaround for https://github.com/rollup/plugins/issues/1329
24
24
  const virtual = virtualDefault;
25
- const vue = vueDefault;
26
25
  const esbuild = esbuildDefault;
27
26
  const styles = stylesDefault;
28
27
  const commonjs = commonjsDefault;
@@ -36,15 +35,26 @@ export default async function build(options) {
36
35
  if (!options.type && !options.input && !options.output) {
37
36
  const packagePath = path.resolve('package.json');
38
37
  if (!(await fse.pathExists(packagePath))) {
39
- log(`Current directory is not a valid package.`, 'error');
38
+ log(`Current directory is not a valid Directus extension:`, 'error');
39
+ log(`Missing "package.json" file.`, 'error');
40
+ process.exit(1);
41
+ }
42
+ let extensionManifestFile;
43
+ try {
44
+ extensionManifestFile = await fse.readFile(packagePath, 'utf8');
45
+ }
46
+ catch {
47
+ log(`Failed to read "package.json" file from current directory.`, 'error');
40
48
  process.exit(1);
41
49
  }
42
50
  let extensionManifest;
43
51
  try {
44
- extensionManifest = ExtensionManifest.parse(await fse.readJSON(packagePath));
52
+ extensionManifest = JSON.parse(extensionManifestFile);
53
+ ExtensionManifest.parse(extensionManifest);
45
54
  }
46
- catch (err) {
47
- log(`Current directory is not a valid Directus extension.`, 'error');
55
+ catch {
56
+ log(`Current directory is not a valid Directus extension:`, 'error');
57
+ log(`Invalid "package.json" file.`, 'error');
48
58
  process.exit(1);
49
59
  }
50
60
  const extensionOptions = extensionManifest[EXTENSION_PKG_KEY];
@@ -1,5 +1,6 @@
1
1
  type CreateOptions = {
2
2
  language?: string;
3
+ install?: boolean;
3
4
  };
4
5
  export default function create(type: string, name: string, options: CreateOptions): Promise<void>;
5
6
  export {};
@@ -12,6 +12,7 @@ import { log } from '../utils/logger.js';
12
12
  import copyTemplate from './helpers/copy-template.js';
13
13
  import getExtensionDevDeps from './helpers/get-extension-dev-deps.js';
14
14
  export default async function create(type, name, options) {
15
+ const install = options.install ?? true;
15
16
  const targetDir = name.substring(name.lastIndexOf('/') + 1);
16
17
  const targetPath = path.resolve(targetDir);
17
18
  if (!isIn(type, EXTENSION_TYPES)) {
@@ -35,14 +36,14 @@ export default async function create(type, name, options) {
35
36
  }
36
37
  }
37
38
  if (isIn(type, BUNDLE_EXTENSION_TYPES)) {
38
- await createPackageExtension({ type, name, targetDir, targetPath });
39
+ await createPackageExtension({ type, name, targetDir, targetPath, install });
39
40
  }
40
41
  else {
41
42
  const language = options.language ?? 'javascript';
42
- await createLocalExtension({ type, name, targetDir, targetPath, language });
43
+ await createLocalExtension({ type, name, targetDir, targetPath, language, install });
43
44
  }
44
45
  }
45
- async function createPackageExtension({ type, name, targetDir, targetPath, }) {
46
+ async function createPackageExtension({ type, name, targetDir, targetPath, install, }) {
46
47
  const spinner = ora(chalk.bold('Scaffolding Directus extension...')).start();
47
48
  await fse.ensureDir(targetPath);
48
49
  await copyTemplate(type, targetPath);
@@ -51,11 +52,13 @@ async function createPackageExtension({ type, name, targetDir, targetPath, }) {
51
52
  const packageManifest = getPackageManifest(name, options, await getExtensionDevDeps(type));
52
53
  await fse.writeJSON(path.join(targetPath, 'package.json'), packageManifest, { spaces: '\t' });
53
54
  const packageManager = getPackageManager();
54
- await execa(packageManager, ['install'], { cwd: targetPath });
55
+ if (install) {
56
+ await execa(packageManager, ['install'], { cwd: targetPath });
57
+ }
55
58
  spinner.succeed(chalk.bold('Done'));
56
- log(getDoneMessage(type, targetDir, targetPath, packageManager));
59
+ log(getDoneMessage(type, targetDir, targetPath, packageManager, install));
57
60
  }
58
- async function createLocalExtension({ type, name, targetDir, targetPath, language, }) {
61
+ async function createLocalExtension({ type, name, targetDir, targetPath, language, install, }) {
59
62
  if (!isLanguage(language)) {
60
63
  log(`Language ${chalk.bold(language)} is not supported. Available languages: ${EXTENSION_LANGUAGES.map((t) => chalk.bold.magenta(t)).join(', ')}.`, 'error');
61
64
  process.exit(1);
@@ -80,9 +83,11 @@ async function createLocalExtension({ type, name, targetDir, targetPath, languag
80
83
  const packageManifest = getPackageManifest(name, options, await getExtensionDevDeps(type, language));
81
84
  await fse.writeJSON(path.join(targetPath, 'package.json'), packageManifest, { spaces: '\t' });
82
85
  const packageManager = getPackageManager();
83
- await execa(packageManager, ['install'], { cwd: targetPath });
86
+ if (install) {
87
+ await execa(packageManager, ['install'], { cwd: targetPath });
88
+ }
84
89
  spinner.succeed(chalk.bold('Done'));
85
- log(getDoneMessage(type, targetDir, targetPath, packageManager));
90
+ log(getDoneMessage(type, targetDir, targetPath, packageManager, install));
86
91
  }
87
92
  function getPackageManifest(name, options, deps) {
88
93
  const packageManifest = {
@@ -105,15 +110,21 @@ function getPackageManifest(name, options, deps) {
105
110
  }
106
111
  return packageManifest;
107
112
  }
108
- function getDoneMessage(type, targetDir, targetPath, packageManager) {
109
- return `
113
+ function getDoneMessage(type, targetDir, targetPath, packageManager, install) {
114
+ let message = `
110
115
  Your ${type} extension has been created at ${chalk.green(targetPath)}
111
116
 
112
117
  To start developing, run:
113
- ${chalk.blue('cd')} ${targetDir}
118
+ ${chalk.blue('cd')} ${targetDir}`;
119
+ if (!install) {
120
+ message += `
121
+ ${chalk.blue(`${packageManager}`)} install`;
122
+ }
123
+ message += `
114
124
  ${chalk.blue(`${packageManager} run`)} dev
115
125
 
116
- and then to build for production, run:
126
+ To build for production, run:
117
127
  ${chalk.blue(`${packageManager} run`)} build
118
128
  `;
129
+ return message;
119
130
  }
package/dist/cli/run.js CHANGED
@@ -11,9 +11,14 @@ program
11
11
  .command('create')
12
12
  .arguments('<type> <name>')
13
13
  .description('Scaffold a new Directus extension')
14
+ .option('--no-install', 'skip dependency installation after creating extension')
14
15
  .option('-l, --language <language>', 'specify the language to use')
15
16
  .action(create);
16
- program.command('add').description('Add entries to an existing Directus extension').action(add);
17
+ program
18
+ .command('add')
19
+ .description('Add entries to an existing Directus extension')
20
+ .option('--no-install', 'skip dependency (re)installation after adding extension')
21
+ .action(add);
17
22
  program
18
23
  .command('build')
19
24
  .description('Bundle a Directus extension to a single entrypoint')
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { useApi, useCollection, useExtensions, useFilterFields, useItems, useLayout, useStores, useSync, } from '@directus/composables';
2
2
  export { defineDisplay, defineEndpoint, defineHook, defineInterface, defineLayout, defineModule, defineOperationApi, defineOperationApp, definePanel, } from '@directus/extensions';
3
+ export { defineTheme } from '@directus/themes';
3
4
  export { getFieldsFromTemplate, getRelationType } from '@directus/utils';
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { useApi, useCollection, useExtensions, useFilterFields, useItems, useLayout, useStores, useSync, } from '@directus/composables';
2
2
  export { defineDisplay, defineEndpoint, defineHook, defineInterface, defineLayout, defineModule, defineOperationApi, defineOperationApp, definePanel, } from '@directus/extensions';
3
+ export { defineTheme } from '@directus/themes';
3
4
  export { getFieldsFromTemplate, getRelationType } from '@directus/utils';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@directus/extensions-sdk",
3
- "version": "10.2.0",
3
+ "version": "10.3.0",
4
4
  "description": "A toolkit to develop extensions to extend Directus",
5
5
  "homepage": "https://directus.io",
6
6
  "repository": {
@@ -26,37 +26,38 @@
26
26
  "templates"
27
27
  ],
28
28
  "dependencies": {
29
- "@rollup/plugin-commonjs": "25.0.0",
30
- "@rollup/plugin-json": "6.0.0",
31
- "@rollup/plugin-node-resolve": "15.0.2",
32
- "@rollup/plugin-replace": "5.0.2",
33
- "@rollup/plugin-terser": "0.4.3",
34
- "@rollup/plugin-virtual": "3.0.1",
35
- "@vitejs/plugin-vue": "4.2.3",
36
- "chalk": "5.2.0",
29
+ "@rollup/plugin-commonjs": "25.0.7",
30
+ "@rollup/plugin-json": "6.1.0",
31
+ "@rollup/plugin-node-resolve": "15.2.3",
32
+ "@rollup/plugin-replace": "5.0.5",
33
+ "@rollup/plugin-terser": "0.4.4",
34
+ "@rollup/plugin-virtual": "3.0.2",
35
+ "@vitejs/plugin-vue": "4.5.2",
36
+ "chalk": "5.3.0",
37
37
  "commander": "10.0.1",
38
38
  "esbuild": "0.17.19",
39
- "execa": "7.1.1",
40
- "fs-extra": "11.1.1",
41
- "inquirer": "9.2.4",
39
+ "execa": "7.2.0",
40
+ "fs-extra": "11.2.0",
41
+ "inquirer": "9.2.12",
42
42
  "ora": "6.3.1",
43
- "rollup": "3.22.0",
43
+ "rollup": "3.29.4",
44
44
  "rollup-plugin-esbuild": "5.0.0",
45
45
  "rollup-plugin-styles": "4.0.0",
46
- "vite": "4.3.7",
47
- "vue": "3.3.4",
48
- "@directus/composables": "10.1.6",
49
- "@directus/constants": "11.0.1",
50
- "@directus/extensions": "0.2.0",
51
- "@directus/utils": "11.0.2",
52
- "@directus/types": "11.0.2"
46
+ "vite": "4.5.1",
47
+ "vue": "3.3.13",
48
+ "@directus/composables": "10.1.7",
49
+ "@directus/constants": "11.0.2",
50
+ "@directus/extensions": "0.2.1",
51
+ "@directus/themes": "0.3.2",
52
+ "@directus/utils": "11.0.3",
53
+ "@directus/types": "11.0.3"
53
54
  },
54
55
  "devDependencies": {
55
- "@types/fs-extra": "11.0.1",
56
- "@types/inquirer": "9.0.3",
57
- "@vitest/coverage-c8": "0.31.1",
58
- "typescript": "5.2.2",
59
- "vitest": "0.31.1",
56
+ "@types/fs-extra": "11.0.4",
57
+ "@types/inquirer": "9.0.7",
58
+ "@vitest/coverage-v8": "1.1.0",
59
+ "typescript": "5.3.3",
60
+ "vitest": "1.1.0",
60
61
  "@directus/tsconfig": "1.0.1"
61
62
  },
62
63
  "engines": {
@@ -1,4 +1,5 @@
1
1
  export default {
2
+ id: 'custom',
2
3
  name: 'My Custom Theme',
3
4
  appearance: 'light',
4
5
  rules: {
@@ -1,6 +1,7 @@
1
1
  import { defineTheme } from '@directus/extensions-sdk';
2
2
 
3
3
  export default defineTheme({
4
+ id: 'custom',
4
5
  name: 'My Custom Theme',
5
6
  appearance: 'light',
6
7
  rules: {