directus-template-cli 0.3.5 → 0.4.0-beta.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 (106) hide show
  1. package/dist/commands/apply.d.ts +1 -1
  2. package/dist/commands/apply.js +48 -50
  3. package/dist/commands/extract.d.ts +1 -2
  4. package/dist/commands/extract.js +13 -18
  5. package/dist/lib/extract/extract-assets.d.ts +182 -2
  6. package/dist/lib/extract/extract-assets.js +25 -32
  7. package/dist/lib/extract/extract-collections.d.ts +4 -0
  8. package/dist/lib/extract/extract-collections.js +24 -0
  9. package/dist/lib/extract/extract-content.d.ts +1 -1
  10. package/dist/lib/extract/extract-content.js +18 -18
  11. package/dist/lib/extract/extract-dashboards.d.ts +8 -0
  12. package/dist/lib/extract/extract-dashboards.js +42 -0
  13. package/dist/lib/extract/extract-fields.d.ts +4 -0
  14. package/dist/lib/extract/extract-fields.js +30 -0
  15. package/dist/lib/extract/extract-files.js +11 -34
  16. package/dist/lib/extract/extract-flows.d.ts +8 -0
  17. package/dist/lib/extract/extract-flows.js +42 -0
  18. package/dist/lib/extract/extract-folders.d.ts +1 -1
  19. package/dist/lib/extract/extract-folders.js +12 -13
  20. package/dist/lib/extract/extract-permissions.d.ts +1 -1
  21. package/dist/lib/extract/extract-permissions.js +13 -13
  22. package/dist/lib/extract/extract-presets.js +15 -11
  23. package/dist/lib/extract/extract-relations.d.ts +4 -0
  24. package/dist/lib/extract/extract-relations.js +33 -0
  25. package/dist/lib/extract/extract-roles.js +11 -22
  26. package/dist/lib/extract/extract-schema.js +9 -9
  27. package/dist/lib/extract/extract-settings.d.ts +4 -0
  28. package/dist/lib/extract/extract-settings.js +22 -0
  29. package/dist/lib/extract/extract-translations.d.ts +4 -0
  30. package/dist/lib/extract/extract-translations.js +24 -0
  31. package/dist/lib/extract/extract-users.d.ts +1 -1
  32. package/dist/lib/extract/extract-users.js +14 -36
  33. package/dist/lib/extract/index.d.ts +1 -1
  34. package/dist/lib/extract/index.js +27 -32
  35. package/dist/lib/interfaces.d.ts +1 -1
  36. package/dist/lib/load/index.d.ts +1 -1
  37. package/dist/lib/load/index.js +32 -44
  38. package/dist/lib/load/load-collections.d.ts +4 -0
  39. package/dist/lib/load/load-collections.js +66 -0
  40. package/dist/lib/load/load-dashboards.d.ts +2 -1
  41. package/dist/lib/load/load-dashboards.js +33 -3
  42. package/dist/lib/load/load-data.d.ts +1 -1
  43. package/dist/lib/load/load-data.js +87 -60
  44. package/dist/lib/load/load-files.d.ts +1 -1
  45. package/dist/lib/load/load-files.js +23 -20
  46. package/dist/lib/load/load-flows.d.ts +2 -2
  47. package/dist/lib/load/load-flows.js +43 -9
  48. package/dist/lib/load/load-folders.js +15 -11
  49. package/dist/lib/load/load-permissions.d.ts +1 -1
  50. package/dist/lib/load/load-permissions.js +22 -21
  51. package/dist/lib/load/load-presets.d.ts +1 -2
  52. package/dist/lib/load/load-presets.js +16 -19
  53. package/dist/lib/load/load-relations.d.ts +4 -0
  54. package/dist/lib/load/load-relations.js +33 -0
  55. package/dist/lib/load/load-roles.d.ts +1 -1
  56. package/dist/lib/load/load-roles.js +20 -10
  57. package/dist/lib/load/load-schema.js +12 -7
  58. package/dist/lib/load/load-settings.d.ts +1 -1
  59. package/dist/lib/load/load-settings.js +10 -4
  60. package/dist/lib/load/load-translations.d.ts +1 -0
  61. package/dist/lib/load/load-translations.js +21 -0
  62. package/dist/lib/load/load-users.d.ts +1 -2
  63. package/dist/lib/load/load-users.js +19 -8
  64. package/dist/lib/sdk.d.ts +13 -0
  65. package/dist/lib/sdk.js +26 -0
  66. package/dist/lib/utils/auth.d.ts +2 -2
  67. package/dist/lib/utils/auth.js +12 -11
  68. package/dist/lib/utils/check-template.d.ts +4 -0
  69. package/dist/lib/utils/check-template.js +34 -0
  70. package/dist/lib/utils/filter-fields.js +5 -5
  71. package/dist/lib/utils/get-role-ids.d.ts +55 -0
  72. package/dist/lib/utils/get-role-ids.js +14 -0
  73. package/dist/lib/utils/log-error.d.ts +14 -0
  74. package/dist/lib/utils/log-error.js +25 -0
  75. package/dist/lib/utils/read-templates.js +2 -2
  76. package/dist/lib/utils/system-fields.d.ts +20 -0
  77. package/dist/lib/utils/system-fields.js +159 -0
  78. package/dist/lib/utils/template-defaults.js +8 -10
  79. package/dist/lib/utils/transform-github-url.d.ts +1 -0
  80. package/dist/lib/utils/transform-github-url.js +15 -0
  81. package/dist/lib/utils/validate-url.js +1 -1
  82. package/dist/lib/utils/write-to-file.js +4 -4
  83. package/oclif.manifest.json +34 -16
  84. package/package.json +23 -22
  85. package/templates/agencyos/package.json +6 -6
  86. package/templates/agencyos/src/collections.json +0 -459
  87. package/templates/agencyos/src/dashboards.json +3 -35
  88. package/templates/agencyos/src/fields.json +34588 -0
  89. package/templates/agencyos/src/flows.json +13 -62
  90. package/templates/agencyos/src/permissions.json +2 -8
  91. package/templates/agencyos/src/relations.json +4585 -0
  92. package/templates/agencyos/src/schema/snapshot.json +1 -39415
  93. package/templates/agencyos/src/translations.json +1 -0
  94. package/templates/agencyos/src/users.json +8 -8
  95. package/dist/lib/api.d.ts +0 -15
  96. package/dist/lib/api.js +0 -37
  97. package/dist/lib/extract/extract-from-endpoint.d.ts +0 -4
  98. package/dist/lib/extract/extract-from-endpoint.js +0 -23
  99. package/dist/lib/load/load-operations.d.ts +0 -1
  100. package/dist/lib/load/load-operations.js +0 -29
  101. package/dist/lib/load/load-panels.d.ts +0 -0
  102. package/dist/lib/load/load-panels.js +0 -0
  103. package/dist/lib/utils/delete-items.d.ts +0 -1
  104. package/dist/lib/utils/delete-items.js +0 -15
  105. package/dist/lib/utils/load-to-destination.d.ts +0 -1
  106. package/dist/lib/utils/load-to-destination.js +0 -14
