directus-template-cli 0.7.0-beta.3 → 0.7.0-beta.5
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/bin/dev +2 -3
- package/bin/dev.js +3 -0
- package/bin/run +0 -1
- package/bin/run.js +5 -0
- package/dist/commands/apply.d.ts +17 -17
- package/dist/commands/apply.js +160 -173
- package/dist/commands/extract.d.ts +13 -7
- package/dist/commands/extract.js +89 -73
- package/dist/commands/init.d.ts +7 -7
- package/dist/commands/init.js +78 -80
- package/dist/flags/common.d.ts +7 -7
- package/dist/flags/common.js +8 -11
- package/dist/index.js +1 -5
- package/dist/lib/constants.js +6 -9
- package/dist/lib/extract/extract-access.js +11 -15
- package/dist/lib/extract/extract-assets.js +20 -25
- package/dist/lib/extract/extract-collections.js +12 -16
- package/dist/lib/extract/extract-content.js +14 -19
- package/dist/lib/extract/extract-dashboards.js +22 -28
- package/dist/lib/extract/extract-extensions.js +12 -16
- package/dist/lib/extract/extract-fields.js +13 -17
- package/dist/lib/extract/extract-files.js +15 -19
- package/dist/lib/extract/extract-flows.js +22 -28
- package/dist/lib/extract/extract-folders.js +15 -19
- package/dist/lib/extract/extract-permissions.js +12 -16
- package/dist/lib/extract/extract-policies.js +12 -16
- package/dist/lib/extract/extract-presets.js +12 -16
- package/dist/lib/extract/extract-relations.js +14 -18
- package/dist/lib/extract/extract-roles.js +15 -19
- package/dist/lib/extract/extract-schema.js +17 -21
- package/dist/lib/extract/extract-settings.js +12 -16
- package/dist/lib/extract/extract-translations.js +12 -16
- package/dist/lib/extract/extract-users.js +15 -19
- package/dist/lib/extract/index.js +47 -51
- package/dist/lib/init/config.d.ts +1 -1
- package/dist/lib/init/config.js +2 -5
- package/dist/lib/init/index.js +54 -59
- package/dist/lib/init/types.js +1 -2
- package/dist/lib/init.d.ts +1 -0
- package/dist/lib/init.js +2 -0
- package/dist/lib/load/apply-flags.js +17 -23
- package/dist/lib/load/index.js +40 -44
- package/dist/lib/load/load-access.js +15 -20
- package/dist/lib/load/load-collections.js +27 -32
- package/dist/lib/load/load-dashboards.js +19 -25
- package/dist/lib/load/load-data.js +43 -49
- package/dist/lib/load/load-extensions.js +30 -38
- package/dist/lib/load/load-files.js +20 -24
- package/dist/lib/load/load-flows.js +23 -29
- package/dist/lib/load/load-folders.js +16 -20
- package/dist/lib/load/load-permissions.js +13 -17
- package/dist/lib/load/load-policies.js +14 -18
- package/dist/lib/load/load-presets.js +14 -18
- package/dist/lib/load/load-relations.d.ts +2 -0
- package/dist/lib/load/load-relations.js +16 -18
- package/dist/lib/load/load-roles.js +19 -23
- package/dist/lib/load/load-settings.js +18 -21
- package/dist/lib/load/load-translations.js +14 -18
- package/dist/lib/load/load-users.js +21 -25
- package/dist/lib/load/update-required-fields.js +13 -17
- package/dist/lib/sdk.d.ts +1 -2
- package/dist/lib/sdk.js +27 -27
- package/dist/lib/types/extension.js +1 -2
- package/dist/lib/utils/animated-bunny.js +9 -14
- package/dist/lib/utils/auth.d.ts +2 -2
- package/dist/lib/utils/auth.js +32 -33
- package/dist/lib/utils/catch-error.js +8 -11
- package/dist/lib/utils/check-template.js +4 -8
- package/dist/lib/utils/chunk-array.js +1 -5
- package/dist/lib/utils/ensure-dir.js +7 -12
- package/dist/lib/utils/filter-fields.js +1 -4
- package/dist/lib/utils/get-role-ids.d.ts +1 -1
- package/dist/lib/utils/get-role-ids.js +7 -12
- package/dist/lib/utils/get-template.js +33 -37
- package/dist/lib/utils/logger.js +11 -13
- package/dist/lib/utils/open-url.js +5 -8
- package/dist/lib/utils/parse-github-url.js +4 -9
- package/dist/lib/utils/path.js +6 -10
- package/dist/lib/utils/protected-domains.js +1 -4
- package/dist/lib/utils/read-file.js +8 -12
- package/dist/lib/utils/read-templates.js +9 -15
- package/dist/lib/utils/system-fields.js +19 -22
- package/dist/lib/utils/template-defaults.d.ts +1 -1
- package/dist/lib/utils/template-defaults.js +5 -14
- package/dist/lib/utils/transform-github-url.js +1 -5
- package/dist/lib/utils/validate-url.js +3 -6
- package/dist/lib/utils/wait.js +1 -5
- package/dist/lib/utils/write-to-file.js +8 -11
- package/dist/services/docker.js +19 -24
- package/dist/services/github.d.ts +1 -1
- package/dist/services/github.js +8 -12
- package/oclif.manifest.json +4 -4
- package/package.json +36 -32
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const sdk_2 = require("../sdk");
|
|
8
|
-
const catch_error_1 = tslib_1.__importDefault(require("../utils/catch-error"));
|
|
9
|
-
const write_to_file_1 = tslib_1.__importDefault(require("../utils/write-to-file"));
|
|
1
|
+
import { readFields, readRelations } from '@directus/sdk';
|
|
2
|
+
import { ux } from '@oclif/core';
|
|
3
|
+
import { DIRECTUS_PINK } from '../constants.js';
|
|
4
|
+
import { api } from '../sdk.js';
|
|
5
|
+
import catchError from '../utils/catch-error.js';
|
|
6
|
+
import writeToFile from '../utils/write-to-file.js';
|
|
10
7
|
/**
|
|
11
8
|
* Extract relations from the Directus instance
|
|
12
9
|
*/
|
|
13
|
-
async function extractRelations(dir) {
|
|
14
|
-
|
|
10
|
+
export default async function extractRelations(dir) {
|
|
11
|
+
ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting relations'));
|
|
15
12
|
try {
|
|
16
|
-
const response = await
|
|
13
|
+
const response = await api.client.request(readRelations());
|
|
17
14
|
// Fetching fields to filter out system fields while retaining custom fields on system collections
|
|
18
|
-
const fields = await
|
|
19
|
-
const customFields = fields.filter((i) =>
|
|
15
|
+
const fields = await api.client.request(readFields());
|
|
16
|
+
const customFields = fields.filter((i) => !i.meta?.system);
|
|
20
17
|
const relations = response
|
|
21
18
|
// Filter out relations where the collection starts with 'directus_' && the field is not within the customFields array
|
|
22
19
|
.filter((i) => !i.collection.startsWith('directus_', 0)
|
|
@@ -25,11 +22,10 @@ async function extractRelations(dir) {
|
|
|
25
22
|
delete i.meta.id;
|
|
26
23
|
return i;
|
|
27
24
|
});
|
|
28
|
-
await (
|
|
25
|
+
await writeToFile('relations', relations, dir);
|
|
29
26
|
}
|
|
30
27
|
catch (error) {
|
|
31
|
-
(
|
|
28
|
+
catchError(error);
|
|
32
29
|
}
|
|
33
|
-
|
|
30
|
+
ux.action.stop();
|
|
34
31
|
}
|
|
35
|
-
exports.default = extractRelations;
|
|
@@ -1,27 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const filter_fields_1 = tslib_1.__importDefault(require("../utils/filter-fields"));
|
|
10
|
-
const system_fields_1 = require("../utils/system-fields");
|
|
11
|
-
const write_to_file_1 = tslib_1.__importDefault(require("../utils/write-to-file"));
|
|
1
|
+
import { readRoles } from '@directus/sdk';
|
|
2
|
+
import { ux } from '@oclif/core';
|
|
3
|
+
import { DIRECTUS_PINK } from '../constants.js';
|
|
4
|
+
import { api } from '../sdk.js';
|
|
5
|
+
import catchError from '../utils/catch-error.js';
|
|
6
|
+
import filterFields from '../utils/filter-fields.js';
|
|
7
|
+
import { directusRoleFields } from '../utils/system-fields.js';
|
|
8
|
+
import writeToFile from '../utils/write-to-file.js';
|
|
12
9
|
/**
|
|
13
10
|
* Extract roles from the API
|
|
14
11
|
*/
|
|
15
|
-
async function extractRoles(dir) {
|
|
16
|
-
|
|
12
|
+
export default async function extractRoles(dir) {
|
|
13
|
+
ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting roles'));
|
|
17
14
|
try {
|
|
18
|
-
const response = await
|
|
19
|
-
const roles = (
|
|
20
|
-
await (
|
|
15
|
+
const response = await api.client.request(readRoles({ limit: -1 }));
|
|
16
|
+
const roles = filterFields(response, directusRoleFields);
|
|
17
|
+
await writeToFile('roles', roles, dir);
|
|
21
18
|
}
|
|
22
19
|
catch (error) {
|
|
23
|
-
(
|
|
20
|
+
catchError(error);
|
|
24
21
|
}
|
|
25
|
-
|
|
22
|
+
ux.action.stop();
|
|
26
23
|
}
|
|
27
|
-
exports.default = extractRoles;
|
|
@@ -1,27 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const write_to_file_1 = tslib_1.__importDefault(require("../utils/write-to-file"));
|
|
12
|
-
async function extractSchema(dir) {
|
|
13
|
-
core_1.ux.action.start(core_1.ux.colorize(constants_1.DIRECTUS_PINK, 'Extracting schema snapshot'));
|
|
1
|
+
import { schemaSnapshot } from '@directus/sdk';
|
|
2
|
+
import { ux } from '@oclif/core';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'pathe';
|
|
5
|
+
import { DIRECTUS_PINK } from '../constants.js';
|
|
6
|
+
import { api } from '../sdk.js';
|
|
7
|
+
import catchError from '../utils/catch-error.js';
|
|
8
|
+
import writeToFile from '../utils/write-to-file.js';
|
|
9
|
+
export default async function extractSchema(dir) {
|
|
10
|
+
ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting schema snapshot'));
|
|
14
11
|
try {
|
|
15
|
-
const schemaDir =
|
|
16
|
-
if (!
|
|
17
|
-
|
|
12
|
+
const schemaDir = path.join(dir, 'schema');
|
|
13
|
+
if (!fs.existsSync(schemaDir)) {
|
|
14
|
+
fs.mkdirSync(schemaDir, { recursive: true });
|
|
18
15
|
}
|
|
19
|
-
const schema = await
|
|
20
|
-
await (
|
|
16
|
+
const schema = await api.client.request(schemaSnapshot());
|
|
17
|
+
await writeToFile('schema/snapshot', schema, dir);
|
|
21
18
|
}
|
|
22
19
|
catch (error) {
|
|
23
|
-
(
|
|
20
|
+
catchError(error);
|
|
24
21
|
}
|
|
25
|
-
|
|
22
|
+
ux.action.stop();
|
|
26
23
|
}
|
|
27
|
-
exports.default = extractSchema;
|
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const sdk_2 = require("../sdk");
|
|
8
|
-
const catch_error_1 = tslib_1.__importDefault(require("../utils/catch-error"));
|
|
9
|
-
const write_to_file_1 = tslib_1.__importDefault(require("../utils/write-to-file"));
|
|
1
|
+
import { readSettings } from '@directus/sdk';
|
|
2
|
+
import { ux } from '@oclif/core';
|
|
3
|
+
import { DIRECTUS_PINK } from '../constants.js';
|
|
4
|
+
import { api } from '../sdk.js';
|
|
5
|
+
import catchError from '../utils/catch-error.js';
|
|
6
|
+
import writeToFile from '../utils/write-to-file.js';
|
|
10
7
|
/**
|
|
11
8
|
* Extract settings from the Directus instance
|
|
12
9
|
*/
|
|
13
|
-
async function extractSettings(dir) {
|
|
14
|
-
|
|
10
|
+
export default async function extractSettings(dir) {
|
|
11
|
+
ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting settings'));
|
|
15
12
|
try {
|
|
16
|
-
const settings = await
|
|
17
|
-
await (
|
|
13
|
+
const settings = await api.client.request(readSettings({ limit: -1 }));
|
|
14
|
+
await writeToFile('settings', settings, dir);
|
|
18
15
|
}
|
|
19
16
|
catch (error) {
|
|
20
|
-
(
|
|
17
|
+
catchError(error);
|
|
21
18
|
}
|
|
22
|
-
|
|
19
|
+
ux.action.stop();
|
|
23
20
|
}
|
|
24
|
-
exports.default = extractSettings;
|
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const sdk_2 = require("../sdk");
|
|
8
|
-
const catch_error_1 = tslib_1.__importDefault(require("../utils/catch-error"));
|
|
9
|
-
const write_to_file_1 = tslib_1.__importDefault(require("../utils/write-to-file"));
|
|
1
|
+
import { readTranslations } from '@directus/sdk';
|
|
2
|
+
import { ux } from '@oclif/core';
|
|
3
|
+
import { DIRECTUS_PINK } from '../constants.js';
|
|
4
|
+
import { api } from '../sdk.js';
|
|
5
|
+
import catchError from '../utils/catch-error.js';
|
|
6
|
+
import writeToFile from '../utils/write-to-file.js';
|
|
10
7
|
/**
|
|
11
8
|
* Extract translations from the Directus instance
|
|
12
9
|
*/
|
|
13
|
-
async function extractTranslations(dir) {
|
|
14
|
-
|
|
10
|
+
export default async function extractTranslations(dir) {
|
|
11
|
+
ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting translations'));
|
|
15
12
|
try {
|
|
16
|
-
const translations = await
|
|
17
|
-
await (
|
|
13
|
+
const translations = await api.client.request(readTranslations({ limit: -1 }));
|
|
14
|
+
await writeToFile('translations', translations, dir);
|
|
18
15
|
}
|
|
19
16
|
catch (error) {
|
|
20
|
-
(
|
|
17
|
+
catchError(error);
|
|
21
18
|
}
|
|
22
|
-
|
|
19
|
+
ux.action.stop();
|
|
23
20
|
}
|
|
24
|
-
exports.default = extractTranslations;
|
|
@@ -1,27 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const filter_fields_1 = tslib_1.__importDefault(require("../utils/filter-fields"));
|
|
10
|
-
const system_fields_1 = require("../utils/system-fields");
|
|
11
|
-
const write_to_file_1 = tslib_1.__importDefault(require("../utils/write-to-file"));
|
|
1
|
+
import { readUsers } from '@directus/sdk';
|
|
2
|
+
import { ux } from '@oclif/core';
|
|
3
|
+
import { DIRECTUS_PINK } from '../constants.js';
|
|
4
|
+
import { api } from '../sdk.js';
|
|
5
|
+
import catchError from '../utils/catch-error.js';
|
|
6
|
+
import filterFields from '../utils/filter-fields.js';
|
|
7
|
+
import { directusUserFields } from '../utils/system-fields.js';
|
|
8
|
+
import writeToFile from '../utils/write-to-file.js';
|
|
12
9
|
/**
|
|
13
10
|
* Extract users from the Directus instance
|
|
14
11
|
*/
|
|
15
|
-
async function extractUsers(dir) {
|
|
16
|
-
|
|
12
|
+
export default async function extractUsers(dir) {
|
|
13
|
+
ux.action.start(ux.colorize(DIRECTUS_PINK, 'Extracting users'));
|
|
17
14
|
try {
|
|
18
|
-
const response = await
|
|
19
|
-
const users = (
|
|
20
|
-
await (
|
|
15
|
+
const response = await api.client.request(readUsers({ limit: -1 }));
|
|
16
|
+
const users = filterFields(response, directusUserFields);
|
|
17
|
+
await writeToFile('users', users, dir);
|
|
21
18
|
}
|
|
22
19
|
catch (error) {
|
|
23
|
-
(
|
|
20
|
+
catchError(error);
|
|
24
21
|
}
|
|
25
|
-
|
|
22
|
+
ux.action.stop();
|
|
26
23
|
}
|
|
27
|
-
exports.default = extractUsers;
|
|
@@ -1,56 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const extract_translations_1 = tslib_1.__importDefault(require("./extract-translations"));
|
|
24
|
-
const extract_users_1 = tslib_1.__importDefault(require("./extract-users"));
|
|
25
|
-
async function extract(dir) {
|
|
1
|
+
import { ux } from '@oclif/core';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import extractAccess from './extract-access.js';
|
|
4
|
+
import { downloadAllFiles } from './extract-assets.js';
|
|
5
|
+
import extractCollections from './extract-collections.js';
|
|
6
|
+
import { extractContent } from './extract-content.js';
|
|
7
|
+
import { extractDashboards, extractPanels } from './extract-dashboards.js';
|
|
8
|
+
import extractExtensions from './extract-extensions.js';
|
|
9
|
+
import extractFields from './extract-fields.js';
|
|
10
|
+
import extractFiles from './extract-files.js';
|
|
11
|
+
import { extractFlows, extractOperations } from './extract-flows.js';
|
|
12
|
+
import extractFolders from './extract-folders.js';
|
|
13
|
+
import extractPermissions from './extract-permissions.js';
|
|
14
|
+
import extractPolicies from './extract-policies.js';
|
|
15
|
+
import extractPresets from './extract-presets.js';
|
|
16
|
+
import extractRelations from './extract-relations.js';
|
|
17
|
+
import extractRoles from './extract-roles.js';
|
|
18
|
+
import extractSchema from './extract-schema.js';
|
|
19
|
+
import extractSettings from './extract-settings.js';
|
|
20
|
+
import extractTranslations from './extract-translations.js';
|
|
21
|
+
import extractUsers from './extract-users.js';
|
|
22
|
+
export default async function extract(dir) {
|
|
26
23
|
// Get the destination directory for the actual files
|
|
27
|
-
const destination = dir
|
|
24
|
+
const destination = `${dir}/src`;
|
|
28
25
|
// Check if directory exists, if not, then create it.
|
|
29
|
-
if (!
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
if (!fs.existsSync(destination)) {
|
|
27
|
+
ux.stdout(`Attempting to create directory at: ${destination}`);
|
|
28
|
+
fs.mkdirSync(destination, { recursive: true });
|
|
32
29
|
}
|
|
33
|
-
await (
|
|
34
|
-
await (
|
|
35
|
-
await (
|
|
36
|
-
await (
|
|
37
|
-
await (
|
|
38
|
-
await (
|
|
39
|
-
await (
|
|
40
|
-
await (
|
|
41
|
-
await (
|
|
42
|
-
await (
|
|
43
|
-
await (
|
|
44
|
-
await (
|
|
45
|
-
await (
|
|
46
|
-
await
|
|
47
|
-
await
|
|
48
|
-
await
|
|
49
|
-
await
|
|
50
|
-
await (
|
|
51
|
-
await (
|
|
52
|
-
await
|
|
53
|
-
await
|
|
30
|
+
await extractSchema(destination);
|
|
31
|
+
await extractCollections(destination);
|
|
32
|
+
await extractFields(destination);
|
|
33
|
+
await extractRelations(destination);
|
|
34
|
+
await extractFolders(destination);
|
|
35
|
+
await extractFiles(destination);
|
|
36
|
+
await extractUsers(destination);
|
|
37
|
+
await extractRoles(destination);
|
|
38
|
+
await extractPermissions(destination);
|
|
39
|
+
await extractPolicies(destination);
|
|
40
|
+
await extractAccess(destination);
|
|
41
|
+
await extractPresets(destination);
|
|
42
|
+
await extractTranslations(destination);
|
|
43
|
+
await extractFlows(destination);
|
|
44
|
+
await extractOperations(destination);
|
|
45
|
+
await extractDashboards(destination);
|
|
46
|
+
await extractPanels(destination);
|
|
47
|
+
await extractSettings(destination);
|
|
48
|
+
await extractExtensions(destination);
|
|
49
|
+
await extractContent(destination);
|
|
50
|
+
await downloadAllFiles(destination);
|
|
54
51
|
return {};
|
|
55
52
|
}
|
|
56
|
-
exports.default = extract;
|
package/dist/lib/init/config.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DOCKER_CONFIG = exports.DIRECTUS_CONFIG = void 0;
|
|
4
|
-
exports.DIRECTUS_CONFIG = {
|
|
1
|
+
export const DIRECTUS_CONFIG = {
|
|
5
2
|
adminEmail: 'admin@example.com',
|
|
6
3
|
adminPassword: 'd1r3ctu5',
|
|
7
4
|
port: 8055,
|
|
8
5
|
url: 'http://localhost',
|
|
9
6
|
};
|
|
10
|
-
|
|
7
|
+
export const DOCKER_CONFIG = {
|
|
11
8
|
composeFile: 'docker-compose.yml',
|
|
12
9
|
healthCheckEndpoint: '/server/health',
|
|
13
10
|
interval: 5000,
|
package/dist/lib/init/index.js
CHANGED
|
@@ -1,71 +1,68 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const parse_github_url_1 = require("../utils/parse-github-url");
|
|
17
|
-
const config_1 = require("./config");
|
|
18
|
-
async function init(dir, flags) {
|
|
1
|
+
import { note, outro, spinner } from '@clack/prompts';
|
|
2
|
+
import { ux } from '@oclif/core';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { execa } from 'execa';
|
|
5
|
+
import { downloadTemplate } from 'giget';
|
|
6
|
+
import { glob } from 'glob';
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import { detectPackageManager, installDependencies } from 'nypm';
|
|
9
|
+
import path from 'pathe';
|
|
10
|
+
import ApplyCommand from '../../commands/apply.js';
|
|
11
|
+
import { createDocker } from '../../services/docker.js';
|
|
12
|
+
import catchError from '../utils/catch-error.js';
|
|
13
|
+
import { createGigetString, parseGitHubUrl } from '../utils/parse-github-url.js';
|
|
14
|
+
import { DIRECTUS_CONFIG, DOCKER_CONFIG } from './config.js';
|
|
15
|
+
export async function init(dir, flags) {
|
|
19
16
|
// Check target directory
|
|
20
17
|
const shouldForce = flags.overrideDir;
|
|
21
|
-
if (
|
|
18
|
+
if (fs.existsSync(dir) && !shouldForce) {
|
|
22
19
|
throw new Error('Directory already exists. Use --override-dir to override.');
|
|
23
20
|
}
|
|
24
|
-
const frontendDir =
|
|
25
|
-
const directusDir =
|
|
21
|
+
const frontendDir = path.join(dir, flags.frontend);
|
|
22
|
+
const directusDir = path.join(dir, 'directus');
|
|
26
23
|
let template;
|
|
27
24
|
try {
|
|
28
25
|
// Download the template from GitHub
|
|
29
|
-
const parsedUrl =
|
|
30
|
-
template = await
|
|
26
|
+
const parsedUrl = parseGitHubUrl(flags.template);
|
|
27
|
+
template = await downloadTemplate(createGigetString(parsedUrl), {
|
|
31
28
|
dir,
|
|
32
29
|
force: shouldForce,
|
|
33
30
|
});
|
|
34
31
|
// Cleanup the template
|
|
35
32
|
if (flags.frontend) {
|
|
36
33
|
// Ensure directus directory exists before cleaning up
|
|
37
|
-
if (!
|
|
38
|
-
|
|
34
|
+
if (!fs.existsSync(directusDir)) {
|
|
35
|
+
fs.mkdirSync(directusDir, { recursive: true });
|
|
39
36
|
}
|
|
40
37
|
// Read and parse package.json
|
|
41
|
-
const packageJsonPath =
|
|
42
|
-
if (!
|
|
38
|
+
const packageJsonPath = path.join(dir, 'package.json');
|
|
39
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
43
40
|
throw new Error('package.json not found in template');
|
|
44
41
|
}
|
|
45
|
-
const packageJson = JSON.parse(
|
|
42
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
46
43
|
const templateConfig = packageJson['directus:template'];
|
|
47
44
|
// Get all frontend paths from the configuration
|
|
48
|
-
const frontendPaths = Object.values(
|
|
45
|
+
const frontendPaths = Object.values(templateConfig?.frontends || {})
|
|
49
46
|
.map(frontend => frontend.path.replace(/^\.\//, ''))
|
|
50
47
|
.filter(path => path !== flags.frontend); // Exclude the selected frontend
|
|
51
48
|
// Remove unused frontend directories
|
|
52
49
|
for (const frontendPath of frontendPaths) {
|
|
53
|
-
const pathToRemove =
|
|
54
|
-
if (
|
|
55
|
-
|
|
50
|
+
const pathToRemove = path.join(dir, frontendPath);
|
|
51
|
+
if (fs.existsSync(pathToRemove)) {
|
|
52
|
+
fs.rmSync(pathToRemove, { recursive: true });
|
|
56
53
|
}
|
|
57
54
|
}
|
|
58
55
|
}
|
|
59
56
|
// Find and copy all .env.example files
|
|
60
|
-
const envFiles =
|
|
57
|
+
const envFiles = glob.sync(path.join(dir, '**', '.env.example'));
|
|
61
58
|
for (const file of envFiles) {
|
|
62
59
|
const envFile = file.replace('.env.example', '.env');
|
|
63
|
-
|
|
60
|
+
fs.copyFileSync(file, envFile);
|
|
64
61
|
}
|
|
65
62
|
// Start Directus and apply template only if directus directory exists
|
|
66
|
-
if (
|
|
63
|
+
if (fs.existsSync(directusDir)) {
|
|
67
64
|
// Initialize Docker service
|
|
68
|
-
const dockerService =
|
|
65
|
+
const dockerService = createDocker(DOCKER_CONFIG);
|
|
69
66
|
// Check if Docker is installed
|
|
70
67
|
const dockerStatus = await dockerService.checkDocker();
|
|
71
68
|
if (!dockerStatus.installed || !dockerStatus.running) {
|
|
@@ -73,41 +70,41 @@ async function init(dir, flags) {
|
|
|
73
70
|
}
|
|
74
71
|
try {
|
|
75
72
|
await dockerService.startContainers(directusDir);
|
|
76
|
-
const healthCheckUrl = `${
|
|
73
|
+
const healthCheckUrl = `${DIRECTUS_CONFIG.url}:${DIRECTUS_CONFIG.port}${DOCKER_CONFIG.healthCheckEndpoint}`;
|
|
77
74
|
await dockerService.waitForHealthy(healthCheckUrl);
|
|
78
|
-
const templatePath =
|
|
75
|
+
const templatePath = path.join(directusDir, 'template');
|
|
79
76
|
// const s = spinner()
|
|
80
77
|
// s.start(`Attempting to apply template from: ${templatePath}`)
|
|
81
|
-
// ux.
|
|
82
|
-
await
|
|
78
|
+
// ux.stdout(`Attempting to apply template from: ${templatePath}`)
|
|
79
|
+
await ApplyCommand.run([
|
|
83
80
|
'--directusUrl=http://localhost:8055',
|
|
84
81
|
'-p',
|
|
85
82
|
'--userEmail=admin@example.com',
|
|
86
83
|
'--userPassword=d1r3ctu5',
|
|
87
|
-
|
|
84
|
+
`--templateLocation=${templatePath}`,
|
|
88
85
|
]);
|
|
89
86
|
// s.stop('Template applied!')
|
|
90
87
|
}
|
|
91
88
|
catch (error) {
|
|
92
|
-
|
|
89
|
+
ux.error('Failed to start Directus containers or apply template');
|
|
93
90
|
throw error;
|
|
94
91
|
}
|
|
95
92
|
}
|
|
96
93
|
// Install dependencies for frontend if it exists
|
|
97
|
-
if (flags.installDeps &&
|
|
98
|
-
const s =
|
|
94
|
+
if (flags.installDeps && fs.existsSync(frontendDir)) {
|
|
95
|
+
const s = spinner();
|
|
99
96
|
s.start('Installing dependencies');
|
|
100
97
|
// ux.action.start('Installing dependencies')
|
|
101
98
|
try {
|
|
102
|
-
const packageManager = await
|
|
103
|
-
await
|
|
99
|
+
const packageManager = await detectPackageManager(frontendDir);
|
|
100
|
+
await installDependencies({
|
|
104
101
|
cwd: frontendDir,
|
|
105
102
|
packageManager,
|
|
106
103
|
silent: true,
|
|
107
104
|
});
|
|
108
105
|
}
|
|
109
106
|
catch (error) {
|
|
110
|
-
|
|
107
|
+
ux.warn('Failed to install dependencies');
|
|
111
108
|
throw error;
|
|
112
109
|
}
|
|
113
110
|
// ux.action.stop()
|
|
@@ -115,7 +112,7 @@ async function init(dir, flags) {
|
|
|
115
112
|
}
|
|
116
113
|
// Initialize Git repo
|
|
117
114
|
if (flags.gitInit) {
|
|
118
|
-
const s =
|
|
115
|
+
const s = spinner();
|
|
119
116
|
s.start('Initializing git repository');
|
|
120
117
|
// ux.action.start('Initializing git repository')
|
|
121
118
|
await initGit(dir);
|
|
@@ -123,16 +120,16 @@ async function init(dir, flags) {
|
|
|
123
120
|
s.stop('Git repository initialized!');
|
|
124
121
|
}
|
|
125
122
|
// Finishing up
|
|
126
|
-
const relativeDir =
|
|
127
|
-
const nextSteps = `- Directus is running on http://localhost:8055 \n- Navigate to your project directory using ${
|
|
128
|
-
|
|
129
|
-
// ux.
|
|
130
|
-
// ux.
|
|
131
|
-
// ux.
|
|
132
|
-
|
|
123
|
+
const relativeDir = path.relative(process.cwd(), dir);
|
|
124
|
+
const nextSteps = `- Directus is running on http://localhost:8055 \n- Navigate to your project directory using ${chalk.cyan(`cd ${relativeDir}`)} and start developing! \n- Review the \`./README.md\` file for next steps.`;
|
|
125
|
+
note(nextSteps, 'Next Steps');
|
|
126
|
+
// ux.stdout('You\'ll find the following directories in your project:')
|
|
127
|
+
// ux.stdout('• directus')
|
|
128
|
+
// ux.stdout(`• ${flags.frontend}`)
|
|
129
|
+
outro(`Problems? Join the community on Discord at ${chalk.underline(chalk.cyan('https://directus.chat'))}`);
|
|
133
130
|
}
|
|
134
131
|
catch (error) {
|
|
135
|
-
(
|
|
132
|
+
catchError(error, {
|
|
136
133
|
context: { dir, flags, function: 'init' },
|
|
137
134
|
fatal: true,
|
|
138
135
|
logToFile: true,
|
|
@@ -144,7 +141,6 @@ async function init(dir, flags) {
|
|
|
144
141
|
template,
|
|
145
142
|
};
|
|
146
143
|
}
|
|
147
|
-
exports.init = init;
|
|
148
144
|
/**
|
|
149
145
|
* Initialize a git repository
|
|
150
146
|
* @param targetDir - The directory to initialize the git repository in
|
|
@@ -153,12 +149,11 @@ exports.init = init;
|
|
|
153
149
|
async function initGit(targetDir) {
|
|
154
150
|
try {
|
|
155
151
|
// ux.action.start('Initializing git repository')
|
|
156
|
-
const { execa } = await Promise.resolve().then(() => tslib_1.__importStar(require('execa')));
|
|
157
152
|
await execa('git', ['init'], { cwd: targetDir });
|
|
158
153
|
// ux.action.stop()
|
|
159
154
|
}
|
|
160
155
|
catch (error) {
|
|
161
|
-
(
|
|
156
|
+
catchError(error, {
|
|
162
157
|
context: { function: 'initGit', targetDir },
|
|
163
158
|
fatal: false,
|
|
164
159
|
logToFile: true,
|
package/dist/lib/init/types.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { init } from './init/index.js';
|
package/dist/lib/init.js
ADDED