create-directus-extension 1.3.2 → 9.0.0-rc.93

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.
Files changed (35) hide show
  1. package/{src/templates/common/.editorconfig → .editorconfig} +0 -0
  2. package/lib/index.js +35 -0
  3. package/package.json +24 -61
  4. package/readme.md +15 -0
  5. package/README.md +0 -40
  6. package/dist/package.json +0 -63
  7. package/dist/src/index.js +0 -143
  8. package/src/templates/common/.eslintignore +0 -3
  9. package/src/templates/common/.prettierignore +0 -2
  10. package/src/templates/common/.prettierrc.js +0 -7
  11. package/src/templates/javascript/common/.eslintrc.js +0 -24
  12. package/src/templates/javascript/common/package.json.template +0 -11
  13. package/src/templates/javascript/common.vue/package.json.template +0 -14
  14. package/src/templates/javascript/common.vue/rollup.config.js +0 -13
  15. package/src/templates/javascript/display/src/display.vue +0 -7
  16. package/src/templates/javascript/display/src/index.js +0 -10
  17. package/src/templates/javascript/endpoint/index.js +0 -18
  18. package/src/templates/javascript/hook/index.js +0 -24
  19. package/src/templates/javascript/interface/src/index.js +0 -10
  20. package/src/templates/javascript/interface/src/interface.vue +0 -16
  21. package/src/templates/javascript/layout/src/index.js +0 -7
  22. package/src/templates/javascript/layout/src/layout.vue +0 -35
  23. package/src/templates/javascript/module/src/index.js +0 -13
  24. package/src/templates/javascript/module/src/module.vue +0 -36
  25. package/src/templates/package.json.mustache +0 -16
  26. package/src/templates/typescript/common/.eslintrc.js +0 -36
  27. package/src/templates/typescript/common/package.json.template +0 -20
  28. package/src/templates/typescript/common/tsconfig.json +0 -21
  29. package/src/templates/typescript/common.vue/package.json.template +0 -14
  30. package/src/templates/typescript/endpoint/package.json.template +0 -5
  31. package/src/templates/typescript/endpoint/src/index.ts +0 -26
  32. package/src/templates/typescript/endpoint/src/types.d.ts +0 -18
  33. package/src/templates/typescript/hook/package.json.template +0 -6
  34. package/src/templates/typescript/hook/src/index.ts +0 -31
  35. package/src/templates/typescript/hook/src/types.d.ts +0 -18