@@ -1,28 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const api_1 = require("../api");
4
- exports.default = async (presets) => {
5
- await deleteAllPresets();
6
- const cleanPresets = presets.map((preset) => {
3
+ const tslib_1 = require("tslib");
4
+ const sdk_1 = require("@directus/sdk");
5
+ const core_1 = require("@oclif/core");
6
+ const sdk_2 = require("../sdk");
7
+ const log_error_1 = tslib_1.__importDefault(require("../utils/log-error"));
8
+ const read_file_1 = tslib_1.__importDefault(require("../utils/read-file"));
9
+ async function loadPresets(dir) {
10
+ const presets = (0, read_file_1.default)('presets', dir);
11
+ core_1.ux.action.start(`Loading ${presets.length} presets`);
12
+ const cleanPresets = presets.map(preset => {
7
13
  preset.user = null;
8
14
  return preset;
9
15
  });
10
16
  try {
11
- await api_1.api.post("presets", cleanPresets);
17
+ await sdk_2.api.client.request((0, sdk_1.createPresets)(cleanPresets));
12
18
  }
13
19
  catch (error) {
14
- console.log("Error uploading preset", error.response.data.errors);
20
+ (0, log_error_1.default)(error);
15
21
  }
16
- };
17
- const deleteAllPresets = async () => {
18
- try {
19
- const { data: presets } = await api_1.api.get("presets");
20
- const ids = presets.data.map((preset) => preset.id);
21
- await api_1.api.delete("presets", {
22
- data: ids,
23
- });
24
- }
25
- catch (error) {
26
- console.log("Error removing existing presets", error.response.data.errors);
27
- }
28
- };
22
+ core_1.ux.action.stop();
23
+ core_1.ux.log('Loaded presets');
24
+ }
25
+ exports.default = loadPresets;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Load relationships into the Directus instance
3
+ */
4
+ export default function loadRelations(dir: string): Promise<void>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const sdk_1 = require("@directus/sdk");
5
+ const core_1 = require("@oclif/core");
6
+ const sdk_2 = require("../sdk");
7
+ const log_error_1 = tslib_1.__importDefault(require("../utils/log-error"));
8
+ const read_file_1 = tslib_1.__importDefault(require("../utils/read-file"));
9
+ /**
10
+ * Load relationships into the Directus instance
11
+ */
12
+ async function loadRelations(dir) {
13
+ const relations = (0, read_file_1.default)('relations', dir);
14
+ core_1.ux.action.start(`Loading ${relations.length} relations`);
15
+ const relationsToAdd = relations.map(i => {
16
+ delete i.meta.id;
17
+ return i;
18
+ });
19
+ await addRelations(relationsToAdd);
20
+ core_1.ux.action.stop();
21
+ core_1.ux.log('Loaded relations');
22
+ }
23
+ exports.default = loadRelations;
24
+ async function addRelations(relations) {
25
+ for await (const relation of relations) {
26
+ try {
27
+ await sdk_2.api.client.request((0, sdk_1.createRelation)(relation));
28
+ }
29
+ catch (error) {
30
+ (0, log_error_1.default)(error);
31
+ }
32
+ }
33
+ }
@@ -1 +1 @@
1
- export default function loadRoles(roles: any): Promise<void>;
1
+ export default function loadRoles(dir: string): Promise<void>;
@@ -1,21 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const api_1 = require("../api");
4
- async function loadRoles(roles) {
5
- const cleanedUpRoles = roles.map((role) => {
3
+ const tslib_1 = require("tslib");
4
+ const sdk_1 = require("@directus/sdk");
5
+ const core_1 = require("@oclif/core");
6
+ const sdk_2 = require("../sdk");
7
+ const log_error_1 = tslib_1.__importDefault(require("../utils/log-error"));
8
+ const read_file_1 = tslib_1.__importDefault(require("../utils/read-file"));
9
+ async function loadRoles(dir) {
10
+ const roles = (0, read_file_1.default)('roles', dir);
11
+ core_1.ux.action.start(`Loading ${roles.length} roles`);
12
+ const cleanedUpRoles = roles.map(role => {
6
13
  delete role.users;
7
14
  return role;
8
15
  });
9
- const adminRole = cleanedUpRoles.find((role) => role.name === "Administrator");
16
+ const adminRole = cleanedUpRoles.find(role => role.name === 'Administrator');
10
17
  // Admin role isn't touched.
11
- const customRoles = cleanedUpRoles.filter((role) => role.name !== "Administrator");
18
+ const customRoles = cleanedUpRoles.filter(role => role.name !== 'Administrator');
12
19
  try {
13
- const { data } = await api_1.api.post("roles", customRoles);
20
+ // Create the custom roles aside from public and admin
21
+ await sdk_2.api.client.request((0, sdk_1.createRoles)(customRoles));
22
+ // Update the admin role
23
+ await sdk_2.api.client.request((0, sdk_1.updateRole)(adminRole.id, adminRole));
14
24
  }
15
- catch {
16
- // maybe the roles already exist
25
+ catch (error) {
26
+ (0, log_error_1.default)(error);
17
27
  }
18
- const adminUpdate = await api_1.api.patch(`roles/${adminRole.id}`, adminRole);
19
- console.log("Seeded Roles");
28
+ core_1.ux.action.stop();
29
+ core_1.ux.log('Loaded roles');
20
30
  }
21
31
  exports.default = loadRoles;
@@ -1,20 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- const api_1 = require("../api");
4
+ const sdk_1 = require("@directus/sdk");
5
+ const core_1 = require("@oclif/core");
6
+ const sdk_2 = require("../sdk");
7
+ const log_error_1 = tslib_1.__importDefault(require("../utils/log-error"));
5
8
  const read_file_1 = tslib_1.__importDefault(require("../utils/read-file"));
6
9
  exports.default = async (dir) => {
10
+ core_1.ux.log('Loading schema • collections, fields, and relations...');
7
11
  const schema = (0, read_file_1.default)('snapshot', dir);
8
- const { data } = await api_1.api.post('schema/diff?force', schema);
9
- if (!data.data) {
10
- console.log('No schema changes to apply');
12
+ // @ts-ignore
13
+ const data = await sdk_2.api.client.request((0, sdk_1.schemaDiff)(schema, true));
14
+ if (!data) {
15
+ core_1.ux.log('No schema to apply');
11
16
  return;
12
17
  }
13
18
  try {
14
- await api_1.api.post('schema/apply', data.data);
15
- // console.log('Schema Loaded')
19
+ await sdk_2.api.client.request((0, sdk_1.schemaApply)(data));
20
+ core_1.ux.log('Loaded schema');
16
21
  }
17
22
  catch (error) {
18
- console.log('Error Applying schema', error.response.data.errors);
23
+ (0, log_error_1.default)(error);
19
24
  }
20
25
  };
@@ -1 +1 @@
1
- export default function loadSettings(settingsObj: any): Promise<void>;
1
+ export default function loadSettings(dir: string): Promise<void>;
@@ -1,12 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const api_1 = require("../api");
4
- async function loadSettings(settingsObj) {
3
+ const tslib_1 = require("tslib");
4
+ const sdk_1 = require("@directus/sdk");
5
+ const sdk_2 = require("../sdk");
6
+ const log_error_1 = tslib_1.__importDefault(require("../utils/log-error"));
7
+ const read_file_1 = tslib_1.__importDefault(require("../utils/read-file"));
8
+ async function loadSettings(dir) {
9
+ const settings = (0, read_file_1.default)('settings', dir);
5
10
  try {
6
- const { data } = await api_1.api.patch('settings', settingsObj);
11
+ // @ts-ignore
12
+ await sdk_2.api.client.request((0, sdk_1.updateSettings)(settings));
7
13
  }
8
14
  catch (error) {
9
- console.log('Error loading settings', error.response.data.errors);
15
+ (0, log_error_1.default)(error);
10
16
  }
11
17
  }
12
18
  exports.default = loadSettings;
@@ -0,0 +1 @@
1
+ export default function loadTranslations(dir: string): Promise<void>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const sdk_1 = require("@directus/sdk");
5
+ const core_1 = require("@oclif/core");
6
+ const sdk_2 = require("../sdk");
7
+ const log_error_1 = tslib_1.__importDefault(require("../utils/log-error"));
8
+ const read_file_1 = tslib_1.__importDefault(require("../utils/read-file"));
9
+ async function loadTranslations(dir) {
10
+ core_1.ux.action.start('Loading translations');
11
+ const translations = (0, read_file_1.default)('translations', dir);
12
+ try {
13
+ await sdk_2.api.client.request((0, sdk_1.createTranslations)(translations));
14
+ }
15
+ catch (error) {
16
+ (0, log_error_1.default)(error);
17
+ }
18
+ core_1.ux.action.stop();
19
+ core_1.ux.log('Loaded translations');
20
+ }
21
+ exports.default = loadTranslations;
@@ -1,2 +1 @@
1
- declare const _default: (users: any[], legacyAdminRoleId: string | number, newAdminRoleId: string | number) => Promise<void>;
2
- export default _default;
1
+ export default function loadUsers(dir: string): Promise<void>;
@@ -1,8 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const api_1 = require("../api");
4
- exports.default = async (users, legacyAdminRoleId, newAdminRoleId) => {
5
- const cleanedUpUsers = users.map((user) => {
3
+ const tslib_1 = require("tslib");
4
+ const sdk_1 = require("@directus/sdk");
5
+ const core_1 = require("@oclif/core");
6
+ const sdk_2 = require("../sdk");
7
+ const get_role_ids_1 = tslib_1.__importDefault(require("../utils/get-role-ids"));
8
+ const log_error_1 = tslib_1.__importDefault(require("../utils/log-error"));
9
+ const read_file_1 = tslib_1.__importDefault(require("../utils/read-file"));
10
+ async function loadUsers(dir) {
11
+ const users = (0, read_file_1.default)('users', dir);
12
+ core_1.ux.action.start(`Loading ${users.length} users`);
13
+ const { legacyAdminRoleId, newAdminRoleId } = await (0, get_role_ids_1.default)(dir);
14
+ const filteredUsers = users.map(user => {
6
15
  // If the user is an admin, we need to change their role to the new admin role
7
16
  const isAdmin = user.role === legacyAdminRoleId;
8
17
  user.role = isAdmin ? newAdminRoleId : user.role;
@@ -11,13 +20,15 @@ exports.default = async (users, legacyAdminRoleId, newAdminRoleId) => {
11
20
  delete user.token;
12
21
  return user;
13
22
  });
14
- for (const user of cleanedUpUsers) {
23
+ for (const user of filteredUsers) {
15
24
  try {
16
- await api_1.api.post("users", user);
17
- // console.log('Uploaded User' + user.email)
25
+ await sdk_2.api.client.request((0, sdk_1.createUser)(user));
18
26
  }
19
27
  catch (error) {
20
- console.log("Error uploading user.", error.response.data.errors);
28
+ (0, log_error_1.default)(error);
21
29
  }
22
30
  }
23
- };
31
+ core_1.ux.action.stop();
32
+ core_1.ux.log('Loaded users');
33
+ }
34
+ exports.default = loadUsers;
@@ -0,0 +1,13 @@
1
+ import type { AuthenticationClient, RestClient } from '@directus/sdk';
2
+ export interface Schema {
3
+ any: any;
4
+ }
5
+ declare class Api {
6
+ client: RestClient<Schema> & AuthenticationClient<Schema> | undefined;
7
+ private limiter;
8
+ constructor();
9
+ initialize(url: string): void;
10
+ setAuthToken(token: string): void;
11
+ }
12
+ declare const api: Api;
13
+ export { api };
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.api = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const sdk_1 = require("@directus/sdk");
6
+ const bottleneck_1 = tslib_1.__importDefault(require("bottleneck"));
7
+ class Api {
8
+ constructor() {
9
+ this.limiter = new bottleneck_1.default({
10
+ minTime: 100, // Set min time between tasks here (1000 ms = 1 second)
11
+ // You can set other options here as well.
12
+ });
13
+ }
14
+ initialize(url) {
15
+ this.client = (0, sdk_1.createDirectus)(url, {
16
+ globals: {
17
+ fetch: (...args) => this.limiter.schedule(() => fetch(...args)),
18
+ },
19
+ }).with((0, sdk_1.rest)()).with((0, sdk_1.authentication)());
20
+ }
21
+ setAuthToken(token) {
22
+ this.client.setToken(token);
23
+ }
24
+ }
25
+ const api = new Api();
26
+ exports.api = api;
@@ -1,2 +1,2 @@
1
- export declare function getDirectusUrl(): any;
2
- export declare function getDirectusToken(directusUrl: string): any;
1
+ export declare function getDirectusUrl(): Promise<string>;
2
+ export declare function getDirectusToken(directusUrl: string): Promise<string>;
@@ -2,32 +2,33 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getDirectusToken = exports.getDirectusUrl = void 0;
4
4
  const tslib_1 = require("tslib");
5
+ const sdk_1 = require("@directus/sdk");
5
6
  const core_1 = require("@oclif/core");
6
- const api_1 = require("../api");
7
+ const sdk_2 = require("../sdk");
7
8
  const validate_url_1 = tslib_1.__importDefault(require("./validate-url"));
8
9
  async function getDirectusUrl() {
9
- const directusUrl = await core_1.ux.prompt("What is your Directus URL?");
10
+ const directusUrl = await core_1.ux.prompt('What is your Directus URL?', { default: 'http://localhost:8055' });
10
11
  // Validate URL
11
12
  if (!(0, validate_url_1.default)(directusUrl)) {
12
- core_1.ux.warn("Invalid URL");
13
+ core_1.ux.warn('Invalid URL');
13
14
  return getDirectusUrl();
14
15
  }
16
+ sdk_2.api.initialize(directusUrl);
15
17
  return directusUrl;
16
18
  }
17
19
  exports.getDirectusUrl = getDirectusUrl;
18
20
  async function getDirectusToken(directusUrl) {
19
- const directusToken = await core_1.ux.prompt("What is your Directus Admin Token?");
21
+ const directusToken = await core_1.ux.prompt('What is your Directus Admin Token?');
20
22
  // Validate token
21
23
  try {
22
- await api_1.api.get("/users/me", {
23
- headers: {
24
- Authorization: `Bearer ${directusToken}`,
25
- },
26
- });
24
+ sdk_2.api.setAuthToken(directusToken);
25
+ const response = await sdk_2.api.client.request((0, sdk_1.readMe)());
26
+ core_1.ux.log(`Logged in as ${response.first_name} ${response.last_name}`);
27
27
  return directusToken;
28
28
  }
29
- catch {
30
- core_1.ux.warn("Invalid token");
29
+ catch (error) {
30
+ console.log(error);
31
+ core_1.ux.warn('Invalid token. Please try again.');
31
32
  return getDirectusToken(directusUrl);
32
33
  }
33
34
  }
@@ -0,0 +1,4 @@
1
+ export default function checkTemplate(dir: string): Promise<{
2
+ collections: boolean;
3
+ schema: boolean;
4
+ }>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const node_path_1 = tslib_1.__importDefault(require("node:path"));
5
+ const read_file_1 = tslib_1.__importDefault(require("../utils/read-file"));
6
+ async function checkTemplate(dir) {
7
+ // Check for the schema file and the collections,fields, and relations files
8
+ const schemaDir = node_path_1.default.join(dir, 'schema');
9
+ const schema = (0, read_file_1.default)('snapshot', schemaDir);
10
+ const isSchemaOk = checkSchema(schema);
11
+ const collections = (0, read_file_1.default)('collections', dir);
12
+ const fields = (0, read_file_1.default)('fields', dir);
13
+ const relations = (0, read_file_1.default)('relations', dir);
14
+ const isCollectionsOk = collections.length > 0 && fields.length > 0 && relations.length > 0;
15
+ // There are two ways to load the schema. 1. Using the schema file and endpoints which will overwrite the schema. 2. Using the collections, fields, and relations files which will add to the schema. Older templates only supported the schema file and didn't extract the collections, fields, and relations files. Newer templates support both methods.
16
+ return {
17
+ collections: isCollectionsOk,
18
+ schema: isSchemaOk,
19
+ };
20
+ }
21
+ exports.default = checkTemplate;
22
+ const requiredSchemaKeys = ['version', 'collections', 'fields', 'relations', 'directus'];
23
+ function checkSchema(schema) {
24
+ if (!schema) {
25
+ return false;
26
+ }
27
+ const schemaKeys = Object.keys(schema);
28
+ for (const key of requiredSchemaKeys) {
29
+ if (!schemaKeys.includes(key)) {
30
+ return false;
31
+ }
32
+ }
33
+ return true;
34
+ }
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // Utility function to filter out non-system fields
3
+ // Utility function to remove relationship data (arrays of integers or UUIDs) from system collection data. Used for when custom fields are added to system collections. The relational data should be populated when the actual data is loaded.
4
4
  function filterFields(dataArray, systemFields) {
5
- return dataArray.map((item) => {
5
+ return dataArray.map(item => {
6
6
  for (const key of Object.keys(item)) {
7
7
  if (!systemFields.includes(key)) {
8
8
  const value = item[key];
9
9
  if (Array.isArray(value)) {
10
- const isArrayOfIntegers = value.every((v) => Number.isInteger(v));
11
- const isArrayOfUUIDs = value.every((v) => typeof v === "string" &&
12
- /[\dA-Fa-f]{8}(?:-[\dA-Fa-f]{4}){3}-[\dA-Fa-f]{12}/.test(v));
10
+ const isArrayOfIntegers = value.every(v => Number.isInteger(v));
11
+ const isArrayOfUUIDs = value.every(v => typeof v === 'string'
12
+ && /[\dA-Fa-f]{8}(?:-[\dA-Fa-f]{4}){3}-[\dA-Fa-f]{12}/.test(v));
13
13
  if (isArrayOfIntegers || isArrayOfUUIDs) {
14
14
  item[key] = null; // or item[key] = [];
15
15
  }
@@ -0,0 +1,55 @@
1
+ export default function getRoleIds(dir: string): Promise<{
2
+ legacyAdminRoleId: any;
3
+ newAdminRoleId: string | {
4
+ id: string;
5
+ name: string;
6
+ icon: string;
7
+ description: string;
8
+ ip_access: string;
9
+ enforce_tfa: boolean;
10
+ admin_access: boolean;
11
+ app_access: boolean;
12
+ } | import("@directus/sdk/dist/types-ZBNrmR-A").ax<import("@directus/sdk/dist/types-ZBNrmR-A").a8<{
13
+ id: string;
14
+ name: string;
15
+ icon: string;
16
+ description: string;
17
+ ip_access: string;
18
+ enforce_tfa: boolean;
19
+ admin_access: boolean;
20
+ app_access: boolean;
21
+ }, "name" | "description" | "id" | "icon" | "ip_access" | "enforce_tfa" | "admin_access" | "app_access", import("@directus/sdk/dist/types-ZBNrmR-A").aI<import("../sdk").Schema, {
22
+ id: string;
23
+ name: string;
24
+ icon: string;
25
+ description: string;
26
+ ip_access: string;
27
+ enforce_tfa: boolean;
28
+ admin_access: boolean;
29
+ app_access: boolean;
30
+ }>>, {
31
+ [x: string]: never;
32
+ [x: number]: never;
33
+ }, import("@directus/sdk/dist/types-ZBNrmR-A").a8<{
34
+ id: string;
35
+ name: string;
36
+ icon: string;
37
+ description: string;
38
+ ip_access: string;
39
+ enforce_tfa: boolean;
40
+ admin_access: boolean;
41
+ app_access: boolean;
42
+ }, "name" | "description" | "id" | "icon" | "ip_access" | "enforce_tfa" | "admin_access" | "app_access", import("@directus/sdk/dist/types-ZBNrmR-A").aI<import("../sdk").Schema, {
43
+ id: string;
44
+ name: string;
45
+ icon: string;
46
+ description: string;
47
+ ip_access: string;
48
+ enforce_tfa: boolean;
49
+ admin_access: boolean;
50
+ app_access: boolean;
51
+ }>>, {
52
+ [x: string]: never;
53
+ [x: number]: never;
54
+ }>;
55
+ }>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const sdk_1 = require("@directus/sdk");
5
+ const sdk_2 = require("../sdk");
6
+ const read_file_1 = tslib_1.__importDefault(require("./read-file"));
7
+ async function getRoleIds(dir) {
8
+ const roles = (0, read_file_1.default)('roles', dir);
9
+ const legacyAdminRoleId = roles.find(role => role.name === 'Administrator').id;
10
+ const currentUser = await sdk_2.api.client.request((0, sdk_1.readMe)());
11
+ const newAdminRoleId = currentUser.role;
12
+ return { legacyAdminRoleId, newAdminRoleId };
13
+ }
14
+ exports.default = getRoleIds;
@@ -0,0 +1,14 @@
1
+ interface Error {
2
+ errors: {
3
+ message: string;
4
+ }[];
5
+ response: {
6
+ status: number;
7
+ };
8
+ }
9
+ interface Options {
10
+ fatal?: boolean;
11
+ logToFile?: boolean;
12
+ }
13
+ export default function logError(error: Error, options?: Options): void;
14
+ export {};
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const core_1 = require("@oclif/core");
5
+ const node_fs_1 = tslib_1.__importDefault(require("node:fs"));
6
+ const node_path_1 = tslib_1.__importDefault(require("node:path"));
7
+ function logError(error, options = {}) {
8
+ const errorMessage = `Status ${error.response.status} • ${error.errors[0].message}\n`;
9
+ if (options.fatal) {
10
+ core_1.ux.error(errorMessage);
11
+ }
12
+ else {
13
+ core_1.ux.warn(errorMessage);
14
+ }
15
+ if (options.logToFile) {
16
+ const logFilePath = node_path_1.default.join(__dirname, 'error.log');
17
+ try {
18
+ node_fs_1.default.appendFileSync(logFilePath, `${new Date().toISOString()} - ${errorMessage}`);
19
+ }
20
+ catch (fileError) {
21
+ console.error('Error writing to log file:', fileError);
22
+ }
23
+ }
24
+ }
25
+ exports.default = logError;
@@ -5,9 +5,9 @@ const tslib_1 = require("tslib");
5
5
  const node_fs_1 = tslib_1.__importDefault(require("node:fs"));
6
6
  const node_path_1 = tslib_1.__importDefault(require("node:path"));
7
7
  async function readTemplate(directoryPath) {
8
- const packageFilePath = node_path_1.default.join(directoryPath, "package.json");
8
+ const packageFilePath = node_path_1.default.join(directoryPath, 'package.json');
9
9
  try {
10
- const packageData = await node_fs_1.default.promises.readFile(packageFilePath, "utf-8");
10
+ const packageData = await node_fs_1.default.promises.readFile(packageFilePath, 'utf8');
11
11
  const packageJson = JSON.parse(packageData);
12
12
  if (packageJson.templateName) {
13
13
  return {
@@ -0,0 +1,20 @@
1
+ export declare const directusUserFields: string[];
2
+ export declare const directusRoleFields: string[];
3
+ export declare const directusFileFields: string[];
4
+ export declare const directusFolderFields: string[];
5
+ export declare const directusFlowFields: string[];
6
+ export declare const directusOperationFields: string[];
7
+ export declare const directusDashboardFields: string[];
8
+ export declare const directusPanelFields: string[];
9
+ export declare const directusSettingsFields: string[];
10
+ export declare const systemFields: {
11
+ directus_dashboards: string[];
12
+ directus_files: string[];
13
+ directus_flows: string[];
14
+ directus_folders: string[];
15
+ directus_operations: string[];
16
+ directus_panels: string[];
17
+ directus_roles: string[];
18
+ directus_settings: string[];
19
+ directus_users: string[];
20
+ };