@directus/extensions-sdk 9.20.4 → 9.21.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.
Files changed (155) hide show
  1. package/dist/cjs/cli/commands/add.d.ts +2 -0
  2. package/dist/cjs/cli/commands/add.js +242 -0
  3. package/dist/cjs/cli/commands/build.d.ts +1 -1
  4. package/dist/cjs/cli/commands/build.js +169 -43
  5. package/dist/cjs/cli/commands/create.d.ts +2 -2
  6. package/dist/cjs/cli/commands/create.js +66 -47
  7. package/dist/cjs/cli/commands/helpers/copy-template.d.ts +4 -0
  8. package/dist/cjs/cli/commands/helpers/copy-template.js +53 -0
  9. package/dist/cjs/cli/commands/helpers/generate-bundle-entrypoint.d.ts +3 -0
  10. package/dist/cjs/cli/commands/helpers/generate-bundle-entrypoint.js +24 -0
  11. package/dist/cjs/cli/commands/helpers/get-extension-dev-deps.d.ts +4 -0
  12. package/dist/cjs/cli/commands/helpers/get-extension-dev-deps.js +27 -0
  13. package/dist/cjs/cli/commands/helpers/load-config.d.ts +3 -0
  14. package/dist/cjs/cli/{utils → commands/helpers}/load-config.js +0 -0
  15. package/dist/cjs/cli/commands/helpers/validate-cli-options.d.ts +4 -0
  16. package/dist/cjs/cli/commands/helpers/validate-cli-options.js +39 -0
  17. package/dist/cjs/cli/run.js +3 -1
  18. package/dist/cjs/cli/types.d.ts +5 -5
  19. package/dist/cjs/cli/utils/detect-json-indent.d.ts +2 -0
  20. package/dist/cjs/cli/utils/detect-json-indent.js +14 -0
  21. package/dist/cjs/cli/utils/get-package-manager-agent.d.ts +5 -0
  22. package/dist/cjs/cli/utils/get-package-manager-agent.js +15 -0
  23. package/dist/cjs/cli/utils/get-package-manager-agent.test.d.ts +2 -0
  24. package/dist/cjs/cli/utils/get-package-manager-agent.test.js +24 -0
  25. package/dist/cjs/cli/utils/get-package-manager.d.ts +5 -0
  26. package/dist/cjs/cli/utils/get-package-manager.js +20 -0
  27. package/dist/cjs/cli/utils/get-package-manager.test.d.ts +2 -0
  28. package/dist/cjs/cli/utils/get-package-manager.test.js +42 -0
  29. package/dist/cjs/cli/utils/get-sdk-version.d.ts +2 -0
  30. package/dist/cjs/cli/utils/get-sdk-version.js +7 -0
  31. package/dist/cjs/cli/utils/get-template-path.d.ts +2 -0
  32. package/dist/cjs/cli/utils/get-template-path.js +10 -0
  33. package/dist/cjs/cli/utils/try-parse-json.d.ts +3 -0
  34. package/dist/cjs/cli/utils/try-parse-json.js +11 -0
  35. package/dist/esm/cli/commands/add.d.ts +2 -0
  36. package/dist/esm/cli/commands/add.js +236 -0
  37. package/dist/esm/cli/commands/build.d.ts +1 -1
  38. package/dist/esm/cli/commands/build.js +167 -41
  39. package/dist/esm/cli/commands/create.d.ts +2 -2
  40. package/dist/esm/cli/commands/create.js +66 -47
  41. package/dist/esm/cli/commands/helpers/copy-template.d.ts +4 -0
  42. package/dist/esm/cli/commands/helpers/copy-template.js +47 -0
  43. package/dist/esm/cli/commands/helpers/generate-bundle-entrypoint.d.ts +3 -0
  44. package/dist/esm/cli/commands/helpers/generate-bundle-entrypoint.js +18 -0
  45. package/dist/esm/cli/commands/helpers/get-extension-dev-deps.d.ts +4 -0
  46. package/dist/esm/cli/commands/helpers/get-extension-dev-deps.js +21 -0
  47. package/dist/esm/cli/commands/helpers/load-config.d.ts +3 -0
  48. package/dist/esm/cli/{utils → commands/helpers}/load-config.js +0 -0
  49. package/dist/esm/cli/commands/helpers/validate-cli-options.d.ts +4 -0
  50. package/dist/esm/cli/commands/helpers/validate-cli-options.js +34 -0
  51. package/dist/esm/cli/run.js +3 -1
  52. package/dist/esm/cli/types.d.ts +5 -5
  53. package/dist/esm/cli/utils/detect-json-indent.d.ts +2 -0
  54. package/dist/esm/cli/utils/detect-json-indent.js +11 -0
  55. package/dist/esm/cli/utils/get-package-manager-agent.d.ts +5 -0
  56. package/dist/esm/cli/utils/get-package-manager-agent.js +12 -0
  57. package/dist/esm/cli/utils/get-package-manager-agent.test.d.ts +2 -0
  58. package/dist/esm/cli/utils/get-package-manager-agent.test.js +19 -0
  59. package/dist/esm/cli/utils/get-package-manager.d.ts +5 -0
  60. package/dist/esm/cli/utils/get-package-manager.js +14 -0
  61. package/dist/esm/cli/utils/get-package-manager.test.d.ts +2 -0
  62. package/dist/esm/cli/utils/get-package-manager.test.js +37 -0
  63. package/dist/esm/cli/utils/get-sdk-version.d.ts +2 -0
  64. package/dist/esm/cli/utils/get-sdk-version.js +4 -0
  65. package/dist/esm/cli/utils/get-template-path.d.ts +2 -0
  66. package/dist/esm/cli/utils/get-template-path.js +4 -0
  67. package/dist/esm/cli/utils/try-parse-json.d.ts +3 -0
  68. package/dist/esm/cli/utils/try-parse-json.js +8 -0
  69. package/package.json +51 -21
  70. package/templates/common/{javascript → common/config}/_gitignore +0 -0
  71. package/templates/common/typescript/{tsconfig.json → config/tsconfig.json} +0 -0
  72. package/templates/display/javascript/{src → source}/display.vue +0 -0
  73. package/templates/display/javascript/{src → source}/index.js +0 -0
  74. package/templates/display/typescript/{src → source}/display.vue +0 -0
  75. package/templates/display/typescript/{src → source}/index.ts +0 -0
  76. package/templates/display/typescript/{src → source}/shims.d.ts +0 -0
  77. package/templates/endpoint/javascript/{src → source}/index.js +0 -0
  78. package/templates/endpoint/typescript/{src → source}/index.ts +0 -0
  79. package/templates/hook/javascript/{src → source}/index.js +0 -0
  80. package/templates/hook/typescript/{src → source}/index.ts +0 -0
  81. package/templates/interface/javascript/{src → source}/index.js +0 -0
  82. package/templates/interface/javascript/{src → source}/interface.vue +0 -0
  83. package/templates/interface/typescript/{src → source}/index.ts +0 -0
  84. package/templates/interface/typescript/{src → source}/interface.vue +0 -0
  85. package/templates/interface/typescript/{src → source}/shims.d.ts +0 -0
  86. package/templates/layout/javascript/{src → source}/index.js +0 -0
  87. package/templates/layout/javascript/{src → source}/layout.vue +0 -0
  88. package/templates/layout/typescript/{src → source}/index.ts +0 -0
  89. package/templates/layout/typescript/{src → source}/layout.vue +0 -0
  90. package/templates/layout/typescript/{src → source}/shims.d.ts +0 -0
  91. package/templates/module/javascript/{src → source}/index.js +0 -0
  92. package/templates/module/javascript/{src → source}/module.vue +0 -0
  93. package/templates/module/typescript/{src → source}/index.ts +0 -0
  94. package/templates/module/typescript/{src → source}/module.vue +0 -0
  95. package/templates/module/typescript/{src → source}/shims.d.ts +0 -0
  96. package/templates/operation/javascript/{src → source}/api.js +0 -0
  97. package/templates/operation/javascript/{src → source}/app.js +0 -0
  98. package/templates/operation/typescript/{src → source}/api.ts +0 -0
  99. package/templates/operation/typescript/{src → source}/app.ts +0 -0
  100. package/templates/operation/typescript/{src → source}/shims.d.ts +0 -0
  101. package/templates/panel/javascript/{src → source}/index.js +0 -0
  102. package/templates/panel/javascript/{src → source}/panel.vue +0 -0
  103. package/templates/panel/typescript/{src → source}/index.ts +0 -0
  104. package/templates/panel/typescript/{src → source}/panel.vue +0 -0
  105. package/templates/panel/typescript/{src → source}/shims.d.ts +0 -0
  106. package/.editorconfig +0 -12
  107. package/cli.d.ts +0 -1
  108. package/dist/cjs/cli/commands/build.d.ts.map +0 -1
  109. package/dist/cjs/cli/commands/create.d.ts.map +0 -1
  110. package/dist/cjs/cli/index.d.ts.map +0 -1
  111. package/dist/cjs/cli/run.d.ts.map +0 -1
  112. package/dist/cjs/cli/types.d.ts.map +0 -1
  113. package/dist/cjs/cli/utils/get-package-version.d.ts.map +0 -1
  114. package/dist/cjs/cli/utils/languages.d.ts.map +0 -1
  115. package/dist/cjs/cli/utils/load-config.d.ts +0 -3
  116. package/dist/cjs/cli/utils/load-config.d.ts.map +0 -1
  117. package/dist/cjs/cli/utils/logger.d.ts.map +0 -1
  118. package/dist/cjs/cli/utils/rename-map.d.ts +0 -2
  119. package/dist/cjs/cli/utils/rename-map.d.ts.map +0 -1
  120. package/dist/cjs/cli/utils/rename-map.js +0 -23
  121. package/dist/cjs/cli/utils/to-object.d.ts +0 -2
  122. package/dist/cjs/cli/utils/to-object.d.ts.map +0 -1
  123. package/dist/cjs/cli/utils/to-object.js +0 -17
  124. package/dist/cjs/index.d.ts.map +0 -1
  125. package/dist/esm/cli/commands/build.d.ts.map +0 -1
  126. package/dist/esm/cli/commands/create.d.ts.map +0 -1
  127. package/dist/esm/cli/index.d.ts.map +0 -1
  128. package/dist/esm/cli/run.d.ts.map +0 -1
  129. package/dist/esm/cli/types.d.ts.map +0 -1
  130. package/dist/esm/cli/utils/get-package-version.d.ts.map +0 -1
  131. package/dist/esm/cli/utils/languages.d.ts.map +0 -1
  132. package/dist/esm/cli/utils/load-config.d.ts +0 -3
  133. package/dist/esm/cli/utils/load-config.d.ts.map +0 -1
  134. package/dist/esm/cli/utils/logger.d.ts.map +0 -1
  135. package/dist/esm/cli/utils/rename-map.d.ts +0 -2
  136. package/dist/esm/cli/utils/rename-map.d.ts.map +0 -1
  137. package/dist/esm/cli/utils/rename-map.js +0 -17
  138. package/dist/esm/cli/utils/to-object.d.ts +0 -2
  139. package/dist/esm/cli/utils/to-object.d.ts.map +0 -1
  140. package/dist/esm/cli/utils/to-object.js +0 -14
  141. package/dist/esm/index.d.ts.map +0 -1
  142. package/src/cli/commands/build.ts +0 -493
  143. package/src/cli/commands/create.ts +0 -135
  144. package/src/cli/index.ts +0 -4
  145. package/src/cli/run.ts +0 -32
  146. package/src/cli/types.ts +0 -12
  147. package/src/cli/utils/get-package-version.ts +0 -9
  148. package/src/cli/utils/languages.ts +0 -26
  149. package/src/cli/utils/load-config.ts +0 -21
  150. package/src/cli/utils/logger.ts +0 -25
  151. package/src/cli/utils/rename-map.ts +0 -20
  152. package/src/cli/utils/to-object.ts +0 -16
  153. package/src/index.ts +0 -23
  154. package/templates/common/typescript/_gitignore +0 -3
  155. package/tsconfig.json +0 -30