package/lib/index.js ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const inquirer = require('inquirer');
5
+ const { EXTENSION_TYPES, EXTENSION_LANGUAGES } = require('@directus/shared/constants');
6
+ const { create } = require('@directus/extensions-sdk/cli');
7
+
8
+ run();
9
+
10
+ async function run() {
11
+ // eslint-disable-next-line no-console
12
+ console.log('This utility will walk you through creating a Directus extension.\n');
13
+
14
+ const { type, name, language } = await inquirer.prompt([
15
+ {
16
+ type: 'list',
17
+ name: 'type',
18
+ message: 'Choose the extension type',
19
+ choices: EXTENSION_TYPES,
20
+ },
21
+ {
22
+ type: 'input',
23
+ name: 'name',
24
+ message: 'Choose a name for the extension',
25
+ },
26
+ {
27
+ type: 'list',
28
+ name: 'language',
29
+ message: 'Choose the language to use',
30
+ choices: EXTENSION_LANGUAGES,
31
+ },
32
+ ]);
33
+
34
+ await create(type, name, { language });
35
+ }
package/package.json CHANGED
@@ -1,63 +1,26 @@
1
1
  {
2
- "name": "create-directus-extension",
3
- "version": "1.3.2",
4
- "description": "Command line toolkit to help users bootstrap custom Directus extensions",
5
- "main": "dist/src/index.js",
6
- "bin": "./dist/src/index.js",
7
- "files": [
8
- "dist",
9
- "src/templates"
10
- ],
11
- "scripts": {
12
- "build": "tsc",
13
- "prepack": "npm run build"
14
- },
15
- "release": {
16
- "branches": [
17
- "main"
18
- ],
19
- "plugins": [
20
- "@semantic-release/commit-analyzer",
21
- "@semantic-release/release-notes-generator",
22
- "@semantic-release/npm",
23
- "@semantic-release/github",
24
- [
25
- "@semantic-release/git",
26
- {
27
- "assets": [
28
- "package.json"
29
- ],
30
- "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
31
- }
32
- ]
33
- ]
34
- },
35
- "keywords": [
36
- "directus",
37
- "extension"
38
- ],
39
- "author": "Joonas Palosuo <joonas.palosuo@gmail.com>",
40
- "license": "GPL-3.0-only",
41
- "dependencies": {
42
- "chalk": "4.1.0",
43
- "commander": "6.2.0",
44
- "execa": "4.1.0",
45
- "fs-extra": "9.0.1",
46
- "mustache": "4.2.0",
47
- "ora": "5.1.0",
48
- "typescript": "4.2.4"
49
- },
50
- "devDependencies": {
51
- "@semantic-release/git": "9.0.0",
52
- "@types/fs-extra": "9.0.10",
53
- "@types/mustache": "4.1.1",
54
- "@types/node": "14.14.37",
55
- "@typescript-eslint/eslint-plugin": "4.20.0",
56
- "@typescript-eslint/parser": "4.20.0",
57
- "eslint": "7.23.0",
58
- "eslint-config-prettier": "8.1.0",
59
- "eslint-plugin-prettier": "3.3.1",
60
- "prettier": "2.2.1",
61
- "semantic-release": "17.4.2"
62
- }
2
+ "name": "create-directus-extension",
3
+ "version": "9.0.0-rc.93",
4
+ "description": "A small util that will scaffold a Directus extension.",
5
+ "main": "lib/index.js",
6
+ "bin": {
7
+ "create-directus-extension": "./lib/index.js",
8
+ "cde": "./lib/index.js"
9
+ },
10
+ "keywords": [
11
+ "directus",
12
+ "extensions"
13
+ ],
14
+ "author": "Nicola Krumschmidt",
15
+ "contributors": [
16
+ "Joonas Palosuo <joonas.palosuo@gmail.com>",
17
+ "Rijk van Zanten <rijkvanzanten@me.com>"
18
+ ],
19
+ "license": "GPL-3.0-only",
20
+ "gitHead": "61a368523b1fc4968ca456a610bc7de10be46dc1",
21
+ "dependencies": {
22
+ "@directus/extensions-sdk": "9.0.0-rc.93",
23
+ "@directus/shared": "9.0.0-rc.93",
24
+ "inquirer": "^8.1.2"
25
+ }
63
26
  }
