@umbraco/playwright-testhelpers 1.0.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 (89) hide show
  1. package/dist/lib/helpers/AliasHelper.d.ts +40 -0
  2. package/dist/lib/helpers/AliasHelper.js +64 -0
  3. package/dist/lib/helpers/AliasHelper.js.map +1 -0
  4. package/dist/lib/helpers/ApiHelpers.d.ts +49 -0
  5. package/dist/lib/helpers/ApiHelpers.js +141 -0
  6. package/dist/lib/helpers/ApiHelpers.js.map +1 -0
  7. package/dist/lib/helpers/ConstantHelper.d.ts +33 -0
  8. package/dist/lib/helpers/ConstantHelper.js +38 -0
  9. package/dist/lib/helpers/ConstantHelper.js.map +1 -0
  10. package/dist/lib/helpers/ContentApiHelper.d.ts +13 -0
  11. package/dist/lib/helpers/ContentApiHelper.js +153 -0
  12. package/dist/lib/helpers/ContentApiHelper.js.map +1 -0
  13. package/dist/lib/helpers/DatatypeApiHelper.d.ts +7 -0
  14. package/dist/lib/helpers/DatatypeApiHelper.js +30 -0
  15. package/dist/lib/helpers/DatatypeApiHelper.js.map +1 -0
  16. package/dist/lib/helpers/DocumentTypeApiHelper.d.ts +7 -0
  17. package/dist/lib/helpers/DocumentTypeApiHelper.js +34 -0
  18. package/dist/lib/helpers/DocumentTypeApiHelper.js.map +1 -0
  19. package/dist/lib/helpers/DomainApiHelper.d.ts +7 -0
  20. package/dist/lib/helpers/DomainApiHelper.js +31 -0
  21. package/dist/lib/helpers/DomainApiHelper.js.map +1 -0
  22. package/dist/lib/helpers/FolderApiHelper.d.ts +6 -0
  23. package/dist/lib/helpers/FolderApiHelper.js +16 -0
  24. package/dist/lib/helpers/FolderApiHelper.js.map +1 -0
  25. package/dist/lib/helpers/JsonHelper.d.ts +12 -0
  26. package/dist/lib/helpers/JsonHelper.js +29 -0
  27. package/dist/lib/helpers/JsonHelper.js.map +1 -0
  28. package/dist/lib/helpers/LanguagesApiHelper.d.ts +9 -0
  29. package/dist/lib/helpers/LanguagesApiHelper.js +57 -0
  30. package/dist/lib/helpers/LanguagesApiHelper.js.map +1 -0
  31. package/dist/lib/helpers/MacroApiHelper.d.ts +9 -0
  32. package/dist/lib/helpers/MacroApiHelper.js +56 -0
  33. package/dist/lib/helpers/MacroApiHelper.js.map +1 -0
  34. package/dist/lib/helpers/MediaApiHelper.d.ts +75 -0
  35. package/dist/lib/helpers/MediaApiHelper.js +268 -0
  36. package/dist/lib/helpers/MediaApiHelper.js.map +1 -0
  37. package/dist/lib/helpers/MediaTypeApiHelper.d.ts +7 -0
  38. package/dist/lib/helpers/MediaTypeApiHelper.js +29 -0
  39. package/dist/lib/helpers/MediaTypeApiHelper.js.map +1 -0
  40. package/dist/lib/helpers/MemberApiHelper.d.ts +6 -0
  41. package/dist/lib/helpers/MemberApiHelper.js +22 -0
  42. package/dist/lib/helpers/MemberApiHelper.js.map +1 -0
  43. package/dist/lib/helpers/MemberGroupApiHelper.d.ts +6 -0
  44. package/dist/lib/helpers/MemberGroupApiHelper.js +25 -0
  45. package/dist/lib/helpers/MemberGroupApiHelper.js.map +1 -0
  46. package/dist/lib/helpers/MemberTypeApiHelper.d.ts +6 -0
  47. package/dist/lib/helpers/MemberTypeApiHelper.js +28 -0
  48. package/dist/lib/helpers/MemberTypeApiHelper.js.map +1 -0
  49. package/dist/lib/helpers/PackageApiHelper.d.ts +8 -0
  50. package/dist/lib/helpers/PackageApiHelper.js +28 -0
  51. package/dist/lib/helpers/PackageApiHelper.js.map +1 -0
  52. package/dist/lib/helpers/PartialViewApiHelper.d.ts +9 -0
  53. package/dist/lib/helpers/PartialViewApiHelper.js +50 -0
  54. package/dist/lib/helpers/PartialViewApiHelper.js.map +1 -0
  55. package/dist/lib/helpers/RelationTypeApiHelper.d.ts +6 -0
  56. package/dist/lib/helpers/RelationTypeApiHelper.js +28 -0
  57. package/dist/lib/helpers/RelationTypeApiHelper.js.map +1 -0
  58. package/dist/lib/helpers/ScriptApiHelper.d.ts +11 -0
  59. package/dist/lib/helpers/ScriptApiHelper.js +58 -0
  60. package/dist/lib/helpers/ScriptApiHelper.js.map +1 -0
  61. package/dist/lib/helpers/StylesheetApiHelper.d.ts +7 -0
  62. package/dist/lib/helpers/StylesheetApiHelper.js +28 -0
  63. package/dist/lib/helpers/StylesheetApiHelper.js.map +1 -0
  64. package/dist/lib/helpers/TemplatesApiHelper.d.ts +8 -0
  65. package/dist/lib/helpers/TemplatesApiHelper.js +47 -0
  66. package/dist/lib/helpers/TemplatesApiHelper.js.map +1 -0
  67. package/dist/lib/helpers/UiHelpers.d.ts +23 -0
  68. package/dist/lib/helpers/UiHelpers.js +134 -0
  69. package/dist/lib/helpers/UiHelpers.js.map +1 -0
  70. package/dist/lib/helpers/UserApiHelper.d.ts +9 -0
  71. package/dist/lib/helpers/UserApiHelper.js +44 -0
  72. package/dist/lib/helpers/UserApiHelper.js.map +1 -0
  73. package/dist/lib/helpers/UserGroupApiHelper.d.ts +7 -0
  74. package/dist/lib/helpers/UserGroupApiHelper.js +32 -0
  75. package/dist/lib/helpers/UserGroupApiHelper.js.map +1 -0
  76. package/dist/lib/helpers/index.d.ts +6 -0
  77. package/dist/lib/helpers/index.js +16 -0
  78. package/dist/lib/helpers/index.js.map +1 -0
  79. package/dist/lib/helpers/testExtension.d.ts +7 -0
  80. package/dist/lib/helpers/testExtension.js +17 -0
  81. package/dist/lib/helpers/testExtension.js.map +1 -0
  82. package/dist/lib/index.d.ts +1 -0
  83. package/dist/lib/index.js +5 -0
  84. package/dist/lib/index.js.map +1 -0
  85. package/dist/tsconfig.tsbuildinfo +1 -0
  86. package/dist/umbraco.config.d.ts +14 -0
  87. package/dist/umbraco.config.js +18 -0
  88. package/dist/umbraco.config.js.map +1 -0
  89. package/package.json +41 -0