@@ -12,15 +12,16 @@ const constants_1 = require("@directus/shared/constants");
12
12
  const utils_1 = require("@directus/shared/utils");
13
13
  const logger_1 = require("../utils/logger");
14
14
  const languages_1 = require("../utils/languages");
15
- const rename_map_1 = __importDefault(require("../utils/rename-map"));
16
- const get_package_version_1 = __importDefault(require("../utils/get-package-version"));
17
- const pkg = require('../../../../package.json');
18
- const TEMPLATE_PATH = path_1.default.resolve(__dirname, '../../../../templates');
15
+ const get_sdk_version_1 = __importDefault(require("../utils/get-sdk-version"));
16
+ const get_extension_dev_deps_1 = __importDefault(require("./helpers/get-extension-dev-deps"));
17
+ const copy_template_1 = __importDefault(require("./helpers/copy-template"));
18
+ const get_package_manager_1 = __importDefault(require("../utils/get-package-manager"));
19
19
  async function create(type, name, options) {
20
+ var _a;
20
21
  const targetDir = name.substring(name.lastIndexOf('/') + 1);
21
22
  const targetPath = path_1.default.resolve(targetDir);
22
- if (!(0, utils_1.isIn)(type, constants_1.EXTENSION_TYPES)) {
23
- (0, logger_1.log)(`Extension type ${chalk_1.default.bold(type)} is not supported. Available extension types: ${constants_1.EXTENSION_TYPES.map((t) => chalk_1.default.bold.magenta(t)).join(', ')}.`, 'error');
23
+ if (!(0, utils_1.isIn)(type, constants_1.EXTENSION_PACKAGE_TYPES)) {
24
+ (0, logger_1.log)(`Extension type ${chalk_1.default.bold(type)} is not supported. Available extension types: ${constants_1.EXTENSION_PACKAGE_TYPES.map((t) => chalk_1.default.bold.magenta(t)).join(', ')}.`, 'error');
24
25
  process.exit(1);
25
26
  }
26
27
  if (targetDir.length === 0) {
@@ -39,61 +40,79 @@ async function create(type, name, options) {
39
40
  process.exit(1);
40
41
  }
41
42
  }
42
- if (!(0, languages_1.isLanguage)(options.language)) {
43
- (0, logger_1.log)(`Language ${chalk_1.default.bold(options.language)} is not supported. Available languages: ${constants_1.EXTENSION_LANGUAGES.map((t) => chalk_1.default.bold.magenta(t)).join(', ')}.`, 'error');
43
+ if ((0, utils_1.isIn)(type, constants_1.PACKAGE_EXTENSION_TYPES)) {
44
+ await createPackageExtension({ type, name, targetDir, targetPath });
45
+ }
46
+ else {
47
+ const language = (_a = options.language) !== null && _a !== void 0 ? _a : 'javascript';
48
+ await createLocalExtension({ type, name, targetDir, targetPath, language });
49
+ }
50
+ }
51
+ exports.default = create;
52
+ async function createPackageExtension({ type, name, targetDir, targetPath, }) {
53
+ const spinner = (0, ora_1.default)(chalk_1.default.bold('Scaffolding Directus extension...')).start();
54
+ await fs_extra_1.default.ensureDir(targetPath);
55
+ await (0, copy_template_1.default)(type, targetPath);
56
+ const host = `^${(0, get_sdk_version_1.default)()}`;
57
+ const options = type === 'bundle' ? { type, path: { app: 'dist/app.js', api: 'dist/api.js' }, entries: [], host } : { type, host };
58
+ const packageManifest = getPackageManifest(name, options, await (0, get_extension_dev_deps_1.default)(type));
59
+ await fs_extra_1.default.writeJSON(path_1.default.join(targetPath, 'package.json'), packageManifest, { spaces: '\t' });
60
+ const packageManager = (0, get_package_manager_1.default)();
61
+ await (0, execa_1.default)(packageManager, ['install'], { cwd: targetPath });
62
+ spinner.succeed(chalk_1.default.bold('Done'));
63
+ (0, logger_1.log)(getDoneMessage(type, targetDir, targetPath, packageManager));
64
+ }
65
+ async function createLocalExtension({ type, name, targetDir, targetPath, language, }) {
66
+ if (!(0, languages_1.isLanguage)(language)) {
67
+ (0, logger_1.log)(`Language ${chalk_1.default.bold(language)} is not supported. Available languages: ${constants_1.EXTENSION_LANGUAGES.map((t) => chalk_1.default.bold.magenta(t)).join(', ')}.`, 'error');
44
68
  process.exit(1);
45
69
  }
46
70
  const spinner = (0, ora_1.default)(chalk_1.default.bold('Scaffolding Directus extension...')).start();
47
71
  await fs_extra_1.default.ensureDir(targetPath);
48
- await fs_extra_1.default.copy(path_1.default.join(TEMPLATE_PATH, 'common', options.language), targetPath);
49
- await fs_extra_1.default.copy(path_1.default.join(TEMPLATE_PATH, type, options.language), targetPath);
50
- await (0, rename_map_1.default)(targetPath, (name) => (name.startsWith('_') ? `.${name.substring(1)}` : null));
51
- const entryPath = (0, utils_1.isIn)(type, constants_1.HYBRID_EXTENSION_TYPES) ? { app: 'dist/app.js', api: 'dist/api.js' } : 'dist/index.js';
52
- const sourcePath = (0, utils_1.isIn)(type, constants_1.HYBRID_EXTENSION_TYPES)
53
- ? { app: `src/app.${(0, languages_1.languageToShort)(options.language)}`, api: `src/api.${(0, languages_1.languageToShort)(options.language)}` }
54
- : `src/index.${(0, languages_1.languageToShort)(options.language)}`;
55
- const packageManifest = {
72
+ await (0, copy_template_1.default)(type, targetPath, 'src', language);
73
+ const host = `^${(0, get_sdk_version_1.default)()}`;
74
+ const options = (0, utils_1.isIn)(type, constants_1.HYBRID_EXTENSION_TYPES)
75
+ ? {
76
+ type,
77
+ path: { app: 'dist/app.js', api: 'dist/api.js' },
78
+ source: { app: `src/app.${(0, languages_1.languageToShort)(language)}`, api: `src/api.${(0, languages_1.languageToShort)(language)}` },
79
+ host,
80
+ }
81
+ : {
82
+ type,
83
+ path: 'dist/index.js',
84
+ source: `src/index.${(0, languages_1.languageToShort)(language)}`,
85
+ host,
86
+ };
87
+ const packageManifest = getPackageManifest(name, options, await (0, get_extension_dev_deps_1.default)(type, language));
88
+ await fs_extra_1.default.writeJSON(path_1.default.join(targetPath, 'package.json'), packageManifest, { spaces: '\t' });
89
+ const packageManager = (0, get_package_manager_1.default)();
90
+ await (0, execa_1.default)(packageManager, ['install'], { cwd: targetPath });
91
+ spinner.succeed(chalk_1.default.bold('Done'));
92
+ (0, logger_1.log)(getDoneMessage(type, targetDir, targetPath, packageManager));
93
+ }
94
+ function getPackageManifest(name, options, deps) {
95
+ return {
56
96
  name: constants_1.EXTENSION_NAME_REGEX.test(name) ? name : `directus-extension-${name}`,
57
97
  version: '1.0.0',
58
- keywords: ['directus', 'directus-extension', `directus-custom-${type}`],
59
- [constants_1.EXTENSION_PKG_KEY]: {
60
- type,
61
- path: entryPath,
62
- source: sourcePath,
63
- host: `^${pkg.version}`,
64
- },
98
+ keywords: ['directus', 'directus-extension', `directus-custom-${options.type}`],
99
+ [constants_1.EXTENSION_PKG_KEY]: options,
65
100
  scripts: {
66
101
  build: 'directus-extension build',
67
102
  dev: 'directus-extension build -w --no-minify',
68
103
  },
69
- devDependencies: await getPackageDeps(type, options.language),
104
+ devDependencies: deps,
70
105
  };
71
- await fs_extra_1.default.writeJSON(path_1.default.join(targetPath, 'package.json'), packageManifest, { spaces: '\t' });
72
- await (0, execa_1.default)('npm', ['install'], { cwd: targetPath });
73
- spinner.succeed(chalk_1.default.bold('Done'));
74
- (0, logger_1.log)(`
106
+ }
107
+ function getDoneMessage(type, targetDir, targetPath, packageManager) {
108
+ return `
75
109
  Your ${type} extension has been created at ${chalk_1.default.green(targetPath)}
76
110
 
77
111
  To start developing, run:
78
- ${chalk_1.default.blue('cd')} ${targetDir}
79
- ${chalk_1.default.blue('npm run')} dev
112
+ ${chalk_1.default.blue('cd')} ${targetDir}
113
+ ${chalk_1.default.blue(`${packageManager} run`)} dev
80
114
 
81
115
  and then to build for production, run:
82
- ${chalk_1.default.blue('npm run')} build
83
- `);
84
- }
85
- exports.default = create;
86
- async function getPackageDeps(type, language) {
87
- return {
88
- '@directus/extensions-sdk': pkg.version,
89
- ...(language === 'typescript'
90
- ? {
91
- ...((0, utils_1.isIn)(type, constants_1.API_OR_HYBRID_EXTENSION_TYPES)
92
- ? { '@types/node': `^${await (0, get_package_version_1.default)('@types/node')}` }
93
- : {}),
94
- typescript: `^${await (0, get_package_version_1.default)('typescript')}`,
95
- }
96
- : {}),
97
- ...((0, utils_1.isIn)(type, constants_1.APP_OR_HYBRID_EXTENSION_TYPES) ? { vue: `^${await (0, get_package_version_1.default)('vue')}` } : {}),
98
- };
116
+ ${chalk_1.default.blue(`${packageManager} run`)} build
117
+ `;
99
118
  }
@@ -0,0 +1,4 @@
1
+ import { ExtensionPackageType } from '@directus/shared/types';
2
+ import { Language } from '../../types';
3
+ export default function copyTemplate(type: ExtensionPackageType, extensionPath: string, sourcePath?: string, language?: Language): Promise<void>;
4
+ //# sourceMappingURL=copy-template.d.ts.map
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const get_template_path_1 = __importDefault(require("../../utils/get-template-path"));
9
+ async function copyTemplateFile(templateFile, extensionPath, sourcePath) {
10
+ if (sourcePath !== undefined) {
11
+ const oldName = path_1.default.basename(templateFile.path);
12
+ const newName = oldName.startsWith('_') ? `.${oldName.substring(1)}` : oldName;
13
+ const targetPath = templateFile.type === 'config'
14
+ ? path_1.default.join(extensionPath, newName)
15
+ : path_1.default.resolve(extensionPath, sourcePath, newName);
16
+ await fs_extra_1.default.copy(templateFile.path, targetPath, { overwrite: false });
17
+ }
18
+ }
19
+ async function getFilesInDir(templatePath) {
20
+ if (!(await fs_extra_1.default.pathExists(templatePath)))
21
+ return [];
22
+ const files = await fs_extra_1.default.readdir(templatePath);
23
+ return files.map((file) => path_1.default.join(templatePath, file));
24
+ }
25
+ async function getLanguageTemplateFiles(templateLanguagePath) {
26
+ const [configFiles, sourceFiles] = await Promise.all([
27
+ getFilesInDir(path_1.default.join(templateLanguagePath, 'config')),
28
+ getFilesInDir(path_1.default.join(templateLanguagePath, 'source')),
29
+ ]);
30
+ const configTemplateFiles = configFiles.map((file) => ({ type: 'config', path: file }));
31
+ const sourceTemplateFiles = sourceFiles.map((file) => ({ type: 'source', path: file }));
32
+ return [...configTemplateFiles, ...sourceTemplateFiles];
33
+ }
34
+ async function getTypeTemplateFiles(templateTypePath, language) {
35
+ const [commonTemplateFiles, languageTemplateFiles] = await Promise.all([
36
+ getLanguageTemplateFiles(path_1.default.join(templateTypePath, 'common')),
37
+ language ? getLanguageTemplateFiles(path_1.default.join(templateTypePath, language)) : null,
38
+ ]);
39
+ return [...commonTemplateFiles, ...(languageTemplateFiles ? languageTemplateFiles : [])];
40
+ }
41
+ async function getTemplateFiles(type, language) {
42
+ const templatePath = (0, get_template_path_1.default)();
43
+ const [commonTemplateFiles, typeTemplateFiles] = await Promise.all([
44
+ getTypeTemplateFiles(path_1.default.join(templatePath, 'common'), language),
45
+ getTypeTemplateFiles(path_1.default.join(templatePath, type), language),
46
+ ]);
47
+ return [...commonTemplateFiles, ...typeTemplateFiles];
48
+ }
49
+ async function copyTemplate(type, extensionPath, sourcePath, language) {
50
+ const templateFiles = await getTemplateFiles(type, language);
51
+ await Promise.all(templateFiles.map((templateFile) => copyTemplateFile(templateFile, extensionPath, sourcePath)));
52
+ }
53
+ exports.default = copyTemplate;
@@ -0,0 +1,3 @@
1
+ import { ExtensionOptionsBundleEntry } from '@directus/shared/types';
2
+ export default function generateBundleEntrypoint(mode: 'app' | 'api', entries: ExtensionOptionsBundleEntry[]): string;
3
+ //# sourceMappingURL=generate-bundle-entrypoint.d.ts.map
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ const constants_1 = require("@directus/shared/constants");
8
+ const utils_1 = require("@directus/shared/utils");
9
+ const node_1 = require("@directus/shared/utils/node");
10
+ function generateBundleEntrypoint(mode, entries) {
11
+ const types = mode === 'app' ? constants_1.APP_OR_HYBRID_EXTENSION_TYPES : constants_1.API_OR_HYBRID_EXTENSION_TYPES;
12
+ const entriesForTypes = entries.filter((entry) => (0, utils_1.isIn)(entry.type, types));
13
+ const imports = entriesForTypes.map((entry, i) => `import e${i} from './${(0, node_1.pathToRelativeUrl)(path_1.default.resolve((0, utils_1.isTypeIn)(entry, constants_1.HYBRID_EXTENSION_TYPES)
14
+ ? mode === 'app'
15
+ ? entry.source.app
16
+ : entry.source.api
17
+ : entry.source))}';`);
18
+ const exports = types.map((type) => `export const ${(0, utils_1.pluralize)(type)} = [${entriesForTypes
19
+ .map((entry, i) => entry.type === type ? (mode === 'app' ? `e${i}` : `{name:'${entry.name}',config:e${i}}`) : null)
20
+ .filter((e) => e !== null)
21
+ .join(',')}];`);
22
+ return `${imports.join('')}${exports.join('')}`;
23
+ }
24
+ exports.default = generateBundleEntrypoint;
@@ -0,0 +1,4 @@
1
+ import { ExtensionPackageType } from '@directus/shared/types';
2
+ import { Language } from '../../types';
3
+ export default function getExtensionDevDeps(type: ExtensionPackageType | ExtensionPackageType[], language?: Language | Language[]): Promise<Record<string, string>>;
4
+ //# sourceMappingURL=get-extension-dev-deps.d.ts.map
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const constants_1 = require("@directus/shared/constants");
7
+ const utils_1 = require("@directus/shared/utils");
8
+ const get_package_version_1 = __importDefault(require("../../utils/get-package-version"));
9
+ const get_sdk_version_1 = __importDefault(require("../../utils/get-sdk-version"));
10
+ async function getExtensionDevDeps(type, language = []) {
11
+ const types = Array.isArray(type) ? type : [type];
12
+ const languages = Array.isArray(language) ? language : [language];
13
+ const deps = {
14
+ '@directus/extensions-sdk': (0, get_sdk_version_1.default)(),
15
+ };
16
+ if (languages.includes('typescript')) {
17
+ if (types.some((type) => (0, utils_1.isIn)(type, constants_1.API_OR_HYBRID_EXTENSION_TYPES))) {
18
+ deps['@types/node'] = `^${await (0, get_package_version_1.default)('@types/node')}`;
19
+ }
20
+ deps['typescript'] = `^${await (0, get_package_version_1.default)('typescript')}`;
21
+ }
22
+ if (types.some((type) => (0, utils_1.isIn)(type, constants_1.APP_OR_HYBRID_EXTENSION_TYPES))) {
23
+ deps['vue'] = `^${await (0, get_package_version_1.default)('vue')}`;
24
+ }
25
+ return deps;
26
+ }
27
+ exports.default = getExtensionDevDeps;
@@ -0,0 +1,3 @@
1
+ import { Config } from '../../types';
2
+ export default function loadConfig(): Promise<Config>;
3
+ //# sourceMappingURL=load-config.d.ts.map
@@ -0,0 +1,4 @@
1
+ import { ExtensionOptionsBundleEntry, JsonValue, SplitEntrypoint } from '@directus/shared/types';
2
+ export declare function validateSplitEntrypointOption(option: JsonValue | undefined): option is SplitEntrypoint;
3
+ export declare function validateBundleEntriesOption(option: JsonValue | undefined): option is ExtensionOptionsBundleEntry[];
4
+ //# sourceMappingURL=validate-cli-options.d.ts.map
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateBundleEntriesOption = exports.validateSplitEntrypointOption = void 0;
4
+ const utils_1 = require("@directus/shared/utils");
5
+ function validateNonPrimitive(value) {
6
+ if (value === undefined ||
7
+ value === null ||
8
+ typeof value === 'string' ||
9
+ typeof value === 'number' ||
10
+ typeof value === 'boolean') {
11
+ return false;
12
+ }
13
+ return true;
14
+ }
15
+ function validateSplitEntrypointOption(option) {
16
+ if (!validateNonPrimitive(option) || Array.isArray(option)) {
17
+ return false;
18
+ }
19
+ if (!option.app || !option.api) {
20
+ return false;
21
+ }
22
+ return true;
23
+ }
24
+ exports.validateSplitEntrypointOption = validateSplitEntrypointOption;
25
+ function validateBundleEntriesOption(option) {
26
+ if (!validateNonPrimitive(option) || !Array.isArray(option)) {
27
+ return false;
28
+ }
29
+ if (!option.every((entry) => {
30
+ if (!validateNonPrimitive(entry) || Array.isArray(entry)) {
31
+ return false;
32
+ }
33
+ return (0, utils_1.validateExtensionOptionsBundleEntry)(entry);
34
+ })) {
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+ exports.validateBundleEntriesOption = validateBundleEntriesOption;
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const commander_1 = require("commander");
7
7
  const create_1 = __importDefault(require("./commands/create"));
8
+ const add_1 = __importDefault(require("./commands/add"));
8
9
  const build_1 = __importDefault(require("./commands/build"));
9
10
  const pkg = require('../../../package.json');
10
11
  const program = new commander_1.Command();
@@ -14,8 +15,9 @@ program
14
15
  .command('create')
15
16
  .arguments('<type> <name>')
16
17
  .description('Scaffold a new Directus extension')
17
- .option('-l, --language <language>', 'specify the language to use', 'javascript')
18
+ .option('-l, --language <language>', 'specify the language to use')
18
19
  .action(create_1.default);
20
+ program.command('add').description('Add entries to an existing Directus extension').action(add_1.default);
19
21
  program
20
22
  .command('build')
21
23
  .description('Bundle a Directus extension to a single entrypoint')
@@ -1,13 +1,13 @@
1
1
  import { EXTENSION_LANGUAGES } from '@directus/shared/constants';
2
2
  import { Plugin, RollupOptions, OutputOptions as RollupOutputOptions } from 'rollup';
3
- export declare type Language = typeof EXTENSION_LANGUAGES[number];
4
- export declare type LanguageShort = 'js' | 'ts';
5
- export declare type Config = {
3
+ export type Language = typeof EXTENSION_LANGUAGES[number];
4
+ export type LanguageShort = 'js' | 'ts';
5
+ export type Config = {
6
6
  plugins?: Plugin[];
7
7
  };
8
- export declare type RollupConfig = {
8
+ export type RollupConfig = {
9
9
  rollupOptions: RollupOptions;
10
10
  rollupOutputOptions: RollupOutputOptions;
11
11
  };
12
- export declare type RollupMode = 'browser' | 'node';
12
+ export type RollupMode = 'browser' | 'node';
13
13
  //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,2 @@
1
+ export default function detectJsonIndent(json: string): string | null;
2
+ //# sourceMappingURL=detect-json-indent.d.ts.map
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function detectJsonIndent(json) {
4
+ var _a;
5
+ const lines = json.split(/\r?\n/);
6
+ const braceLine = lines.findIndex((line) => /^(?:\{|\[)/.test(line));
7
+ if (braceLine === -1 || braceLine + 1 > lines.length - 1)
8
+ return null;
9
+ const indent = (_a = lines[braceLine + 1].match(/[ \t]+/)) === null || _a === void 0 ? void 0 : _a[0];
10
+ if (indent === undefined)
11
+ return null;
12
+ return indent;
13
+ }
14
+ exports.default = detectJsonIndent;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Extract the npm user agent from the npm_config_user_agent environment variable string
3
+ */
4
+ export default function getPackageManagerAgent(): Record<string, string> | null;
5
+ //# sourceMappingURL=get-package-manager-agent.d.ts.map
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Extract the npm user agent from the npm_config_user_agent environment variable string
5
+ */
6
+ function getPackageManagerAgent() {
7
+ const userAgent = process.env.npm_config_user_agent;
8
+ if (!userAgent)
9
+ return null;
10
+ const values = userAgent.split(' ');
11
+ const fields = values.filter((field) => field.includes('/'));
12
+ const [platform, arch] = values.filter((field) => !field.includes('/'));
13
+ return Object.fromEntries(fields.map((field) => field.split('/')).concat([['os', `${platform} (${arch})`]]));
14
+ }
15
+ exports.default = getPackageManagerAgent;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=get-package-manager-agent.test.d.ts.map
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const get_package_manager_agent_1 = __importDefault(require("./get-package-manager-agent"));
8
+ const envCopy = { ...process.env };
9
+ (0, vitest_1.afterEach)(() => {
10
+ process.env = envCopy;
11
+ });
12
+ (0, vitest_1.test)('Returns null if user agent cannot be extracted from env', () => {
13
+ delete process.env.npm_config_user_agent;
14
+ (0, vitest_1.expect)((0, get_package_manager_agent_1.default)()).toBe(null);
15
+ });
16
+ (0, vitest_1.test)('Returns information object from parsed user agent', () => {
17
+ process.env.npm_config_user_agent = 'pnpm/7.16.0 npm/? node/v18.12.1 darwin arm64';
18
+ (0, vitest_1.expect)((0, get_package_manager_agent_1.default)()).toStrictEqual({
19
+ node: 'v18.12.1',
20
+ npm: '?',
21
+ os: 'darwin (arm64)',
22
+ pnpm: '7.16.0',
23
+ });
24
+ });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Determine whether to use pnpm, yarn, or npm based on the parsed package manager agent info
3
+ */
4
+ export default function getPackageManager(): string;
5
+ //# sourceMappingURL=get-package-manager.d.ts.map
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const get_package_manager_agent_1 = __importDefault(require("./get-package-manager-agent"));
7
+ /**
8
+ * Determine whether to use pnpm, yarn, or npm based on the parsed package manager agent info
9
+ */
10
+ function getPackageManager() {
11
+ const agent = (0, get_package_manager_agent_1.default)();
12
+ if (agent !== null) {
13
+ if ('pnpm' in agent && agent.pnpm !== '?')
14
+ return 'pnpm';
15
+ if ('yarn' in agent && agent.yarn !== '?')
16
+ return 'yarn';
17
+ }
18
+ return 'npm';
19
+ }
20
+ exports.default = getPackageManager;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=get-package-manager.test.d.ts.map
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const get_package_manager_agent_1 = __importDefault(require("./get-package-manager-agent"));
8
+ const get_package_manager_1 = __importDefault(require("./get-package-manager"));
9
+ vitest_1.vi.mock('./get-package-manager-agent');
10
+ (0, vitest_1.afterEach)(() => {
11
+ vitest_1.vi.clearAllMocks();
12
+ });
13
+ (0, vitest_1.test)('Returns npm is agent data is unavailable', () => {
14
+ vitest_1.vi.mocked(get_package_manager_agent_1.default).mockReturnValueOnce(null);
15
+ (0, vitest_1.expect)((0, get_package_manager_1.default)()).toBe('npm');
16
+ });
17
+ (0, vitest_1.test)('Returns pnpm if pnpm exists in agent and is not ?', () => {
18
+ vitest_1.vi.mocked(get_package_manager_agent_1.default).mockReturnValueOnce({
19
+ node: 'v18.12.1',
20
+ npm: '?',
21
+ os: 'darwin (arm64)',
22
+ pnpm: '7.16.0',
23
+ });
24
+ (0, vitest_1.expect)((0, get_package_manager_1.default)()).toBe('pnpm');
25
+ });
26
+ (0, vitest_1.test)('Returns yarn if yarn exists in agent and is not ?', () => {
27
+ vitest_1.vi.mocked(get_package_manager_agent_1.default).mockReturnValueOnce({
28
+ node: 'v18.12.1',
29
+ npm: '?',
30
+ os: 'darwin (arm64)',
31
+ yarn: '2',
32
+ });
33
+ (0, vitest_1.expect)((0, get_package_manager_1.default)()).toBe('yarn');
34
+ });
35
+ (0, vitest_1.test)('Returns npm is neither pnpm or yarn exist', () => {
36
+ vitest_1.vi.mocked(get_package_manager_agent_1.default).mockReturnValueOnce({
37
+ node: 'v18.12.1',
38
+ npm: '8.19.2',
39
+ os: 'darwin (arm64)',
40
+ });
41
+ (0, vitest_1.expect)((0, get_package_manager_1.default)()).toBe('npm');
42
+ });
@@ -0,0 +1,2 @@
1
+ export default function getSdkVersion(): string;
2
+ //# sourceMappingURL=get-sdk-version.d.ts.map
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function getSdkVersion() {
4
+ const pkg = require('../../../../package.json');
5
+ return pkg.version;
6
+ }
7
+ exports.default = getSdkVersion;
@@ -0,0 +1,2 @@
1
+ export default function getTemplatePath(): string;
2
+ //# sourceMappingURL=get-template-path.d.ts.map
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const path_1 = __importDefault(require("path"));
7
+ function getTemplatePath() {
8
+ return path_1.default.resolve(__dirname, '..', '..', '..', '..', 'templates');
9
+ }
10
+ exports.default = getTemplatePath;
@@ -0,0 +1,3 @@
1
+ import { JsonValue } from '@directus/shared/types';
2
+ export default function tryParseJson(str: string): JsonValue | undefined;
3
+ //# sourceMappingURL=try-parse-json.d.ts.map
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function tryParseJson(str) {
4
+ try {
5
+ return JSON.parse(str);
6
+ }
7
+ catch {
8
+ return undefined;
9
+ }
10
+ }
11
+ exports.default = tryParseJson;
@@ -0,0 +1,2 @@
1
+ export default function add(): Promise<void>;
2
+ //# sourceMappingURL=add.d.ts.map