package/readme.md ADDED
@@ -0,0 +1,15 @@
1
+ # create-directus-extension
2
+
3
+ A small util that will scaffold a Directus extension.
4
+
5
+ ## Installation
6
+
7
+ This package is meant to be used through `npm` or `yarn`:
8
+
9
+ ```
10
+ npm init directus-extension
11
+ ```
12
+
13
+ ```
14
+ yarn create directus-extension
15
+ ```
package/README.md DELETED
@@ -1,40 +0,0 @@
1
- # create-directus-extension
2
-
3
- A command line helper for bootstrapping custom Directus extensions in Typescript and Javascript.
4
-
5
- ## Installation
6
-
7
- This package is meant to be used through `npx` or `yarn`, for example:
8
-
9
- ```bash
10
- npx create-directus-extension interface my-interface
11
- ```
12
-
13
- ```bash
14
- yarn create directus-extension display my-display
15
- ```
16
-
17
- ## Usage
18
-
19
- The tool accepts two arguments and an optional flag:
20
-
21
- ```bash
22
- npx create-directus-extension <extension-type> <extension-name> [-j]
23
- ```
24
-
25
- Here `<extension-type>` can be any one of the following:
26
-
27
- ```
28
- display
29
- interface
30
- layout
31
- module
32
- endpoint
33
- hook
34
- ```
35
-
36
- which correspond to the different extensions supported by Directus, as explained here: https://docs.directus.io/concepts/extensions/
37
-
38
- `<extension-name>` can be any name you choose, and will be used to create a directory for the new extension. Then name you give must not conflict with an existing directory or file!
39
-
40
- The CLI generates the project with a Typescript template by default. If you would rather develop the project in Javascript, an optional flag of `-j` or `--javascript` can be given to the `create-directus-extension` command.
package/dist/package.json DELETED
@@ -1,63 +0,0 @@
1
- {
2
- "name": "create-directus-extension",
3
- "version": "1.3.2",
4
- "description": "Command line toolkit to help users bootstrap custom Directus extensions",
5
- "main": "dist/src/index.js",
6
- "bin": "./dist/src/index.js",
7
- "files": [
8
- "dist",
9
- "src/templates"
10
- ],
11
- "scripts": {
12
- "build": "tsc",
13
- "prepack": "npm run build"
14
- },
15
- "release": {
16
- "branches": [
17
- "main"
18
- ],
19
- "plugins": [
20
- "@semantic-release/commit-analyzer",
21
- "@semantic-release/release-notes-generator",
22
- "@semantic-release/npm",
23
- "@semantic-release/github",
24
- [
25
- "@semantic-release/git",
26
- {
27
- "assets": [
28
- "package.json"
29
- ],
30
- "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
31
- }
32
- ]
33
- ]
34
- },
35
- "keywords": [
36
- "directus",
37
- "extension"
38
- ],
39
- "author": "Joonas Palosuo <joonas.palosuo@gmail.com>",
40
- "license": "GPL-3.0-only",
41
- "dependencies": {
42
- "chalk": "4.1.0",
43
- "commander": "6.2.0",
44
- "execa": "4.1.0",
45
- "fs-extra": "9.0.1",
46
- "mustache": "4.2.0",
47
- "ora": "5.1.0",
48
- "typescript": "4.2.4"
49
- },
50
- "devDependencies": {
51
- "@semantic-release/git": "9.0.0",
52
- "@types/fs-extra": "9.0.10",
53
- "@types/mustache": "4.1.1",
54
- "@types/node": "14.14.37",
55
- "@typescript-eslint/eslint-plugin": "4.20.0",
56
- "@typescript-eslint/parser": "4.20.0",
57
- "eslint": "7.23.0",
58
- "eslint-config-prettier": "8.1.0",
59
- "eslint-plugin-prettier": "3.3.1",
60
- "prettier": "2.2.1",
61
- "semantic-release": "17.4.2"
62
- }
63
- }
package/dist/src/index.js DELETED
@@ -1,143 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
6
- }) : (function(o, m, k, k2) {
7
- if (k2 === undefined) k2 = k;
8
- o[k2] = m[k];
9
- }));
10
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
11
- Object.defineProperty(o, "default", { enumerable: true, value: v });
12
- }) : function(o, v) {
13
- o["default"] = v;
14
- });
15
- var __importStar = (this && this.__importStar) || function (mod) {
16
- if (mod && mod.__esModule) return mod;
17
- var result = {};
18
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
19
- __setModuleDefault(result, mod);
20
- return result;
21
- };
22
- var __importDefault = (this && this.__importDefault) || function (mod) {
23
- return (mod && mod.__esModule) ? mod : { "default": mod };
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- const commander_1 = __importDefault(require("commander"));
27
- const path_1 = __importDefault(require("path"));
28
- const chalk_1 = __importDefault(require("chalk"));
29
- const fs_extra_1 = __importDefault(require("fs-extra"));
30
- const mustache_1 = __importDefault(require("mustache"));
31
- const execa_1 = __importDefault(require("execa"));
32
- const ora_1 = __importDefault(require("ora"));
33
- const pkg = __importStar(require("../package.json"));
34
- const VUE_EXTENSIONS = ['display', 'interface', 'layout', 'module'];
35
- const EXTENSION_TYPES = [...VUE_EXTENSIONS, 'endpoint', 'hook'];
36
- const TEMPLATE_ROOT = path_1.default.resolve(__dirname, '../../src/templates');
37
- const program = new commander_1.default.Command(pkg.name);
38
- program
39
- .version(pkg.version)
40
- .arguments('<type> <name>')
41
- .option('-j, --javascript', 'Use Javascript instead of Typescript')
42
- .description('Create a new Directus extension', {
43
- type: 'Type of the extension you wish to create.\n' +
44
- 'Has to be one of the following:\n' +
45
- `${chalk_1.default.blue(EXTENSION_TYPES.join(', '))}`,
46
- name: 'Name of your custom extension and the folder to be created',
47
- })
48
- .action(create);
49
- program.exitOverride((err) => {
50
- if (err.code === 'commander.missingArgument') {
51
- program.outputHelp();
52
- }
53
- process.exit(err.exitCode);
54
- });
55
- program.parse(process.argv);
56
- async function create(type, name, options) {
57
- const targetPath = path_1.default.resolve(name);
58
- if (!EXTENSION_TYPES.includes(type)) {
59
- console.log(`Extension type "${chalk_1.default.red(type)}" does not exist.`);
60
- console.log('Please choose one of the following:');
61
- console.log(EXTENSION_TYPES.join(', '));
62
- process.exit(1);
63
- }
64
- if (await fs_extra_1.default.pathExists(targetPath)) {
65
- const stat = await fs_extra_1.default.stat(targetPath);
66
- if (stat.isDirectory() === false) {
67
- console.log(`Destination ${chalk_1.default.red(name)} already exists and is not a directory.`);
68
- process.exit(1);
69
- }
70
- const files = await fs_extra_1.default.readdir(targetPath);
71
- if (files.length > 0) {
72
- console.log(`Destination ${chalk_1.default.red(name)} already exists and is not an empty directory.`);
73
- process.exit(1);
74
- }
75
- }
76
- const projectLanguage = options.javascript ? 'javascript' : 'typescript';
77
- const templatePath = `${TEMPLATE_ROOT}/${projectLanguage}/${type}`;
78
- if (!(await fs_extra_1.default.pathExists(`${templatePath}/index.${projectLanguage.charAt(0)}s`)) &&
79
- !(await fs_extra_1.default.pathExists(`${templatePath}/src/index.${projectLanguage.charAt(0)}s`))) {
80
- console.log(`Bootstrapping ${chalk_1.default.red(type)}s in ${projectLanguage} is not yet supported.`);
81
- console.log('Follow the development of this toolkit here:');
82
- console.log('https://github.com/directus-community/extension-toolkit');
83
- process.exit(1);
84
- }
85
- const spinner = ora_1.default(`Setting up ${type} boilerplate`).start();
86
- await fs_extra_1.default.ensureDir(targetPath);
87
- // Copy over files
88
- fs_extra_1.default.copy(templatePath, targetPath, { filter: fileFilter }, (e) => e && console.error(e));
89
- fs_extra_1.default.copy(`${TEMPLATE_ROOT}/common`, targetPath, { filter: fileFilter }, (e) => e && console.error(e));
90
- fs_extra_1.default.copy(`${TEMPLATE_ROOT}/${projectLanguage}/common`, targetPath, { filter: fileFilter }, (e) => e && console.error(e));
91
- if (VUE_EXTENSIONS.includes(type)) {
92
- fs_extra_1.default.copy(`${TEMPLATE_ROOT}/${projectLanguage}/common.vue`, targetPath, { filter: fileFilter }, (e) => e && console.error(e));
93
- }
94
- // Parse package.json from common, unique and template files
95
- const commonPackageJson = await fs_extra_1.default.readJSON(`${TEMPLATE_ROOT}/${projectLanguage}/common/package.json.template`);
96
- const uniquePackageJsonPath = `${templatePath}/package.json.template`;
97
- let templatePackageJson;
98
- if (await fs_extra_1.default.pathExists(uniquePackageJsonPath)) {
99
- templatePackageJson = await fs_extra_1.default.readJSON(uniquePackageJsonPath);
100
- }
101
- else {
102
- templatePackageJson = {};
103
- }
104
- let vuePackageJson;
105
- if (VUE_EXTENSIONS.includes(type)) {
106
- vuePackageJson = await fs_extra_1.default.readJSON(`${TEMPLATE_ROOT}/${projectLanguage}/common.vue/package.json.template`);
107
- }
108
- else {
109
- vuePackageJson = {};
110
- }
111
- const packageJsonTemplate = await fs_extra_1.default.readFile(`${TEMPLATE_ROOT}/package.json.mustache`, 'utf-8');
112
- const mustacheView = {
113
- name,
114
- type,
115
- ...stringifyTemplateObjects(['dependencies', 'devDependencies', 'scripts'], [commonPackageJson, templatePackageJson, vuePackageJson]),
116
- };
117
- const renderedPackageJson = mustache_1.default.render(packageJsonTemplate, mustacheView);
118
- fs_extra_1.default.writeJSON(`${targetPath}/package.json`, JSON.parse(renderedPackageJson), { spaces: 2 });
119
- await execa_1.default('npm', ['install'], { cwd: targetPath });
120
- spinner.stop();
121
- console.log(`Extension set up successfully! Start your development with "cd ${name}"`);
122
- console.log('Also be sure to check out the relevant documentation:');
123
- const documentationSlug = VUE_EXTENSIONS.includes(type) ? type : `api-${type}`;
124
- console.log(`https://docs.directus.io/guides/${documentationSlug}s/`);
125
- process.exit(0);
126
- }
127
- /** Selects all files excluding those with `.template` suffix */
128
- function fileFilter(filename) {
129
- return !filename.endsWith('template');
130
- }
131
- /**
132
- * Merge templates of package.json into one object with string values,
133
- * so that they can be passed to Mustache templating
134
- */
135
- function stringifyTemplateObjects(keys, templates) {
136
- return Object.fromEntries(keys.map((key) => [
137
- key,
138
- JSON.stringify(templates
139
- .map((template) => template[key] || {})
140
- .reduce((acc, curr) => ({ ...acc, ...curr }), {})),
141
- ]));
142
- }
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLDBEQUFrQztBQUNsQyxnREFBd0I7QUFDeEIsa0RBQTBCO0FBQzFCLHdEQUEyQjtBQUMzQix3REFBZ0M7QUFDaEMsa0RBQTBCO0FBQzFCLDhDQUFzQjtBQUV0QixxREFBdUM7QUFFdkMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNwRSxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVoRSxNQUFNLGFBQWEsR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBRXJFLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRWhELE9BQU87S0FDTCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztLQUNwQixTQUFTLENBQUMsZUFBZSxDQUFDO0tBQzFCLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxzQ0FBc0MsQ0FBQztLQUNsRSxXQUFXLENBQUMsaUNBQWlDLEVBQUU7SUFDL0MsSUFBSSxFQUNILDZDQUE2QztRQUM3QyxtQ0FBbUM7UUFDbkMsR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtJQUM1QyxJQUFJLEVBQUUsNERBQTREO0NBQ2xFLENBQUM7S0FDRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFakIsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO0lBQzVCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSywyQkFB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
@@ -1,3 +0,0 @@
1
- node_modules
2
- dist
3
- .eslintrc.js
@@ -1,2 +0,0 @@
1
- dist
2
- node_modules
@@ -1,7 +0,0 @@
1
- module.exports = {
2
- htmlWhitespaceSensitivity: 'ignore',
3
- printWidth: 120,
4
- singleQuote: true,
5
- useTabs: true,
6
- proseWrap: 'always',
7
- };
@@ -1,24 +0,0 @@
1
- module.exports = {
2
- root: true,
3
- env: {
4
- node: true,
5
- },
6
- extends: ['plugin:prettier-vue/recommended', 'plugin:vue/essential'],
7
- plugins: ['prettier'],
8
- rules: {
9
- 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
10
- 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
11
- 'prettier/prettier': ['error', { singleQuote: true }],
12
- 'vue/valid-v-slot': 0,
13
- 'comma-dangle': [
14
- 'error',
15
- {
16
- arrays: 'always-multiline',
17
- exports: 'always-multiline',
18
- functions: 'never',
19
- imports: 'always-multiline',
20
- objects: 'always-multiline',
21
- },
22
- ],
23
- },
24
- };
@@ -1,11 +0,0 @@
1
- {
2
- "scripts": {
3
-
4
- },
5
- "dependencies": {
6
-
7
- },
8
- "devDependencies": {
9
-
10
- }
11
- }
@@ -1,14 +0,0 @@
1
- {
2
- "scripts": {
3
- "build": "npx rollup -c"
4
- },
5
- "dependencies": {
6
- "rollup": "latest",
7
- "rollup-plugin-commonjs": "latest",
8
- "rollup-plugin-node-resolve": "latest",
9
- "rollup-plugin-terser": "latest",
10
- "rollup-plugin-vue": "5.0.0",
11
- "@vue/compiler-sfc": "latest",
12
- "rollup-plugin-vue": "next"
13
- }
14
- }
@@ -1,13 +0,0 @@
1
- import { terser } from 'rollup-plugin-terser';
2
- import resolve from 'rollup-plugin-node-resolve';
3
- import commonjs from 'rollup-plugin-commonjs';
4
- import vue from 'rollup-plugin-vue';
5
-
6
- export default {
7
- input: 'src/index.js',
8
- output: {
9
- format: 'es',
10
- file: 'dist/index.js',
11
- },
12
- plugins: [terser(), resolve(), commonjs(), vue()],
13
- };
@@ -1,7 +0,0 @@
1
- <template>
2
- <div>My Custom Display</div>
3
- </template>
4
-
5
- <script>
6
- export default {};
7
- </script>
@@ -1,10 +0,0 @@
1
- import DisplayComponent from './display.vue';
2
-
3
- export default {
4
- id: 'custom',
5
- name: 'Custom',
6
- description: 'This is my custom display!',
7
- icon: 'box',
8
- handler: DisplayComponent,
9
- types: ['string'],
10
- };
@@ -1,18 +0,0 @@
1
- module.exports = function registerEndpoint(router, { services, exceptions }) {
2
- const { ItemsService } = services;
3
- const { ServiceUnavailableException } = exceptions;
4
-
5
- router.get('/', (req, res, next) => {
6
- const recipeService = new ItemsService('recipes', {
7
- schema: req.schema,
8
- accountability: req.accountability,
9
- });
10
-
11
- recipeService
12
- .readByQuery({ sort: 'name', fields: ['*'] })
13
- .then((results) => res.json(results))
14
- .catch((error) => {
15
- return next(new ServiceUnavailableException(error.message));
16
- });
17
- });
18
- };
@@ -1,24 +0,0 @@
1
- module.exports = function registerHook({ services, exceptions }) {
2
- const { ServiceUnavailableException, ForbiddenException } = exceptions;
3
-
4
- return {
5
- // Force everything to be admin-only at all times
6
- 'items.*': async function ({ item, accountability }) {
7
- if (accountability.admin !== true) throw new ForbiddenException();
8
- },
9
- // Sync with external recipes service, cancel creation on failure
10
- 'items.create.before': async function (input, { collection }) {
11
- if (collection !== 'recipes') return input;
12
-
13
- try {
14
- await axios.post('https://example.com/recipes', input);
15
- } catch (error) {
16
- throw new ServiceUnavailableException(error);
17
- }
18
-
19
- input[0].syncedWithExample = true;
20
-
21
- return input;
22
- },
23
- };
24
- };
@@ -1,10 +0,0 @@
1
- import InterfaceComponent from './interface.vue';
2
-
3
- export default {
4
- id: 'custom',
5
- name: 'Custom',
6
- description: 'This is my custom interface!',
7
- icon: 'box',
8
- component: InterfaceComponent,
9
- types: ['string'],
10
- };
@@ -1,16 +0,0 @@
1
- <template>
2
- <input :value="value" @input="handleChange($event.target.value)" />
3
- </template>
4
-
5
- <script>
6
- export default {
7
- props: {
8
- value: String,
9
- },
10
- methods: {
11
- handleChange(value) {
12
- this.$emit('input', value);
13
- },
14
- },
15
- };
16
- </script>
@@ -1,7 +0,0 @@
1
- import LayoutComponent from './layout.vue';
2
-
3
- export default {
4
- id: 'custom',
5
- name: 'Custom',
6
- component: LayoutComponent,
7
- };
@@ -1,35 +0,0 @@
1
- <template>
2
- <div>
3
- <div>Collection: {{ collection }}</div>
4
- <v-list>
5
- <v-list-item v-for="item in items" v-bind:key="item.id">
6
- {{item}}
7
- </v-list-item>
8
- </v-list>
9
- <v-button v-on:click="logToConsole">Log items to console</v-button>
10
- </div>
11
- </template>
12
- <script>
13
- export default {
14
- data() {
15
- return {
16
- items: null,
17
- };
18
- },
19
- methods: {
20
- logToConsole: function () {
21
- console.log(this.items);
22
- },
23
- },
24
- inject: ["system"],
25
- mounted() {
26
- // log the system field so you can see what attributes are available under it
27
- // remove this line when you're done.
28
- console.log(this.system);
29
- // Get a list of all available collections to use with this module
30
- this.system.api.get(`/items/${this.collection}`).then((res) => {
31
- this.items = res;
32
- });
33
- },
34
- };
35
- </script>
@@ -1,13 +0,0 @@
1
- import ModuleComponent from './module.vue';
2
-
3
- export default {
4
- id: 'custom',
5
- name: 'Custom',
6
- icon: 'box',
7
- routes: [
8
- {
9
- path: '/',
10
- component: ModuleComponent,
11
- },
12
- ],
13
- };
@@ -1,36 +0,0 @@
1
- <template>
2
- <private-view title="Example Collection List">
3
- <v-list>
4
- <v-list-item v-for="col in collections" v-bind:key="col.collection">
5
- {{col.collection}}
6
- </v-list-item>
7
- </v-list>
8
- <v-button v-on:click="logToConsole">Log collections to console</v-button>
9
- </private-view>
10
- </template>
11
-
12
- <script>
13
- export default {
14
- data() {
15
- return {
16
- collections: null,
17
- };
18
- },
19
- methods: {
20
- logToConsole: function () {
21
- console.log(this.collections);
22
- },
23
- },
24
- inject: ["system"],
25
- mounted() {
26
- // log the system field so you can see what attributes are available under it
27
- // remove this line when you're done.
28
- console.log(this.system);
29
-
30
- // Get a list of all available collections to use with this module
31
- this.system.api.get("/collections?limit=-1").then((res) => {
32
- this.collections = res.data.data;
33
- });
34
- },
35
- };
36
- </script>
@@ -1,16 +0,0 @@
1
- {
2
- "name": "{{ name }}",
3
- "version": "1.0.0",
4
- "description": "",
5
- "main": "",
6
- "scripts": {{{ scripts }}},
7
- "keywords": [
8
- "directus",
9
- "directus-extension",
10
- "directus-custom-{{ type }}"
11
- ],
12
- "author": "",
13
- "license": "GPL-3.0",
14
- "dependencies": {{{ dependencies }}},
15
- "devDependencies": {{{ devDependencies }}}
16
- }
@@ -1,36 +0,0 @@
1
- module.exports = {
2
- root: true,
3
- env: {
4
- node: true,
5
- },
6
- extends: [
7
- 'plugin:@typescript-eslint/recommended',
8
- 'plugin:prettier-vue/recommended',
9
- 'plugin:vue/essential',
10
- ],
11
- plugins: ['@typescript-eslint', 'prettier'],
12
- rules: {
13
- 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
14
- 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
15
- '@typescript-eslint/camelcase': 0,
16
- '@typescript-eslint/no-use-before-define': 0,
17
- '@typescript-eslint/ban-ts-ignore': 0,
18
- '@typescript-eslint/no-explicit-any': 0,
19
- '@typescript-eslint/no-var-requires': 0,
20
- 'prettier/prettier': ['error', { singleQuote: true }],
21
- 'vue/valid-v-slot': 0,
22
- 'comma-dangle': [
23
- 'error',
24
- {
25
- arrays: 'always-multiline',
26
- exports: 'always-multiline',
27
- functions: 'never',
28
- imports: 'always-multiline',
29
- objects: 'always-multiline',
30
- },
31
- ],
32
- },
33
- parserOptions: {
34
- parser: '@typescript-eslint/parser',
35
- },
36
- };
@@ -1,20 +0,0 @@
1
- {
2
- "scripts": {
3
- "build": "tsc",
4
- "build:watch": "tsc -w --preserveWatchOutput"
5
- },
6
- "dependencies": {
7
- },
8
- "devDependencies": {
9
- "@typescript-eslint/eslint-plugin": "^4.9.1",
10
- "@typescript-eslint/parser": "^4.9.1",
11
- "directus": "latest",
12
- "typescript": "^4.0.5",
13
- "eslint": "^7.22.0",
14
- "eslint-config-prettier": "^8.1.0",
15
- "eslint-plugin-prettier": "^3.3.1",
16
- "eslint-plugin-prettier-vue": "^2.1.1",
17
- "eslint-plugin-vue": "^7.8.0",
18
- "prettier": "^2.2.1"
19
- }
20
- }
@@ -1,21 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "esnext",
4
- "module": "commonjs",
5
- "rootDir": "./",
6
- "outDir": "dist",
7
- "strict": true,
8
- "esModuleInterop": true,
9
- "inlineSourceMap": true,
10
- "skipLibCheck": true,
11
- "forceConsistentCasingInFileNames": true,
12
- "resolveJsonModule": true,
13
- },
14
- "include": [
15
- "src/**/*.ts"
16
- ],
17
- "exclude": [
18
- "node_modules",
19
- "src/templates"
20
- ]
21
- }
@@ -1,14 +0,0 @@
1
- {
2
- "scripts": {
3
- "build": "npx rollup -c"
4
- },
5
- "dependencies": {
6
- "rollup": "latest",
7
- "rollup-plugin-commonjs": "latest",
8
- "rollup-plugin-node-resolve": "latest",
9
- "rollup-plugin-terser": "latest",
10
- "rollup-plugin-vue": "5.0.0",
11
- "@vue/compiler-sfc": "latest",
12
- "rollup-plugin-vue": "next"
13
- }
14
- }
@@ -1,5 +0,0 @@
1
- {
2
- "devDependencies": {
3
- "@types/express": "^4.17.11"
4
- }
5
- }
@@ -1,26 +0,0 @@
1
- import { EndpointRegisterFunction } from './types';
2
-
3
- const registerEndpoint: EndpointRegisterFunction = (router, { services, exceptions }) => {
4
- const { ItemsService } = services;
5
- const { ServiceUnavailableException } = exceptions;
6
-
7
- router.get('/', (req, res, next) => {
8
- const recipeService = new ItemsService('recipes', {
9
- schema: req.schema,
10
- accountability: req.accountability,
11
- });
12
-
13
- recipeService
14
- .readByQuery({ sort: [{ column: 'name', order: 'asc' }], fields: ['*'] })
15
- .then((results) => res.json(results))
16
- .catch((error) => {
17
- return next(
18
- new ServiceUnavailableException(error.message, {
19
- service: 'my-custom-service',
20
- }),
21
- );
22
- });
23
- });
24
- };
25
-
26
- export default registerEndpoint;
@@ -1,18 +0,0 @@
1
- import { Accountability, Query, SchemaOverview } from 'directus/dist/types';
2
- import { EndpointRegisterFunction } from 'directus/dist/types/extensions';
3
-
4
- declare global {
5
- namespace Express {
6
- export interface Request {
7
- token: string | null;
8
- collection: string;
9
- sanitizedQuery: Query;
10
- schema: SchemaOverview;
11
-
12
- accountability?: Accountability;
13
- singleton?: boolean;
14
- }
15
- }
16
- }
17
-
18
- export { EndpointRegisterFunction };
@@ -1,6 +0,0 @@
1
- {
2
- "devDependencies": {
3
- "axios": "^0.21.0",
4
- "knex": "^0.95.3"
5
- }
6
- }
@@ -1,31 +0,0 @@
1
- import { HookRegisterFunction, EventHandlerArguments } from './types';
2
- import axios from 'axios';
3
-
4
- const registerHook: HookRegisterFunction = ({ services, exceptions }) => {
5
- const { ServiceUnavailableException, ForbiddenException } = exceptions;
6
-
7
- return {
8
- // Force everything to be admin-only at all times
9
- 'items.*': async function ({ item, accountability }: EventHandlerArguments) {
10
- if (accountability.admin !== true) throw new ForbiddenException();
11
- },
12
- // Sync with external recipes service, cancel creation on failure
13
- 'items.create.before': async function (input, { collection }) {
14
- if (collection !== 'recipes') return input;
15
-
16
- try {
17
- await axios.post('https://example.com/recipes', input);
18
- } catch (error) {
19
- throw new ServiceUnavailableException(error, {
20
- service: 'my-custom-extension',
21
- });
22
- }
23
-
24
- input[0].syncedWithExample = true;
25
-
26
- return input;
27
- },
28
- };
29
- };
30
-
31
- export default registerHook;
@@ -1,18 +0,0 @@
1
- import { HookRegisterFunction, ExtensionContext } from 'directus/dist/types/extensions';
2
- import { Accountability } from 'directus/dist/types/accountability';
3
- import { SchemaOverview } from 'directus/dist/types/schema';
4
-
5
- declare type Action = 'create' | 'update' | 'delete';
6
-
7
- declare type EventHandlerArguments = {
8
- event: string;
9
- accountability: Accountability;
10
- collection: string;
11
- item: string;
12
- action: Action;
13
- payload: unknown;
14
- schema: SchemaOverview;
15
- database: ExtensionContext['database'];
16
- };
17
-
18
- export { HookRegisterFunction, EventHandlerArguments };