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.
- package/{src/templates/common/.editorconfig → .editorconfig} +0 -0
- package/lib/index.js +35 -0
- package/package.json +24 -61
- package/readme.md +15 -0
- package/README.md +0 -40
- package/dist/package.json +0 -63
- package/dist/src/index.js +0 -143
- package/src/templates/common/.eslintignore +0 -3
- package/src/templates/common/.prettierignore +0 -2
- package/src/templates/common/.prettierrc.js +0 -7
- package/src/templates/javascript/common/.eslintrc.js +0 -24
- package/src/templates/javascript/common/package.json.template +0 -11
- package/src/templates/javascript/common.vue/package.json.template +0 -14
- package/src/templates/javascript/common.vue/rollup.config.js +0 -13
- package/src/templates/javascript/display/src/display.vue +0 -7
- package/src/templates/javascript/display/src/index.js +0 -10
- package/src/templates/javascript/endpoint/index.js +0 -18
- package/src/templates/javascript/hook/index.js +0 -24
- package/src/templates/javascript/interface/src/index.js +0 -10
- package/src/templates/javascript/interface/src/interface.vue +0 -16
- package/src/templates/javascript/layout/src/index.js +0 -7
- package/src/templates/javascript/layout/src/layout.vue +0 -35
- package/src/templates/javascript/module/src/index.js +0 -13
- package/src/templates/javascript/module/src/module.vue +0 -36
- package/src/templates/package.json.mustache +0 -16
- package/src/templates/typescript/common/.eslintrc.js +0 -36
- package/src/templates/typescript/common/package.json.template +0 -20
- package/src/templates/typescript/common/tsconfig.json +0 -21
- package/src/templates/typescript/common.vue/package.json.template +0 -14
- package/src/templates/typescript/endpoint/package.json.template +0 -5
- package/src/templates/typescript/endpoint/src/index.ts +0 -26
- package/src/templates/typescript/endpoint/src/types.d.ts +0 -18
- package/src/templates/typescript/hook/package.json.template +0 -6
- package/src/templates/typescript/hook/src/index.ts +0 -31
- package/src/templates/typescript/hook/src/types.d.ts +0 -18
|
File without changes
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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,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,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,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,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,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,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,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,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 };
|