@@ -0,0 +1,40 @@
1
+ export declare class AliasHelper {
2
+ /**
3
+ * Uses Camelize npm library to generate a safe alias from a string
4
+ * that may contain spaces and dashes etc
5
+ *
6
+ * @param {string} text Input string
7
+ * @returns {string} A camelcased string that starts with 'a' and ends with 'a'
8
+ * @see {@link https://www.npmjs.com/package/camelize}
9
+ */
10
+ static toSafeAlias(text: string): string;
11
+ /**
12
+ * Camel cases a string by calling the toCamelCase() method
13
+ *
14
+ * @param {string} text Input string
15
+ * @returns {string} A camelcased string
16
+ */
17
+ static toAlias(text: string): string;
18
+ /**
19
+ * Capatilze a string
20
+ *
21
+ * @param {string} text Input string
22
+ * @returns {string} A capatilized string, of the first character only
23
+ */
24
+ static capitalize(text: string): string;
25
+ /**
26
+ * Convert a sentence into camelCase
27
+ * `toCamelCase('My aWesome Example')` would return `myAwesomeExample`
28
+ *
29
+ * @param {string} sentenceCase Input string
30
+ * @returns {string} A camel cased string
31
+ */
32
+ static toCamelCase(sentenceCase: string): string;
33
+ /**
34
+ * Removes dashes from UUID string
35
+ *
36
+ * @param {string} uuid A string representing a UUID
37
+ * @returns {string} UUID without dashes
38
+ */
39
+ static uuidToAlias(uuid: string): string;
40
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AliasHelper = void 0;
4
+ const camelize_1 = require("camelize");
5
+ class AliasHelper {
6
+ /**
7
+ * Uses Camelize npm library to generate a safe alias from a string
8
+ * that may contain spaces and dashes etc
9
+ *
10
+ * @param {string} text Input string
11
+ * @returns {string} A camelcased string that starts with 'a' and ends with 'a'
12
+ * @see {@link https://www.npmjs.com/package/camelize}
13
+ */
14
+ static toSafeAlias(text) {
15
+ return 'a' + (0, camelize_1.default)(text) + 'a';
16
+ }
17
+ /**
18
+ * Camel cases a string by calling the toCamelCase() method
19
+ *
20
+ * @param {string} text Input string
21
+ * @returns {string} A camelcased string
22
+ */
23
+ static toAlias(text) {
24
+ return this.toCamelCase(text);
25
+ }
26
+ /**
27
+ * Capatilze a string
28
+ *
29
+ * @param {string} text Input string
30
+ * @returns {string} A capatilized string, of the first character only
31
+ */
32
+ static capitalize(text) {
33
+ if (typeof text !== 'string')
34
+ return '';
35
+ return text.charAt(0).toUpperCase() + text.slice(1);
36
+ }
37
+ /**
38
+ * Convert a sentence into camelCase
39
+ * `toCamelCase('My aWesome Example')` would return `myAwesomeExample`
40
+ *
41
+ * @param {string} sentenceCase Input string
42
+ * @returns {string} A camel cased string
43
+ */
44
+ static toCamelCase(sentenceCase) {
45
+ let out = '';
46
+ sentenceCase.split(' ').forEach((el, idx) => {
47
+ const add = el.toLowerCase();
48
+ out += idx === 0 ? add : add[0].toUpperCase() + add.slice(1);
49
+ });
50
+ return out;
51
+ }
52
+ /**
53
+ * Removes dashes from UUID string
54
+ *
55
+ * @param {string} uuid A string representing a UUID
56
+ * @returns {string} UUID without dashes
57
+ */
58
+ static uuidToAlias(uuid) {
59
+ uuid = uuid.replace(/-/g, '');
60
+ return this.toAlias(uuid);
61
+ }
62
+ }
63
+ exports.AliasHelper = AliasHelper;
64
+ //# sourceMappingURL=AliasHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AliasHelper.js","sourceRoot":"","sources":["../../../lib/helpers/AliasHelper.ts"],"names":[],"mappings":";;;AAAA,uCAAgC;AAEhC,MAAa,WAAW;IACtB;;;;;;;OAOG;IACH,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,OAAO,GAAG,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,IAAY;QAC5B,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAAC,YAAoB;QACrC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;YAC1C,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7B,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF;AA5DD,kCA4DC","sourcesContent":["import camelize from 'camelize';\n\nexport class AliasHelper {\n /**\n * Uses Camelize npm library to generate a safe alias from a string\n * that may contain spaces and dashes etc\n *\n * @param {string} text Input string\n * @returns {string} A camelcased string that starts with 'a' and ends with 'a'\n * @see {@link https://www.npmjs.com/package/camelize}\n */\n static toSafeAlias(text: string): string {\n return 'a' + camelize(text) + 'a';\n }\n\n /**\n * Camel cases a string by calling the toCamelCase() method\n *\n * @param {string} text Input string\n * @returns {string} A camelcased string\n */\n static toAlias(text: string): string {\n return this.toCamelCase(text);\n }\n\n /**\n * Capatilze a string\n *\n * @param {string} text Input string\n * @returns {string} A capatilized string, of the first character only\n */\n static capitalize(text: string): string {\n if (typeof text !== 'string') return '';\n return text.charAt(0).toUpperCase() + text.slice(1);\n }\n\n /**\n * Convert a sentence into camelCase\n * `toCamelCase('My aWesome Example')` would return `myAwesomeExample`\n *\n * @param {string} sentenceCase Input string\n * @returns {string} A camel cased string\n */\n static toCamelCase(sentenceCase: string): string {\n let out = '';\n sentenceCase.split(' ').forEach((el, idx) => {\n const add = el.toLowerCase();\n out += idx === 0 ? add : add[0].toUpperCase() + add.slice(1);\n });\n return out;\n }\n\n /**\n * Removes dashes from UUID string\n *\n * @param {string} uuid A string representing a UUID\n * @returns {string} UUID without dashes\n */\n static uuidToAlias(uuid: string): string {\n uuid = uuid.replace(/-/g, '');\n return this.toAlias(uuid);\n }\n}\n"]}
@@ -0,0 +1,49 @@
1
+ import { Page } from "@playwright/test";
2
+ import { DocumentTypeApiHelper } from "./DocumentTypeApiHelper";
3
+ import { TemplatesApiHelper } from "./TemplatesApiHelper";
4
+ import { ContentApiHelper } from "./ContentApiHelper";
5
+ import { LanguagesApiHelper } from "./LanguagesApiHelper";
6
+ import { UserApiHelper } from "./UserApiHelper";
7
+ import { UserGroupApiHelper } from "./UserGroupApiHelper";
8
+ import { MacroApiHelper } from "./MacroApiHelper";
9
+ import { MediaTypeApiHelper } from "./MediaTypeApiHelper";
10
+ import { MemberTypeApiHelper } from "./MemberTypeApiHelper";
11
+ import { DatatypeApiHelper } from "./DatatypeApiHelper";
12
+ import { StylesheetApiHelper } from "./StylesheetApiHelper";
13
+ import { ScriptApiHelper } from "./ScriptApiHelper";
14
+ import { PartialViewApiHelper } from "./PartialViewApiHelper";
15
+ import { RelationTypeApiHelper } from "./RelationTypeApiHelper";
16
+ import { PackageApiHelper } from "./PackageApiHelper";
17
+ import { MemberApiHelper } from "./MemberApiHelper";
18
+ import { MemberGroupApiHelper } from "./MemberGroupApiHelper";
19
+ import { MediaApiHelper } from "./MediaApiHelper";
20
+ import { DomainApiHelper } from "./DomainApiHelper";
21
+ export declare class ApiHelpers {
22
+ baseUrl: string;
23
+ content: ContentApiHelper;
24
+ dataTypes: DatatypeApiHelper;
25
+ documentTypes: DocumentTypeApiHelper;
26
+ languages: LanguagesApiHelper;
27
+ macros: MacroApiHelper;
28
+ mediaTypes: MediaTypeApiHelper;
29
+ memberGroups: MemberGroupApiHelper;
30
+ members: MemberApiHelper;
31
+ memberTypes: MemberTypeApiHelper;
32
+ packages: PackageApiHelper;
33
+ page: Page;
34
+ partialViews: PartialViewApiHelper;
35
+ relationTypes: RelationTypeApiHelper;
36
+ scripts: ScriptApiHelper;
37
+ stylesheets: StylesheetApiHelper;
38
+ templates: TemplatesApiHelper;
39
+ userGroups: UserGroupApiHelper;
40
+ users: UserApiHelper;
41
+ media: MediaApiHelper;
42
+ domain: DomainApiHelper;
43
+ constructor(page: Page);
44
+ getCsrfToken(): Promise<string>;
45
+ get(url: string): Promise<import("playwright-core").APIResponse>;
46
+ saveCodeFile(codeFile: any): Promise<import("playwright-core").APIResponse | undefined>;
47
+ post(url: string, data?: object): Promise<import("playwright-core").APIResponse>;
48
+ login(skipCheckTours?: boolean): Promise<void>;
49
+ }
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApiHelpers = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const DocumentTypeApiHelper_1 = require("./DocumentTypeApiHelper");
6
+ const JsonHelper_1 = require("./JsonHelper");
7
+ const TemplatesApiHelper_1 = require("./TemplatesApiHelper");
8
+ const umbraco_config_1 = require("../../umbraco.config");
9
+ const ContentApiHelper_1 = require("./ContentApiHelper");
10
+ const LanguagesApiHelper_1 = require("./LanguagesApiHelper");
11
+ const UserApiHelper_1 = require("./UserApiHelper");
12
+ const UserGroupApiHelper_1 = require("./UserGroupApiHelper");
13
+ const MacroApiHelper_1 = require("./MacroApiHelper");
14
+ const MediaTypeApiHelper_1 = require("./MediaTypeApiHelper");
15
+ const MemberTypeApiHelper_1 = require("./MemberTypeApiHelper");
16
+ const DatatypeApiHelper_1 = require("./DatatypeApiHelper");
17
+ const StylesheetApiHelper_1 = require("./StylesheetApiHelper");
18
+ const ScriptApiHelper_1 = require("./ScriptApiHelper");
19
+ const PartialViewApiHelper_1 = require("./PartialViewApiHelper");
20
+ const RelationTypeApiHelper_1 = require("./RelationTypeApiHelper");
21
+ const PackageApiHelper_1 = require("./PackageApiHelper");
22
+ const MemberApiHelper_1 = require("./MemberApiHelper");
23
+ const MemberGroupApiHelper_1 = require("./MemberGroupApiHelper");
24
+ const MediaApiHelper_1 = require("./MediaApiHelper");
25
+ const DomainApiHelper_1 = require("./DomainApiHelper");
26
+ class ApiHelpers {
27
+ baseUrl = umbraco_config_1.umbracoConfig.environment.baseUrl;
28
+ content;
29
+ dataTypes;
30
+ documentTypes;
31
+ languages;
32
+ macros;
33
+ mediaTypes;
34
+ memberGroups;
35
+ members;
36
+ memberTypes;
37
+ packages;
38
+ page;
39
+ partialViews;
40
+ relationTypes;
41
+ scripts;
42
+ stylesheets;
43
+ templates;
44
+ userGroups;
45
+ users;
46
+ media;
47
+ domain;
48
+ constructor(page) {
49
+ this.content = new ContentApiHelper_1.ContentApiHelper(this);
50
+ this.dataTypes = new DatatypeApiHelper_1.DatatypeApiHelper(this);
51
+ this.documentTypes = new DocumentTypeApiHelper_1.DocumentTypeApiHelper(this);
52
+ this.languages = new LanguagesApiHelper_1.LanguagesApiHelper(this);
53
+ this.macros = new MacroApiHelper_1.MacroApiHelper(this);
54
+ this.mediaTypes = new MediaTypeApiHelper_1.MediaTypeApiHelper(this);
55
+ this.memberGroups = new MemberGroupApiHelper_1.MemberGroupApiHelper(this);
56
+ this.members = new MemberApiHelper_1.MemberApiHelper(this);
57
+ this.memberTypes = new MemberTypeApiHelper_1.MemberTypeApiHelper(this);
58
+ this.packages = new PackageApiHelper_1.PackageApiHelper(this);
59
+ this.page = page;
60
+ this.partialViews = new PartialViewApiHelper_1.PartialViewApiHelper(this);
61
+ this.relationTypes = new RelationTypeApiHelper_1.RelationTypeApiHelper(this);
62
+ this.scripts = new ScriptApiHelper_1.ScriptApiHelper(this);
63
+ this.stylesheets = new StylesheetApiHelper_1.StylesheetApiHelper(this);
64
+ this.templates = new TemplatesApiHelper_1.TemplatesApiHelper(this);
65
+ this.userGroups = new UserGroupApiHelper_1.UserGroupApiHelper(this);
66
+ this.users = new UserApiHelper_1.UserApiHelper(this);
67
+ this.media = new MediaApiHelper_1.MediaApiHelper(this);
68
+ this.domain = new DomainApiHelper_1.DomainApiHelper(this);
69
+ }
70
+ async getCsrfToken() {
71
+ return (await this.page.context().cookies()).filter(x => x.name === 'UMB-XSRF-TOKEN')[0].value;
72
+ }
73
+ async get(url) {
74
+ const csrf = await this.getCsrfToken();
75
+ const options = {
76
+ headers: {
77
+ 'X-UMB-XSRF-TOKEN': csrf
78
+ },
79
+ ignoreHTTPSErrors: true
80
+ };
81
+ return this.page.request.get(url, options);
82
+ }
83
+ async saveCodeFile(codeFile) {
84
+ if (codeFile == null) {
85
+ return;
86
+ }
87
+ return await this.post(umbraco_config_1.umbracoConfig.environment.baseUrl + '/umbraco/backoffice/UmbracoApi/CodeFile/PostSave', codeFile);
88
+ }
89
+ async post(url, data) {
90
+ const csrf = await this.getCsrfToken();
91
+ const options = {
92
+ headers: {
93
+ 'X-UMB-XSRF-TOKEN': csrf
94
+ },
95
+ data: data,
96
+ ignoreHTTPSErrors: true
97
+ };
98
+ return await this.page.request.post(url, options);
99
+ }
100
+ async login(skipCheckTours = false) {
101
+ await this.page.request.post(umbraco_config_1.umbracoConfig.environment.baseUrl + '/umbraco/backoffice/UmbracoApi/Authentication/PostLogin', {
102
+ headers: {
103
+ contentType: 'application/json'
104
+ },
105
+ data: {
106
+ username: umbraco_config_1.umbracoConfig.user.login,
107
+ password: umbraco_config_1.umbracoConfig.user.password,
108
+ },
109
+ ignoreHTTPSErrors: true
110
+ });
111
+ if (!skipCheckTours) {
112
+ await this.page.goto(umbraco_config_1.umbracoConfig.environment.baseUrl + '/umbraco');
113
+ let toursClosed = false;
114
+ let response = await this.get(umbraco_config_1.umbracoConfig.environment.baseUrl + "/umbraco/backoffice/UmbracoApi/CurrentUser/GetUserTours");
115
+ const getUserToursBody = await JsonHelper_1.JsonHelper.getBody(response);
116
+ let umbEmailMarketingDisabled = false;
117
+ if (getUserToursBody == null || getUserToursBody.length === 0) {
118
+ // If length == 0, then the user has not disabled any tours => Tours will be shown
119
+ toursClosed = true;
120
+ }
121
+ else {
122
+ for (const userTourBody of getUserToursBody) {
123
+ if (userTourBody.alias === 'umbEmailMarketing') {
124
+ umbEmailMarketingDisabled = userTourBody.disabled;
125
+ }
126
+ if (userTourBody.disabled !== true) {
127
+ toursClosed = true;
128
+ }
129
+ }
130
+ }
131
+ if (toursClosed || umbEmailMarketingDisabled === false) {
132
+ // @ts-ignore
133
+ let tourSteps = await this.page.locator('.umb-tour-step', { timeout: 60000 }); // We now due to the api calls this will be shown, but slow computers can take a while
134
+ await (0, test_1.expect)(tourSteps).toBeVisible();
135
+ await this.page.click('.umb-tour-step__close');
136
+ }
137
+ }
138
+ }
139
+ }
140
+ exports.ApiHelpers = ApiHelpers;
141
+ //# sourceMappingURL=ApiHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiHelpers.js","sourceRoot":"","sources":["../../../lib/helpers/ApiHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {Page, expect} from \"@playwright/test\"\nimport {DocumentTypeApiHelper} from \"./DocumentTypeApiHelper\";\nimport {JsonHelper} from './JsonHelper';\nimport {TemplatesApiHelper} from \"./TemplatesApiHelper\";\nimport {umbracoConfig} from \"../../umbraco.config\";\nimport {ContentApiHelper} from \"./ContentApiHelper\";\nimport {LanguagesApiHelper} from \"./LanguagesApiHelper\";\nimport {UserApiHelper} from \"./UserApiHelper\";\nimport {UserGroupApiHelper} from \"./UserGroupApiHelper\";\nimport {MacroApiHelper} from \"./MacroApiHelper\";\nimport {MediaTypeApiHelper} from \"./MediaTypeApiHelper\";\nimport {MemberTypeApiHelper} from \"./MemberTypeApiHelper\";\nimport {DatatypeApiHelper} from \"./DatatypeApiHelper\";\nimport {StylesheetApiHelper} from \"./StylesheetApiHelper\";\nimport {ScriptApiHelper} from \"./ScriptApiHelper\";\nimport {PartialViewApiHelper} from \"./PartialViewApiHelper\";\nimport {RelationTypeApiHelper} from \"./RelationTypeApiHelper\";\nimport {PackageApiHelper} from \"./PackageApiHelper\";\nimport {MemberApiHelper} from \"./MemberApiHelper\";\nimport {MemberGroupApiHelper} from \"./MemberGroupApiHelper\";\nimport {MediaApiHelper} from \"./MediaApiHelper\";\nimport {DomainApiHelper} from \"./DomainApiHelper\";\n\nexport class ApiHelpers {\n baseUrl: string = umbracoConfig.environment.baseUrl;\n content: ContentApiHelper;\n dataTypes: DatatypeApiHelper;\n documentTypes: DocumentTypeApiHelper;\n languages: LanguagesApiHelper;\n macros: MacroApiHelper;\n mediaTypes: MediaTypeApiHelper;\n memberGroups: MemberGroupApiHelper;\n members: MemberApiHelper;\n memberTypes: MemberTypeApiHelper;\n packages: PackageApiHelper;\n page: Page;\n partialViews: PartialViewApiHelper;\n relationTypes: RelationTypeApiHelper;\n scripts: ScriptApiHelper;\n stylesheets: StylesheetApiHelper;\n templates: TemplatesApiHelper;\n userGroups: UserGroupApiHelper;\n users: UserApiHelper;\n media: MediaApiHelper;\n domain: DomainApiHelper;\n\n constructor(page: Page) {\n this.content = new ContentApiHelper(this);\n this.dataTypes = new DatatypeApiHelper(this);\n this.documentTypes = new DocumentTypeApiHelper(this);\n this.languages = new LanguagesApiHelper(this);\n this.macros = new MacroApiHelper(this);\n this.mediaTypes = new MediaTypeApiHelper(this);\n this.memberGroups = new MemberGroupApiHelper(this);\n this.members = new MemberApiHelper(this);\n this.memberTypes = new MemberTypeApiHelper(this);\n this.packages = new PackageApiHelper(this);\n this.page = page;\n this.partialViews = new PartialViewApiHelper(this);\n this.relationTypes = new RelationTypeApiHelper(this);\n this.scripts = new ScriptApiHelper(this);\n this.stylesheets = new StylesheetApiHelper(this);\n this.templates = new TemplatesApiHelper(this);\n this.userGroups = new UserGroupApiHelper(this);\n this.users = new UserApiHelper(this);\n this.media = new MediaApiHelper(this);\n this.domain = new DomainApiHelper(this);\n }\n\n async getCsrfToken() {\n return (await this.page.context().cookies()).filter(x => x.name === 'UMB-XSRF-TOKEN')[0].value;\n }\n\n async get(url: string) {\n const csrf = await this.getCsrfToken();\n const options = {\n headers: {\n 'X-UMB-XSRF-TOKEN': csrf\n },\n ignoreHTTPSErrors: true\n }\n return this.page.request.get(url, options);\n }\n \n async saveCodeFile(codeFile){\n if (codeFile == null) {\n return;\n }\n \n return await this.post(umbracoConfig.environment.baseUrl + '/umbraco/backoffice/UmbracoApi/CodeFile/PostSave', codeFile)\n }\n\n async post(url: string, data?: object) {\n const csrf = await this.getCsrfToken();\n const options = {\n headers: {\n 'X-UMB-XSRF-TOKEN': csrf\n },\n data: data,\n ignoreHTTPSErrors: true\n }\n return await this.page.request.post(url, options);\n }\n\n async login(skipCheckTours: boolean = false) {\n await this.page.request.post(umbracoConfig.environment.baseUrl + '/umbraco/backoffice/UmbracoApi/Authentication/PostLogin', {\n headers: {\n contentType: 'application/json'\n },\n data: {\n username: umbracoConfig.user.login,\n password: umbracoConfig.user.password,\n },\n ignoreHTTPSErrors: true\n });\n\n if (!skipCheckTours) {\n await this.page.goto(umbracoConfig.environment.baseUrl + '/umbraco');\n let toursClosed = false;\n let response = await this.get(umbracoConfig.environment.baseUrl + \"/umbraco/backoffice/UmbracoApi/CurrentUser/GetUserTours\");\n const getUserToursBody = await JsonHelper.getBody(response);\n let umbEmailMarketingDisabled = false;\n if (getUserToursBody == null || getUserToursBody.length === 0) {\n // If length == 0, then the user has not disabled any tours => Tours will be shown\n toursClosed = true;\n } else {\n for (const userTourBody of getUserToursBody) {\n if (userTourBody.alias === 'umbEmailMarketing') {\n umbEmailMarketingDisabled = userTourBody.disabled;\n }\n if (userTourBody.disabled !== true) {\n toursClosed = true;\n }\n }\n }\n if (toursClosed || umbEmailMarketingDisabled === false) {\n // @ts-ignore\n let tourSteps = await this.page.locator('.umb-tour-step', {timeout: 60000}); // We now due to the api calls this will be shown, but slow computers can take a while\n await expect(tourSteps).toBeVisible();\n await this.page.click('.umb-tour-step__close');\n }\n }\n\n }\n\n}\n\n"]}
@@ -0,0 +1,33 @@
1
+ export declare class ConstantHelper {
2
+ static readonly actions: {
3
+ copy: string;
4
+ create: string;
5
+ dataType: string;
6
+ documentType: string;
7
+ delete: string;
8
+ move: string;
9
+ sort: string;
10
+ };
11
+ static readonly buttons: {
12
+ close: string;
13
+ delete: string;
14
+ download: string;
15
+ insert: string;
16
+ ok: string;
17
+ save: string;
18
+ saveAndPublish: string;
19
+ submit: string;
20
+ rollback: string;
21
+ };
22
+ static readonly contentApps: {
23
+ info: string;
24
+ };
25
+ static readonly sections: {
26
+ content: string;
27
+ member: string;
28
+ packages: string;
29
+ settings: string;
30
+ media: string;
31
+ users: string;
32
+ };
33
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConstantHelper = void 0;
4
+ class ConstantHelper {
5
+ static actions = {
6
+ copy: "action-copy",
7
+ create: "action-create",
8
+ dataType: "action-data-type",
9
+ documentType: "action-documentType",
10
+ delete: "action-delete",
11
+ move: "action-move",
12
+ sort: "action-sort",
13
+ };
14
+ static buttons = {
15
+ close: "general_close",
16
+ delete: "general_delete",
17
+ download: "general_download",
18
+ insert: "general_insert",
19
+ ok: "general_ok",
20
+ save: "buttons_save",
21
+ saveAndPublish: "buttons_saveAndPublish",
22
+ submit: "general_submit",
23
+ rollback: "actions_rollback"
24
+ };
25
+ static contentApps = {
26
+ info: '[data-element="sub-view-umbInfo"]',
27
+ };
28
+ static sections = {
29
+ content: "content",
30
+ member: "member",
31
+ packages: "packages",
32
+ settings: "settings",
33
+ media: "media",
34
+ users: "users",
35
+ };
36
+ }
37
+ exports.ConstantHelper = ConstantHelper;
38
+ //# sourceMappingURL=ConstantHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConstantHelper.js","sourceRoot":"","sources":["../../../lib/helpers/ConstantHelper.ts"],"names":[],"mappings":";;;AAAA,MAAa,cAAc;IAEhB,MAAM,CAAU,OAAO,GAAG;QAC7B,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,kBAAkB;QAC5B,YAAY,EAAE,qBAAqB;QACnC,MAAM,EAAE,eAAe;QACvB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,aAAa;KACtB,CAAA;IAEM,MAAM,CAAU,OAAO,GAAG;QAC7B,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,gBAAgB;QACxB,QAAQ,EAAE,kBAAkB;QAC5B,MAAM,EAAE,gBAAgB;QACxB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,cAAc;QACpB,cAAc,EAAE,wBAAwB;QACxC,MAAM,EAAE,gBAAgB;QACxB,QAAQ,EAAE,kBAAkB;KAC/B,CAAA;IAEM,MAAM,CAAU,WAAW,GAAG;QACjC,IAAI,EAAE,mCAAmC;KAC5C,CAAA;IAEM,MAAM,CAAU,QAAQ,GAAG;QAC9B,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO;KACjB,CAAA;;AAnCL,wCAoCC","sourcesContent":["export class ConstantHelper {\n\n public static readonly actions = {\n copy: \"action-copy\",\n create: \"action-create\",\n dataType: \"action-data-type\",\n documentType: \"action-documentType\",\n delete: \"action-delete\",\n move: \"action-move\",\n sort: \"action-sort\",\n }\n \n public static readonly buttons = {\n close: \"general_close\",\n delete: \"general_delete\",\n download: \"general_download\",\n insert: \"general_insert\",\n ok: \"general_ok\",\n save: \"buttons_save\",\n saveAndPublish: \"buttons_saveAndPublish\",\n submit: \"general_submit\",\n rollback: \"actions_rollback\"\n }\n \n public static readonly contentApps = {\n info: '[data-element=\"sub-view-umbInfo\"]',\n }\n\n public static readonly sections = {\n content: \"content\",\n member: \"member\",\n packages: \"packages\",\n settings: \"settings\",\n media: \"media\",\n users: \"users\",\n }\n}\n\n"]}
@@ -0,0 +1,13 @@
1
+ import { ApiHelpers } from "./ApiHelpers";
2
+ export declare class ContentApiHelper {
3
+ api: ApiHelpers;
4
+ constructor(api: ApiHelpers);
5
+ createDocTypeWithContent(name: any, alias: any, dataTypeBuilder: any): Promise<void>;
6
+ deleteAllContent(): Promise<void>;
7
+ deleteById(id: any): Promise<void>;
8
+ verifyRenderedContent(endpoint: any, expectedContent: any, removeWhitespace?: boolean): Promise<boolean>;
9
+ save(content: any): Promise<any>;
10
+ getContentId(name: string): Promise<null>;
11
+ clearRecycleBin(): Promise<void>;
12
+ createDocWithCultureVariationWithContent(name: any, alias: any, language1: any, language2: any, value: any, isPublished: any): Promise<void>;
13
+ }
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentApiHelper = void 0;
4
+ const JsonHelper_1 = require("./JsonHelper");
5
+ const node_fetch_1 = require("node-fetch");
6
+ const playwright_models_1 = require("@umbraco/playwright-models");
7
+ const https = require('https');
8
+ const FormData = require('form-data');
9
+ class ContentApiHelper {
10
+ api;
11
+ constructor(api) {
12
+ this.api = api;
13
+ }
14
+ async createDocTypeWithContent(name, alias, dataTypeBuilder) {
15
+ await this.api.dataTypes.save(dataTypeBuilder).then(async (response) => {
16
+ // Create a document type using the data type
17
+ const docType = new playwright_models_1.DocumentTypeBuilder()
18
+ .withName(name)
19
+ .withAlias(alias)
20
+ .withAllowAsRoot(true)
21
+ .withDefaultTemplate(alias)
22
+ .addGroup()
23
+ .addCustomProperty(response.id)
24
+ .withAlias('umbracoTest')
25
+ .done()
26
+ .done()
27
+ .build();
28
+ this.api.documentTypes.save(docType).then(async (generatedDocType) => {
29
+ const contentNode = new playwright_models_1.ContentBuilder()
30
+ .withContentTypeAlias(generatedDocType['alias'])
31
+ .addVariant()
32
+ .withName(name)
33
+ .withSave(true)
34
+ .done()
35
+ .build();
36
+ await this.api.content.save(contentNode);
37
+ });
38
+ });
39
+ }
40
+ async deleteAllContent() {
41
+ const response = await this.api.get(this.api.baseUrl + `/umbraco/backoffice/UmbracoTrees/ApplicationTree/GetApplicationTrees?application=content&tree=&use=main`);
42
+ const content = await JsonHelper_1.JsonHelper.getBody(response);
43
+ if (content !== null) {
44
+ for (const child of content.children) {
45
+ if (child.id > 0) {
46
+ await this.deleteById(child.id);
47
+ }
48
+ }
49
+ await this.clearRecycleBin();
50
+ }
51
+ }
52
+ async deleteById(id) {
53
+ await this.api.post(this.api.baseUrl + `/umbraco/backoffice/UmbracoApi/Content/DeleteById?id=${id}`);
54
+ }
55
+ async verifyRenderedContent(endpoint, expectedContent, removeWhitespace = false) {
56
+ const response = await this.api.get(this.api.baseUrl + endpoint);
57
+ let body = (await response.body()).toString();
58
+ if (removeWhitespace) {
59
+ expectedContent = expectedContent.replace(/\s/g, '');
60
+ body = body.replace(/\s/g, '');
61
+ }
62
+ return body === expectedContent;
63
+ }
64
+ async save(content) {
65
+ const url = this.api.baseUrl + "/umbraco/backoffice/UmbracoApi/Content/PostSave";
66
+ const formData = new FormData();
67
+ formData.append('contentItem', JSON.stringify(content));
68
+ // This is a bit weird, but essentially playwright doesn't handle the way we send content very well.
69
+ // Instead we have to save the content with a normal fetch request,
70
+ // however this request won't be sent from the browser which is logged in,
71
+ // it'll instead be sent from the runner controlling the browser.
72
+ // What this all means is that we must hijack the cookies of the browser, and use that when sending the request.
73
+ const context = this.api.page.context();
74
+ const cookies = await context.cookies();
75
+ let cookieHeader = "";
76
+ for (const cook of cookies) {
77
+ cookieHeader += cook.name + "=" + cook.value + ";";
78
+ }
79
+ // Since this will mostly be run on local sites, there will be either no SSL certificate, or a self signed one,
80
+ // so make fetch ignore SSL certificate verification.
81
+ const httpsAgent = new https.Agent({
82
+ rejectUnauthorized: false
83
+ });
84
+ const response = await (0, node_fetch_1.default)(url, {
85
+ method: 'POST',
86
+ body: formData,
87
+ headers: {
88
+ 'X-UMB-XSRF-TOKEN': await this.api.getCsrfToken(),
89
+ 'Cookie': cookieHeader
90
+ },
91
+ agent: httpsAgent
92
+ });
93
+ let json = await response.text();
94
+ return JsonHelper_1.JsonHelper.parseString(json);
95
+ }
96
+ async getContentId(name) {
97
+ const response = await this.api.get(this.api.baseUrl + `/umbraco/backoffice/UmbracoTrees/ApplicationTree/GetApplicationTrees?application=content&tree=&use=main`);
98
+ const content = await JsonHelper_1.JsonHelper.getBody(response);
99
+ let contentNameId = null;
100
+ if (content !== null) {
101
+ for (const child of content.children) {
102
+ if (child.name == name) {
103
+ contentNameId = child.id;
104
+ }
105
+ }
106
+ }
107
+ return contentNameId;
108
+ }
109
+ async clearRecycleBin() {
110
+ await this.api.post(this.api.baseUrl + '/umbraco/backoffice/umbracoApi/media/EmptyRecycleBin');
111
+ }
112
+ async createDocWithCultureVariationWithContent(name, alias, language1, language2, value, isPublished) {
113
+ const rootDocType = new playwright_models_1.DocumentTypeBuilder()
114
+ .withName(name)
115
+ .withAlias(alias)
116
+ .withAllowAsRoot(true)
117
+ .withAllowCultureVariation(true)
118
+ .withDefaultTemplate(alias)
119
+ .addGroup()
120
+ .withName("Content")
121
+ .addTextBoxProperty()
122
+ .withLabel("Title")
123
+ .withAlias("title")
124
+ .done()
125
+ .done()
126
+ .build();
127
+ await this.api.documentTypes.save(rootDocType).then(async (generatedRootDocType) => {
128
+ const childContentNode = new playwright_models_1.ContentBuilder()
129
+ .withContentTypeAlias(generatedRootDocType["alias"])
130
+ .withAction("publishNew")
131
+ .addVariant()
132
+ .withCulture(language1)
133
+ .withName(language1)
134
+ .withSave(true)
135
+ .withPublish(isPublished)
136
+ .addProperty()
137
+ .withAlias("title")
138
+ .withValue(value)
139
+ .done()
140
+ .done()
141
+ .addVariant()
142
+ .withCulture(language2)
143
+ .withName(language2)
144
+ .withSave(true)
145
+ .withPublish(isPublished)
146
+ .done()
147
+ .build();
148
+ await this.save(childContentNode);
149
+ });
150
+ }
151
+ }
152
+ exports.ContentApiHelper = ContentApiHelper;
153
+ //# sourceMappingURL=ContentApiHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentApiHelper.js","sourceRoot":"","sources":["../../../lib/helpers/ContentApiHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import {ApiHelpers} from \"./ApiHelpers\";\nimport {JsonHelper} from \"./JsonHelper\";\nimport fetch from 'node-fetch';\nimport {ContentBuilder, DocumentTypeBuilder} from '@umbraco/playwright-models';\n\nconst https = require('https');\nconst FormData = require('form-data');\n\nexport class ContentApiHelper {\n api: ApiHelpers\n\n constructor(api: ApiHelpers) {\n this.api = api;\n }\n\n async createDocTypeWithContent(name, alias, dataTypeBuilder) {\n await this.api.dataTypes.save(dataTypeBuilder).then(async (response) => {\n // Create a document type using the data type\n const docType = new DocumentTypeBuilder()\n .withName(name)\n .withAlias(alias)\n .withAllowAsRoot(true)\n .withDefaultTemplate(alias)\n .addGroup()\n .addCustomProperty(response.id)\n .withAlias('umbracoTest')\n .done()\n .done()\n .build();\n\n this.api.documentTypes.save(docType).then(async (generatedDocType) => {\n const contentNode = new ContentBuilder()\n .withContentTypeAlias(generatedDocType['alias'])\n .addVariant()\n .withName(name)\n .withSave(true)\n .done()\n .build();\n\n await this.api.content.save(contentNode);\n });\n });\n }\n\n async deleteAllContent() {\n const response = await this.api.get(this.api.baseUrl + `/umbraco/backoffice/UmbracoTrees/ApplicationTree/GetApplicationTrees?application=content&tree=&use=main`);\n const content = await JsonHelper.getBody(response);\n\n if (content !== null) {\n for (const child of content.children) {\n if (child.id > 0) {\n await this.deleteById(child.id);\n }\n }\n await this.clearRecycleBin();\n }\n }\n\n async deleteById(id) {\n await this.api.post(this.api.baseUrl + `/umbraco/backoffice/UmbracoApi/Content/DeleteById?id=${id}`)\n }\n\n async verifyRenderedContent(endpoint, expectedContent, removeWhitespace = false) {\n const response = await this.api.get(this.api.baseUrl + endpoint);\n let body = (await response.body()).toString();\n\n if (removeWhitespace) {\n expectedContent = expectedContent.replace(/\\s/g, '');\n body = body.replace(/\\s/g, '');\n }\n\n return body === expectedContent;\n }\n\n async save(content) {\n const url = this.api.baseUrl + \"/umbraco/backoffice/UmbracoApi/Content/PostSave\";\n const formData = new FormData();\n formData.append('contentItem', JSON.stringify(content));\n\n // This is a bit weird, but essentially playwright doesn't handle the way we send content very well.\n // Instead we have to save the content with a normal fetch request, \n // however this request won't be sent from the browser which is logged in,\n // it'll instead be sent from the runner controlling the browser.\n // What this all means is that we must hijack the cookies of the browser, and use that when sending the request.\n\n const context = this.api.page.context();\n const cookies = await context.cookies();\n let cookieHeader = \"\";\n for (const cook of cookies) {\n cookieHeader += cook.name + \"=\" + cook.value + \";\";\n }\n\n // Since this will mostly be run on local sites, there will be either no SSL certificate, or a self signed one,\n // so make fetch ignore SSL certificate verification.\n const httpsAgent = new https.Agent({\n rejectUnauthorized: false\n });\n\n const response = await fetch(url, {\n method: 'POST',\n body: formData,\n headers: {\n 'X-UMB-XSRF-TOKEN': await this.api.getCsrfToken(),\n 'Cookie': cookieHeader\n },\n agent: httpsAgent\n });\n\n let json = await response.text();\n return JsonHelper.parseString(json);\n }\n \n async getContentId(name : string) {\n const response = await this.api.get(this.api.baseUrl + `/umbraco/backoffice/UmbracoTrees/ApplicationTree/GetApplicationTrees?application=content&tree=&use=main`);\n const content = await JsonHelper.getBody(response);\n\n let contentNameId = null;\n \n if (content !== null) {\n for (const child of content.children) {\n if (child.name == name) {\n contentNameId = child.id;\n }\n }\n }\n return contentNameId;\n }\n \n async clearRecycleBin(){\n await this.api.post(this.api.baseUrl + '/umbraco/backoffice/umbracoApi/media/EmptyRecycleBin');\n }\n \n async createDocWithCultureVariationWithContent(name, alias, language1, language2, value, isPublished){\n const rootDocType = new DocumentTypeBuilder()\n .withName(name)\n .withAlias(alias)\n .withAllowAsRoot(true)\n .withAllowCultureVariation(true)\n .withDefaultTemplate(alias)\n .addGroup()\n .withName(\"Content\")\n .addTextBoxProperty()\n .withLabel(\"Title\")\n .withAlias(\"title\")\n .done()\n .done()\n .build();\n\n await this.api.documentTypes.save(rootDocType).then(async (generatedRootDocType) => {\n const childContentNode = new ContentBuilder()\n .withContentTypeAlias(generatedRootDocType[\"alias\"])\n .withAction(\"publishNew\")\n .addVariant()\n .withCulture(language1)\n .withName(language1)\n .withSave(true)\n .withPublish(isPublished)\n .addProperty()\n .withAlias(\"title\")\n .withValue(value)\n .done()\n .done()\n .addVariant()\n .withCulture(language2)\n .withName(language2)\n .withSave(true)\n .withPublish(isPublished)\n .done()\n .build();\n\n await this.save(childContentNode);\n });\n }\n \n}"]}
@@ -0,0 +1,7 @@
1
+ import { ApiHelpers } from "./ApiHelpers";
2
+ export declare class DatatypeApiHelper {
3
+ api: ApiHelpers;
4
+ constructor(api: ApiHelpers);
5
+ ensureNameNotExists(name: string): Promise<void>;
6
+ save(dataType: any): Promise<any>;
7
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatatypeApiHelper = void 0;
4
+ const umbraco_config_1 = require("../../umbraco.config");
5
+ const JsonHelper_1 = require("./JsonHelper");
6
+ class DatatypeApiHelper {
7
+ api;
8
+ constructor(api) {
9
+ this.api = api;
10
+ }
11
+ async ensureNameNotExists(name) {
12
+ const response = await this.api.get(`${umbraco_config_1.umbracoConfig.environment.baseUrl}/umbraco/backoffice/UmbracoApi/DataType/GetByName?name=${name}`);
13
+ const content = await JsonHelper_1.JsonHelper.getBody(response);
14
+ if (content != null) {
15
+ const dataTypeId = content.id;
16
+ if (dataTypeId !== null) {
17
+ await this.api.post(`${umbraco_config_1.umbracoConfig.environment.baseUrl}/umbraco/backoffice/UmbracoApi/DataType/DeleteById?id=${dataTypeId}`);
18
+ }
19
+ }
20
+ }
21
+ async save(dataType) {
22
+ if (dataType == null) {
23
+ return;
24
+ }
25
+ const datatype = await this.api.post(`${umbraco_config_1.umbracoConfig.environment.baseUrl}/umbraco/backoffice/UmbracoApi/DataType/PostSave`, dataType);
26
+ return await JsonHelper_1.JsonHelper.getBody(datatype);
27
+ }
28
+ }
29
+ exports.DatatypeApiHelper = DatatypeApiHelper;
30
+ //# sourceMappingURL=DatatypeApiHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatatypeApiHelper.js","sourceRoot":"","sources":["../../../lib/helpers/DatatypeApiHelper.ts"],"names":[],"mappings":";;;AACA,yDAAmD;AACnD,6CAAwC;AAExC,MAAa,iBAAiB;IAC5B,GAAG,CAAY;IAEf,YAAY,GAAe;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAY;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,8BAAa,CAAC,WAAW,CAAC,OAAO,0DAA0D,IAAI,EAAE,CAAC,CAAC;QAC1I,MAAM,OAAO,GAAG,MAAM,uBAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnD,IAAG,OAAO,IAAI,IAAI,EAAC;YACjB,MAAM,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC;YAE9B,IAAG,UAAU,KAAK,IAAI,EAAC;gBACrB,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,8BAAa,CAAC,WAAW,CAAC,OAAO,yDAAyD,UAAU,EAAE,CAAC,CAAC;aAChI;SACF;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAa;QACtB,IAAG,QAAQ,IAAI,IAAI,EAAC;YAClB,OAAO;SACR;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,8BAAa,CAAC,WAAW,CAAC,OAAO,kDAAkD,EAAE,QAAQ,CAAC,CAAC;QACvI,OAAO,MAAM,uBAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;CACF;AA5BD,8CA4BC","sourcesContent":["import {ApiHelpers} from \"./ApiHelpers\";\nimport {umbracoConfig} from \"../../umbraco.config\";\nimport {JsonHelper} from \"./JsonHelper\";\n\nexport class DatatypeApiHelper {\n api: ApiHelpers\n \n constructor(api: ApiHelpers) {\n this.api = api;\n }\n \n async ensureNameNotExists(name: string){\n const response = await this.api.get(`${umbracoConfig.environment.baseUrl}/umbraco/backoffice/UmbracoApi/DataType/GetByName?name=${name}`);\n const content = await JsonHelper.getBody(response);\n \n if(content != null){\n const dataTypeId = content.id;\n \n if(dataTypeId !== null){\n await this.api.post(`${umbracoConfig.environment.baseUrl}/umbraco/backoffice/UmbracoApi/DataType/DeleteById?id=${dataTypeId}`);\n }\n }\n }\n \n async save(dataType: any){\n if(dataType == null){\n return;\n }\n \n const datatype = await this.api.post(`${umbracoConfig.environment.baseUrl}/umbraco/backoffice/UmbracoApi/DataType/PostSave`, dataType);\n return await JsonHelper.getBody(datatype);\n }\n}"]}