@crowdin/app-project-module 0.108.0 → 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 (202) hide show
  1. package/out/app-test/integration/get-integration-files.js +16 -4
  2. package/out/app-test/integration/types.d.ts +1 -1
  3. package/out/app-test/integration/update-crowdin.js +2 -2
  4. package/out/app-test/integration/update-integration.js +2 -2
  5. package/out/index.d.ts +2 -1
  6. package/out/index.js +73 -30
  7. package/out/middlewares/auto-credentials-masker.d.ts +4 -0
  8. package/out/middlewares/auto-credentials-masker.js +45 -0
  9. package/out/middlewares/crowdin-client.d.ts +1 -1
  10. package/out/middlewares/integration-credentials.d.ts +2 -2
  11. package/out/middlewares/integration-credentials.js +7 -4
  12. package/out/middlewares/render-ui-module.d.ts +3 -3
  13. package/out/middlewares/render-ui-module.js +10 -13
  14. package/out/middlewares/ui-module.d.ts +1 -1
  15. package/out/middlewares/ui-module.js +11 -1
  16. package/out/modules/about.d.ts +2 -1
  17. package/out/modules/about.js +10 -3
  18. package/out/modules/ai-prompt-provider/handlers/compile.d.ts +1 -1
  19. package/out/modules/ai-prompt-provider/handlers/compile.js +7 -1
  20. package/out/modules/ai-prompt-provider/index.js +2 -2
  21. package/out/modules/ai-prompt-provider/types.d.ts +7 -1
  22. package/out/modules/ai-provider/handlers/chat-completions.d.ts +1 -1
  23. package/out/modules/ai-provider/handlers/chat-completions.js +1 -1
  24. package/out/modules/ai-provider/handlers/get-model-list.d.ts +1 -1
  25. package/out/modules/ai-provider/index.js +2 -2
  26. package/out/modules/ai-provider/types.d.ts +4 -4
  27. package/out/modules/ai-request-processors/handler.d.ts +1 -1
  28. package/out/modules/ai-request-processors/handler.js +12 -2
  29. package/out/modules/ai-request-processors/types.d.ts +12 -2
  30. package/out/modules/ai-tools/handlers/tool-calls.d.ts +1 -1
  31. package/out/modules/ai-tools/handlers/tool-calls.js +1 -1
  32. package/out/modules/ai-tools/index.js +1 -1
  33. package/out/modules/ai-tools/types.d.ts +1 -1
  34. package/out/modules/auth-guard/handlers/verify.d.ts +1 -1
  35. package/out/modules/auth-guard/index.js +1 -1
  36. package/out/modules/automation-action/handlers/execute.d.ts +1 -1
  37. package/out/modules/automation-action/handlers/execute.js +1 -1
  38. package/out/modules/automation-action/handlers/input-schema.d.ts +1 -1
  39. package/out/modules/automation-action/handlers/output-schema.d.ts +1 -1
  40. package/out/modules/automation-action/handlers/validate-settings.d.ts +1 -1
  41. package/out/modules/automation-action/handlers/validate-settings.js +1 -1
  42. package/out/modules/automation-action/index.js +1 -1
  43. package/out/modules/automation-action/types.d.ts +4 -4
  44. package/out/modules/automation-action/util/index.js +2 -5
  45. package/out/modules/context-menu/index.js +2 -2
  46. package/out/modules/custom-mt/handlers/translate.d.ts +1 -1
  47. package/out/modules/custom-mt/handlers/translate.js +25 -9
  48. package/out/modules/custom-mt/index.js +3 -3
  49. package/out/modules/custom-mt/types.d.ts +10 -2
  50. package/out/modules/custom-spell-check/handlers/get-languages-list.d.ts +1 -1
  51. package/out/modules/custom-spell-check/handlers/spell-check.d.ts +1 -1
  52. package/out/modules/custom-spell-check/index.js +4 -4
  53. package/out/modules/editor-right-panel/index.js +1 -1
  54. package/out/modules/external-qa-check/handlers/validate.d.ts +1 -1
  55. package/out/modules/external-qa-check/index.js +2 -2
  56. package/out/modules/file-processing/handlers/custom-file-format.d.ts +7 -2
  57. package/out/modules/file-processing/handlers/custom-file-format.js +62 -22
  58. package/out/modules/file-processing/handlers/file-download.d.ts +1 -1
  59. package/out/modules/file-processing/handlers/file-download.js +5 -0
  60. package/out/modules/file-processing/handlers/pre-post-process.d.ts +1 -1
  61. package/out/modules/file-processing/handlers/pre-post-process.js +41 -15
  62. package/out/modules/file-processing/handlers/translations-alignment.d.ts +1 -1
  63. package/out/modules/file-processing/handlers/translations-alignment.js +10 -4
  64. package/out/modules/file-processing/index.js +12 -2
  65. package/out/modules/file-processing/types.d.ts +36 -5
  66. package/out/modules/file-processing/util/defaults.js +50 -6
  67. package/out/modules/file-processing/util/files.js +2 -1
  68. package/out/modules/form-data-display.d.ts +1 -1
  69. package/out/modules/form-data-save.d.ts +1 -1
  70. package/out/modules/install.d.ts +1 -1
  71. package/out/modules/integration/handlers/crowdin-file-progress.d.ts +1 -1
  72. package/out/modules/integration/handlers/crowdin-file-progress.js +5 -1
  73. package/out/modules/integration/handlers/crowdin-files-target-languages.d.ts +5 -0
  74. package/out/modules/integration/handlers/crowdin-files-target-languages.js +103 -0
  75. package/out/modules/integration/handlers/crowdin-files.d.ts +1 -1
  76. package/out/modules/integration/handlers/crowdin-files.js +7 -1
  77. package/out/modules/integration/handlers/crowdin-project.d.ts +1 -1
  78. package/out/modules/integration/handlers/crowdin-update.d.ts +1 -1
  79. package/out/modules/integration/handlers/crowdin-update.js +59 -18
  80. package/out/modules/integration/handlers/crowdin-webhook.d.ts +1 -1
  81. package/out/modules/integration/handlers/crowdin-webhook.js +15 -8
  82. package/out/modules/integration/handlers/integration-data.d.ts +1 -1
  83. package/out/modules/integration/handlers/integration-data.js +13 -6
  84. package/out/modules/integration/handlers/integration-login.d.ts +1 -1
  85. package/out/modules/integration/handlers/integration-logout.d.ts +1 -1
  86. package/out/modules/integration/handlers/integration-logout.js +8 -3
  87. package/out/modules/integration/handlers/integration-update.d.ts +1 -1
  88. package/out/modules/integration/handlers/integration-update.js +44 -6
  89. package/out/modules/integration/handlers/integration-webhook.d.ts +1 -1
  90. package/out/modules/integration/handlers/invite-users.d.ts +1 -1
  91. package/out/modules/integration/handlers/job-cancel.d.ts +1 -1
  92. package/out/modules/integration/handlers/job-info-deprecated.d.ts +1 -1
  93. package/out/modules/integration/handlers/job-info-deprecated.js +3 -2
  94. package/out/modules/integration/handlers/job-info.d.ts +1 -1
  95. package/out/modules/integration/handlers/job-list.d.ts +1 -1
  96. package/out/modules/integration/handlers/main.d.ts +1 -1
  97. package/out/modules/integration/handlers/main.js +32 -2
  98. package/out/modules/integration/handlers/oauth-login.d.ts +1 -1
  99. package/out/modules/integration/handlers/oauth-login.js +28 -6
  100. package/out/modules/integration/handlers/oauth-polling.d.ts +1 -1
  101. package/out/modules/integration/handlers/oauth-url.d.ts +1 -1
  102. package/out/modules/integration/handlers/settings-save.d.ts +1 -1
  103. package/out/modules/integration/handlers/settings-save.js +9 -9
  104. package/out/modules/integration/handlers/settings.d.ts +1 -1
  105. package/out/modules/integration/handlers/sync-settings-save.d.ts +1 -1
  106. package/out/modules/integration/handlers/sync-settings-save.js +5 -9
  107. package/out/modules/integration/handlers/sync-settings.d.ts +1 -1
  108. package/out/modules/integration/handlers/user-errors.d.ts +1 -1
  109. package/out/modules/integration/handlers/users.d.ts +1 -1
  110. package/out/modules/integration/index.js +19 -33
  111. package/out/modules/integration/types.d.ts +133 -29
  112. package/out/modules/integration/types.js +1 -0
  113. package/out/modules/integration/util/cron.d.ts +2 -2
  114. package/out/modules/integration/util/cron.js +40 -24
  115. package/out/modules/integration/util/defaults.d.ts +4 -0
  116. package/out/modules/integration/util/defaults.js +175 -15
  117. package/out/modules/integration/util/files.d.ts +2 -1
  118. package/out/modules/integration/util/files.js +19 -8
  119. package/out/modules/integration/util/job.js +4 -3
  120. package/out/modules/integration/util/snapshot.js +19 -3
  121. package/out/modules/integration/util/types.d.ts +1 -0
  122. package/out/modules/integration/util/types.js +1 -0
  123. package/out/modules/integration/util/webhooks.d.ts +8 -8
  124. package/out/modules/integration/util/webhooks.js +34 -17
  125. package/out/modules/manifest.js +12 -12
  126. package/out/modules/modal/index.js +2 -2
  127. package/out/modules/organization-menu/index.js +5 -4
  128. package/out/modules/organization-settings-menu/index.js +5 -4
  129. package/out/modules/profile-resources-menu/index.js +5 -4
  130. package/out/modules/profile-settings-menu/index.js +5 -4
  131. package/out/modules/project-menu/index.js +1 -1
  132. package/out/modules/project-menu-crowdsource/index.js +1 -1
  133. package/out/modules/project-reports/index.js +3 -2
  134. package/out/modules/project-tools/index.js +3 -2
  135. package/out/modules/status.d.ts +1 -1
  136. package/out/modules/status.js +12 -3
  137. package/out/modules/subscription-paid.d.ts +1 -1
  138. package/out/modules/uninstall.d.ts +1 -1
  139. package/out/modules/uninstall.js +1 -1
  140. package/out/modules/webhooks/handlers/webhook-handler.d.ts +2 -2
  141. package/out/modules/webhooks/handlers/webhook-handler.js +33 -22
  142. package/out/modules/webhooks/types.d.ts +7 -0
  143. package/out/modules/workflow-step-type/handlers/delete-step.d.ts +1 -1
  144. package/out/modules/workflow-step-type/handlers/step-settings-save.d.ts +1 -1
  145. package/out/modules/workflow-step-type/index.js +2 -2
  146. package/out/modules/workflow-step-type/util/index.js +3 -6
  147. package/out/static/js/dependent.js +16 -7
  148. package/out/static/ui/error.bundle.js +474 -0
  149. package/out/static/ui/error.bundle.js.map +1 -0
  150. package/out/static/ui/install.bundle.js +459 -0
  151. package/out/static/ui/install.bundle.js.map +1 -0
  152. package/out/static/ui/login.bundle.js +630 -0
  153. package/out/static/ui/login.bundle.js.map +1 -0
  154. package/out/static/ui/main.bundle.js +2109 -0
  155. package/out/static/ui/main.bundle.js.map +1 -0
  156. package/out/static/ui/oauth.bundle.js +467 -0
  157. package/out/static/ui/oauth.bundle.js.map +1 -0
  158. package/out/storage/d1.d.ts +107 -0
  159. package/out/storage/d1.js +831 -0
  160. package/out/storage/index.js +8 -1
  161. package/out/storage/mysql.js +22 -19
  162. package/out/storage/postgre.d.ts +0 -1
  163. package/out/storage/postgre.js +20 -30
  164. package/out/storage/sqlite.d.ts +2 -5
  165. package/out/storage/sqlite.js +29 -69
  166. package/out/types.d.ts +78 -18
  167. package/out/util/connection.js +1 -1
  168. package/out/util/credentials-masker.d.ts +3 -3
  169. package/out/util/credentials-masker.js +14 -20
  170. package/out/util/cron.d.ts +29 -0
  171. package/out/util/cron.js +87 -0
  172. package/out/util/index.d.ts +14 -1
  173. package/out/util/index.js +121 -10
  174. package/out/util/jsx-renderer.d.ts +14 -0
  175. package/out/util/jsx-renderer.js +35 -0
  176. package/out/util/logger.d.ts +1 -0
  177. package/out/util/logger.js +2 -2
  178. package/out/util/static-files.d.ts +19 -0
  179. package/out/util/static-files.js +87 -0
  180. package/out/util/subscription.js +1 -1
  181. package/out/views/AboutPage.d.ts +10 -0
  182. package/out/views/AboutPage.js +76 -0
  183. package/out/views/FormPage.d.ts +14 -0
  184. package/out/views/FormPage.js +28 -0
  185. package/out/views/SubscriptionPage.d.ts +7 -0
  186. package/out/views/SubscriptionPage.js +26 -0
  187. package/out/views/index.d.ts +8 -0
  188. package/out/views/index.js +15 -0
  189. package/out/views/layout/Head.d.ts +9 -0
  190. package/out/views/layout/Head.js +54 -0
  191. package/package.json +43 -41
  192. package/out/util/handlebars.d.ts +0 -1
  193. package/out/util/handlebars.js +0 -46
  194. package/out/views/about.handlebars +0 -102
  195. package/out/views/error.handlebars +0 -54
  196. package/out/views/form.handlebars +0 -31
  197. package/out/views/install.handlebars +0 -16
  198. package/out/views/login.handlebars +0 -332
  199. package/out/views/main.handlebars +0 -2042
  200. package/out/views/oauth.handlebars +0 -11
  201. package/out/views/partials/head.handlebars +0 -53
  202. package/out/views/subscription.handlebars +0 -26
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AboutPage = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const AboutPage = ({ name, logo, manifest, storeLink, showDebugLink }) => (react_1.default.createElement("html", null,
9
+ react_1.default.createElement("head", null,
10
+ react_1.default.createElement("title", null, name),
11
+ react_1.default.createElement("meta", { charSet: "utf-8" }),
12
+ react_1.default.createElement("meta", { httpEquiv: "Content-type", content: "text/html; charset=utf-8" }),
13
+ react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }),
14
+ storeLink && react_1.default.createElement("link", { rel: "canonical", href: storeLink }),
15
+ react_1.default.createElement("link", { rel: "stylesheet", href: "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css", integrity: "sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH", crossOrigin: "anonymous" }),
16
+ react_1.default.createElement("link", { href: "/assets/css/about.css", media: "screen", rel: "stylesheet", type: "text/css" })),
17
+ react_1.default.createElement("body", null,
18
+ react_1.default.createElement("header", { id: "header", className: "navbar navbar-expand-lg fixed-top crowdin-navbar" },
19
+ react_1.default.createElement("a", { itemProp: "url", className: "navbar-brand crowdin-navbar__logo", href: "https://crowdin.com", title: "Crowdin \u2014 Localization Management Platform" },
20
+ react_1.default.createElement("svg", { className: "d-none d-md-block d-lg-block default-logo", width: "180", height: "54", "aria-labelledby": "crowdinLogoTitle" },
21
+ react_1.default.createElement("title", { id: "crowdinLogoTitle" }, "Crowdin"),
22
+ react_1.default.createElement("image", { className: "d-none d-md-block d-lg-block", href: "/assets/img/crowdin.svg", width: "180", height: "54" })),
23
+ react_1.default.createElement("svg", { className: "d-block d-md-none d-lg-none default-logo", width: "173", height: "32" },
24
+ react_1.default.createElement("image", { className: "d-block d-md-none d-lg-none", href: "/assets/img/crowdin_small.svg", width: "173", height: "32" }))),
25
+ react_1.default.createElement("div", { className: "flex-nowrap justify-content-lg-end ml-auto my-lg-0" },
26
+ react_1.default.createElement("div", { className: "pr-0 ml-2 my-2" },
27
+ react_1.default.createElement("span", { className: "crowdin-navbar__nav-link contact " },
28
+ react_1.default.createElement("a", { title: "Contact", href: "https://crowdin.com/contacts" }, "Contact"))))),
29
+ react_1.default.createElement("div", { className: "main" },
30
+ react_1.default.createElement("div", { className: "container" },
31
+ react_1.default.createElement("div", { className: "row crwd__product-template__header align-items-center" },
32
+ react_1.default.createElement("div", { className: "offset-lg-1 col-lg-2 product-single__photo-wrapper crwd__product-single__photo-wrapper" },
33
+ react_1.default.createElement("div", { className: "product-single__photo text-center mb-3 mb-lg-0" },
34
+ react_1.default.createElement("div", { className: "image-holder" },
35
+ react_1.default.createElement("img", { width: "200", src: logo, alt: name, id: "FeaturedImage-product-template", className: "img-fluid lazyloaded ls-is-cached product-featured-img", style: { position: 'unset' } })))),
36
+ react_1.default.createElement("div", { className: " col-lg-8 crwd__product-template__header__title-container" },
37
+ react_1.default.createElement("div", { className: "product-single__meta" },
38
+ react_1.default.createElement("div", { className: "section-header" },
39
+ react_1.default.createElement("h1", { className: "product-single__title text-center text-lg-left" },
40
+ react_1.default.createElement("span", null, name)),
41
+ react_1.default.createElement("div", { className: "description" },
42
+ name,
43
+ " extends the default functionality available in Crowdin and Crowdin Enterprise by providing additional capabilities to enhance your localization workflows."))))),
44
+ react_1.default.createElement("div", { className: "row" },
45
+ react_1.default.createElement("div", { className: "offset-lg-1 col-lg-10" },
46
+ react_1.default.createElement("p", null, "To install this app, you can use either of the following methods: "),
47
+ react_1.default.createElement("ol", null,
48
+ react_1.default.createElement("li", null,
49
+ "Install it directly from the",
50
+ ' ',
51
+ react_1.default.createElement("a", { href: "https://store.crowdin.com/", target: "_blank" }, "Crowdin Store"),
52
+ ", if available."),
53
+ react_1.default.createElement("li", null, "Install it manually using the manifest URL below.")),
54
+ react_1.default.createElement("p", null,
55
+ "For detailed steps, follow the",
56
+ ' ',
57
+ react_1.default.createElement("a", { href: "https://support.crowdin.com/developer/crowdin-apps-installation/", target: "_blank" }, "App Installation")),
58
+ react_1.default.createElement("div", { className: "mb-3" },
59
+ react_1.default.createElement("label", { htmlFor: "manifest-url", className: "form-label" }, "Paste the following manifest URL when prompted during manual installation:"),
60
+ react_1.default.createElement("div", { className: "input-group" },
61
+ react_1.default.createElement("input", { type: "text", className: "form-control", id: "manifest-url", value: manifest, readOnly: true }))),
62
+ storeLink && (react_1.default.createElement("div", null,
63
+ "Read more about",
64
+ ' ',
65
+ react_1.default.createElement("a", { href: storeLink, target: "_blank", title: `${name} on Crowdin Store` }, name),
66
+ ".")),
67
+ showDebugLink && (react_1.default.createElement("div", { className: "mt-4 pt-3 border-top" },
68
+ react_1.default.createElement("p", { className: "mb-2" },
69
+ react_1.default.createElement("strong", null, "Developer Tools")),
70
+ react_1.default.createElement("p", null,
71
+ "Access the",
72
+ ' ',
73
+ react_1.default.createElement("a", { href: "/__debug", target: "_blank", title: "Open developer console in a new tab" }, "Developer Console"),
74
+ ' ',
75
+ "to inspect requests, debug issues, and monitor application behavior."))))))))));
76
+ exports.AboutPage = AboutPage;
@@ -0,0 +1,14 @@
1
+ import { FC } from 'react';
2
+ interface FormPageProps {
3
+ formGetDataUrl: string;
4
+ formPostDataUrl: string;
5
+ formPatchDataUrl?: string;
6
+ formSchema: string;
7
+ formUiSchema: string;
8
+ sentryData?: {
9
+ dsn: string;
10
+ appIdentifier: string;
11
+ };
12
+ }
13
+ export declare const FormPage: FC<FormPageProps>;
14
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FormPage = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const Head_1 = require("./layout/Head");
9
+ const FormPage = ({ formGetDataUrl, formPostDataUrl, formPatchDataUrl, formSchema, formUiSchema, sentryData, }) => (react_1.default.createElement("html", { lang: "en" },
10
+ react_1.default.createElement(Head_1.Head, { sentryData: sentryData }),
11
+ react_1.default.createElement("body", null,
12
+ react_1.default.createElement("div", { className: "i_w", style: { maxWidth: '680px', position: 'relative' } },
13
+ react_1.default.createElement("crowdin-card", { id: "card", "is-shadowed": true },
14
+ react_1.default.createElement("div", { id: "form" }),
15
+ react_1.default.createElement("div", { id: "form-loading" },
16
+ react_1.default.createElement("crowdin-progress-indicator", null)))),
17
+ react_1.default.createElement("crowdin-toasts", null),
18
+ react_1.default.createElement("script", { dangerouslySetInnerHTML: {
19
+ __html: `
20
+ var formGetDataUrl = '${formGetDataUrl}';
21
+ var formPostDataUrl = '${formPostDataUrl}';
22
+ var formPatchDataUrl = '${formPatchDataUrl}';
23
+ var formSchema = ${formSchema};
24
+ var formUiSchema = ${formUiSchema};
25
+ `,
26
+ } }),
27
+ react_1.default.createElement("script", { src: "/assets/js/form.js" }))));
28
+ exports.FormPage = FormPage;
@@ -0,0 +1,7 @@
1
+ import { FC } from 'react';
2
+ interface SubscriptionPageProps {
3
+ name?: string;
4
+ subscribeLink?: string;
5
+ }
6
+ export declare const SubscriptionPage: FC<SubscriptionPageProps>;
7
+ export {};
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SubscriptionPage = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const SubscriptionPage = ({ name, subscribeLink }) => (react_1.default.createElement("html", { lang: "en" },
9
+ react_1.default.createElement("head", null,
10
+ react_1.default.createElement("meta", { charSet: "UTF-8" }),
11
+ react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
12
+ react_1.default.createElement("meta", { httpEquiv: "X-UA-Compatible", content: "ie=edge" }),
13
+ react_1.default.createElement("title", null),
14
+ react_1.default.createElement("script", { type: "module", src: "https://crowdin-web-components.s3.amazonaws.com/crowdin-web-components/crowdin-web-components.esm.js" }),
15
+ react_1.default.createElement("script", { noModule: true, src: "https://crowdin-web-components.s3.amazonaws.com/crowdin-web-components/crowdin-web-components.js" }),
16
+ react_1.default.createElement("script", { type: "text/javascript", src: "https://cdn.crowdin.com/apps/dist/iframe.js" })),
17
+ react_1.default.createElement("body", null,
18
+ react_1.default.createElement("div", { className: "i_w center" },
19
+ react_1.default.createElement("crowdin-alert", { type: "warning" },
20
+ "Subscribe to continue using the ",
21
+ name,
22
+ " app."),
23
+ react_1.default.createElement("br", null),
24
+ react_1.default.createElement("crowdin-button", { primary: true, onclick: `window.open('${subscribeLink}','_blank')` }, "Subscribe"),
25
+ react_1.default.createElement("crowdin-button", { outlined: true, onclick: "window.open('https://crowdin.com/contacts','_blank')" }, "Contact us")))));
26
+ exports.SubscriptionPage = SubscriptionPage;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * React JSX Views
3
+ * Export all React SSR components for use in route handlers
4
+ */
5
+ export { Head } from './layout/Head';
6
+ export { AboutPage } from './AboutPage';
7
+ export { FormPage } from './FormPage';
8
+ export { SubscriptionPage } from './SubscriptionPage';
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /**
3
+ * React JSX Views
4
+ * Export all React SSR components for use in route handlers
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SubscriptionPage = exports.FormPage = exports.AboutPage = exports.Head = void 0;
8
+ var Head_1 = require("./layout/Head");
9
+ Object.defineProperty(exports, "Head", { enumerable: true, get: function () { return Head_1.Head; } });
10
+ var AboutPage_1 = require("./AboutPage");
11
+ Object.defineProperty(exports, "AboutPage", { enumerable: true, get: function () { return AboutPage_1.AboutPage; } });
12
+ var FormPage_1 = require("./FormPage");
13
+ Object.defineProperty(exports, "FormPage", { enumerable: true, get: function () { return FormPage_1.FormPage; } });
14
+ var SubscriptionPage_1 = require("./SubscriptionPage");
15
+ Object.defineProperty(exports, "SubscriptionPage", { enumerable: true, get: function () { return SubscriptionPage_1.SubscriptionPage; } });
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ interface HeadProps {
3
+ sentryData?: {
4
+ dsn: string;
5
+ appIdentifier: string;
6
+ };
7
+ }
8
+ export declare const Head: FC<HeadProps>;
9
+ export {};
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Head = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const Head = ({ sentryData }) => (react_1.default.createElement("head", null,
9
+ react_1.default.createElement("meta", { charSet: "UTF-8" }),
10
+ react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
11
+ react_1.default.createElement("meta", { httpEquiv: "X-UA-Compatible", content: "ie=edge" }),
12
+ react_1.default.createElement("title", null),
13
+ react_1.default.createElement("link", { rel: "stylesheet", href: "/assets/css/styles.css" }),
14
+ react_1.default.createElement("link", { rel: "stylesheet", href: "/assets/css/crowdin-ui-colors.css" }),
15
+ react_1.default.createElement("script", { type: "module", src: "https://crowdin-web-components.s3.amazonaws.com/crowdin-web-components/crowdin-web-components.esm.js" }),
16
+ react_1.default.createElement("script", { noModule: true, src: "https://crowdin-web-components.s3.amazonaws.com/crowdin-web-components/crowdin-web-components.js" }),
17
+ react_1.default.createElement("script", { type: "text/javascript", src: "https://cdn.crowdin.com/apps/dist/iframe.js" }),
18
+ react_1.default.createElement("script", { type: "text/javascript", src: "/assets/js/polyfills/promise.js" }),
19
+ react_1.default.createElement("script", { type: "text/javascript", src: "/assets/js/polyfills/fetch.js" }),
20
+ react_1.default.createElement("script", { type: "text/javascript", src: "/assets/js/main.js" }),
21
+ react_1.default.createElement("script", { type: "text/javascript", src: "/assets/js/dependent.js" }),
22
+ react_1.default.createElement("style", null, `
23
+ .ml-10 {
24
+ margin-left: 10px;
25
+ }
26
+ `),
27
+ sentryData && (react_1.default.createElement(react_1.default.Fragment, null,
28
+ react_1.default.createElement("script", { src: "https://browser.sentry-cdn.com/7.60.0/bundle.replay.min.js", integrity: "sha384-N+VZps2PwFdv9LugkPA8nw+SMI1mGJG7IDe49jaxZlWDDJhHQ+SHakMpwhLQLAka", crossOrigin: "anonymous" }),
29
+ react_1.default.createElement("script", { dangerouslySetInnerHTML: {
30
+ __html: `
31
+ if (typeof Sentry !== 'undefined') {
32
+ Sentry.init({
33
+ dsn: "${sentryData.dsn}",
34
+ environment: "frontend",
35
+ replaysSessionSampleRate: 0,
36
+ replaysOnErrorSampleRate: 1.0,
37
+ integrations: [new Sentry.Replay()],
38
+ });
39
+
40
+ Sentry.configureScope(function(scope) {
41
+ scope.setTag("identifier", "${sentryData.appIdentifier}");
42
+
43
+ AP.getContext(contextData => {
44
+ const { user_id, ...rest } = contextData;
45
+ user_id && scope.setUser({ id: user_id });
46
+ scope.setTags(rest);
47
+ });
48
+ });
49
+ } else {
50
+ console.warn('Sentry is not available. This might be due to ad/tracking blockers or network issues.');
51
+ }
52
+ `,
53
+ } })))));
54
+ exports.Head = Head;
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "@crowdin/app-project-module",
3
- "version": "0.108.0",
3
+ "version": "1.0.0",
4
4
  "description": "Module that generates for you all common endpoints for serving standalone Crowdin App",
5
5
  "main": "out/index.js",
6
6
  "types": "out/index.d.ts",
7
7
  "scripts": {
8
- "build": "tsc -p ./ && cp -R views out && cp -R static out && cp logo.png out && rollup -c rollup.config.mjs",
9
- "build-main": "tsc -p ./ && cp -R views out && cp -R static out && cp logo.png out",
10
- "build-form": "tsc -p ./ && cp -R static/js/form out/static/js && rollup -c rollup.config.mjs",
11
- "watch-main": "tsc --watch -p ./ && cp -R views out && cp -R static out && cp logo.png out",
12
- "lint": "eslint --fix \"{src,tests}/**/*.{js,ts}\"",
13
- "prettier": "prettier --config .prettierrc src/**/*.ts --write",
8
+ "build": "npm run build-main && npm run build-form && npm run build-ui",
9
+ "build-main": "tsc -p ./ && cp -R static out && cp logo.png out",
10
+ "build-form": "rollup -c rollup-form.config.mjs",
11
+ "build-ui": "rollup -c rollup-ui.config.mjs",
12
+ "watch-main": "tsc --watch -p ./ && cp -R static out && cp logo.png out",
13
+ "lint": "eslint --fix \"{src,tests,ui}/**/*.{js,ts,tsx}\"",
14
+ "prettier": "prettier --config .prettierrc {src,ui}/**/*.{ts,tsx} --write",
14
15
  "lint-ci": "eslint \"{src,tests}/**/*.{js,ts}\"",
15
16
  "test-coverage": "jest --ci --reporters=jest-junit --reporters=default --coverage --coverageReporters=cobertura --coverageReporters=html",
16
17
  "test": "jest"
@@ -19,35 +20,40 @@
19
20
  "out/**/*"
20
21
  ],
21
22
  "dependencies": {
22
- "@aws-sdk/client-s3": "^3.758.0",
23
- "@aws-sdk/s3-request-presigner": "^3.758.0",
24
- "@crowdin/crowdin-apps-functions": "^0.12.4",
23
+ "@crowdin/crowdin-apps-functions": "^0.12.5",
25
24
  "@crowdin/logs-formatter": "^2.1.9",
26
25
  "@godaddy/terminus": "^4.12.1",
27
- "@types/cors": "^2.8.19",
28
- "@types/lodash.kebabcase": "^4.1.9",
29
26
  "ajv": "^8.17.1",
30
- "amqplib": "^0.10.8",
31
- "cors": "^2.8.5",
32
- "crypto-js": "^4.2.0",
33
- "express": "^4.21.2",
34
- "express-handlebars": "^5.3.5",
35
- "express-rate-limit": "^7.5.0",
36
- "lodash.get": "^4.4.2",
37
- "lodash.isstring": "^4.0.1",
38
- "lodash.kebabcase": "^4.1.1",
39
- "lodash.snakecase": "^4.1.1",
40
- "lodash.uniqby": "^4.7.0",
41
- "minimatch": "^10.0.3",
42
- "mysql2": "^3.12.0",
43
- "node-cron": "^3.0.3",
44
- "pg": "^8.13.3",
27
+ "amqplib": "^0.10.9",
28
+ "cors": "^2.8.6",
29
+ "express": "^5.2.1",
30
+ "express-rate-limit": "^8.2.1",
31
+ "minimatch": "^10.1.1",
32
+ "mysql2": "^3.16.2",
33
+ "node-cron": "^4.2.1",
34
+ "pg": "^8.18.0",
35
+ "react": "^18.3.1",
36
+ "react-dom": "^18.3.1",
45
37
  "sqlite3": "^5.1.7",
46
- "swagger-jsdoc": "^6.2.8",
47
- "uuid": "^8.3.2"
38
+ "swagger-jsdoc": "^6.2.8"
39
+ },
40
+ "peerDependencies": {
41
+ "@aws-sdk/client-s3": "^3.980.0",
42
+ "@aws-sdk/s3-request-presigner": "^3.980.0"
43
+ },
44
+ "peerDependenciesMeta": {
45
+ "@aws-sdk/client-s3": {
46
+ "optional": true
47
+ },
48
+ "@aws-sdk/s3-request-presigner": {
49
+ "optional": true
50
+ }
48
51
  },
49
52
  "devDependencies": {
53
+ "@aws-sdk/client-s3": "^3.980.0",
54
+ "@aws-sdk/s3-request-presigner": "^3.980.0",
50
55
  "@babel/preset-react": "^7.26.3",
56
+ "@cloudflare/workers-types": "^4.20251117.0",
51
57
  "@emotion/react": "^11.14.0",
52
58
  "@emotion/styled": "^11.14.0",
53
59
  "@eslint/eslintrc": "^3.3.3",
@@ -66,21 +72,18 @@
66
72
  "@rollup/plugin-node-resolve": "^15.3.1",
67
73
  "@rollup/plugin-replace": "^5.0.7",
68
74
  "@rollup/plugin-terser": "^0.4.4",
75
+ "@rollup/plugin-typescript": "12.3.0",
69
76
  "@types/amqplib": "^0.10.7",
70
77
  "@types/crypto-js": "^4.2.2",
71
- "@types/express": "4.17.21",
72
- "@types/express-handlebars": "^5.3.1",
78
+ "@types/express": "^5.0.3",
73
79
  "@types/jest": "^29.5.14",
74
- "@types/lodash.get": "^4.4.9",
75
- "@types/lodash.isstring": "^4.0.9",
76
- "@types/lodash.snakecase": "^4.1.9",
77
- "@types/lodash.uniqby": "^4.7.9",
78
80
  "@types/minimatch": "^5.1.2",
79
81
  "@types/node": "^16.18.126",
80
- "@types/node-cron": "^3.0.11",
81
- "@types/pg": "^8.11.11",
82
+ "@types/pg": "^8.16.0",
83
+ "@types/react": "^18.3.18",
84
+ "@types/react-dom": "^18.3.5",
82
85
  "@types/swagger-jsdoc": "^6.0.4",
83
- "@types/uuid": "^9.0.7",
86
+ "@types/cors": "^2.8.19",
84
87
  "@typescript-eslint/eslint-plugin": "^8.49.0",
85
88
  "@typescript-eslint/parser": "^8.49.0",
86
89
  "auto-changelog": "^2.5.0",
@@ -90,12 +93,11 @@
90
93
  "jest": "^29.7.0",
91
94
  "jest-junit": "^15.0.0",
92
95
  "prettier": "^3.7.4",
93
- "react": "^18.3.1",
94
- "react-dom": "^18.3.1",
95
96
  "rollup": "^3.29.4",
96
97
  "rollup-plugin-delete": "^2.1.0",
97
98
  "ts-jest": "^29.2.5",
98
- "typescript": "^4.9.5"
99
+ "typescript": "^4.9.5",
100
+ "crypto-js": "^4.2.0"
99
101
  },
100
102
  "repository": {
101
103
  "type": "git",
@@ -1 +0,0 @@
1
- export declare const engine: (path: string, options: object, callback: (e: any, rendered: string) => void) => void;
@@ -1,46 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.engine = void 0;
7
- const express_handlebars_1 = __importDefault(require("express-handlebars"));
8
- exports.engine = (0, express_handlebars_1.default)({
9
- layoutsDir: '',
10
- defaultLayout: '',
11
- helpers: {
12
- ifeq: function (a, b, options) {
13
- if (a === b) {
14
- return options.fn(this);
15
- }
16
- return options.inverse(this);
17
- },
18
- checkLength: function (a, b, options) {
19
- if (a.length > b) {
20
- return options.fn(this);
21
- }
22
- return options.inverse(this);
23
- },
24
- in: function (a, b, options) {
25
- if (a !== undefined && a !== null && b !== undefined && b !== null) {
26
- let bArray;
27
- if (Array.isArray(b)) {
28
- bArray = b.map((item) => item.toString());
29
- }
30
- else {
31
- bArray = b.toString().split(' ');
32
- }
33
- if (bArray.includes(a === null || a === void 0 ? void 0 : a.toString())) {
34
- return options.fn(this);
35
- }
36
- }
37
- return options.inverse(this);
38
- },
39
- or: function (a, b, options) {
40
- return a || b ? options.fn(this) : options.inverse(this);
41
- },
42
- incrementedIndex: function (index) {
43
- return index + 1;
44
- },
45
- },
46
- });
@@ -1,102 +0,0 @@
1
- <html>
2
- <head>
3
- <title>{{name}}</title>
4
- <meta charset="utf-8" />
5
- <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1" />
7
-
8
- {{#if storeLink}}
9
- <link rel="canonical" href="{{storeLink}}">
10
- {{/if}}
11
-
12
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
13
- <link href="/assets/css/about.css" media="screen" rel="stylesheet" type="text/css">
14
- </head>
15
- <body>
16
- <header id="header" class="navbar navbar-expand-lg fixed-top crowdin-navbar">
17
- <a itemprop="url" class="navbar-brand crowdin-navbar__logo" href="https://crowdin.com" title="Crowdin — Localization Management Platform">
18
- <svg class="d-none d-md-block d-lg-block default-logo" width="180" height="54" aria-labelledby="crowdinLogoTitle">
19
- <title id="crowdinLogoTitle">Crowdin</title>
20
- <image class="d-none d-md-block d-lg-block" href="/assets/img/crowdin.svg" width="180" height="54" alt="Crowdin" />
21
- </svg>
22
- <svg class="d-block d-md-none d-lg-none default-logo" width="173" height="32">
23
- <image class="d-block d-md-none d-lg-none" href="/assets/img/crowdin_small.svg" width="173" height="32" alt="Crowdin"/>
24
- </svg>
25
- </a>
26
- <div class="flex-nowrap justify-content-lg-end ml-auto my-lg-0">
27
- <div class="pr-0 ml-2 my-2">
28
- <span class="crowdin-navbar__nav-link contact ">
29
- <a title="Contact" href="https://crowdin.com/contacts">Contact</a>
30
- </span>
31
- </div>
32
- </div>
33
- </header>
34
- <div class="main">
35
- <div class="container">
36
- <div class="row crwd__product-template__header align-items-center">
37
-
38
- <div class="offset-lg-1 col-lg-2 product-single__photo-wrapper crwd__product-single__photo-wrapper">
39
- <div class="product-single__photo text-center mb-3 mb-lg-0">
40
- <div class="image-holder">
41
- <img width="200" src="{{logo}}" alt="{{name}}" id="FeaturedImage-product-template" class="img-fluid lazyloaded ls-is-cached product-featured-img" style="position: unset;">
42
- </div>
43
- </div>
44
- </div>
45
- <div class=" col-lg-8 crwd__product-template__header__title-container">
46
- <div class="product-single__meta">
47
- <div class="section-header">
48
- <h1 class="product-single__title text-center text-lg-left">
49
- <span>{{name}}</span>
50
- </h1>
51
- <div class="description">
52
- {{name}} extends the default functionality available in Crowdin and Crowdin Enterprise by providing additional capabilities to enhance your localization workflows.
53
- </div>
54
- </div>
55
- </div>
56
- </div>
57
- </div>
58
- <div class="row">
59
- <div class="offset-lg-1 col-lg-10">
60
- <p>To install this app, you can use either of the following methods: </p>
61
- <ol>
62
- <li>Install it directly from the <a href="https://store.crowdin.com/" target="_blank">Crowdin Store</a>, if available.</li>
63
- <li>Install it manually using the manifest URL below.</li>
64
- </ol>
65
- <p>For detailed steps, follow the <a href="https://support.crowdin.com/developer/crowdin-apps-installation/" target="_blank">App Installation</a></p>
66
-
67
- <div class="mb-3">
68
- <label for="manifest-url" class="form-label">Paste the following manifest URL when prompted during manual installation:</label>
69
- <div class="input-group">
70
- <input
71
- type="text"
72
- class="form-control"
73
- id="manifest-url"
74
- value="{{manifest}}"
75
- readonly
76
- >
77
- <button class="btn btn-outline-secondary" type="button" id="copy-button">
78
- Copy
79
- </button>
80
- </div>
81
- </div>
82
-
83
-
84
-
85
- {{#if storeLink}}
86
- <div>Read more about <a href="{{storeLink}}" target="_blank" title="{{name}} on Crowdin Store">{{name}}</a>.</div>
87
- {{/if}}
88
- </div>
89
- </div>
90
- </div>
91
- </div>
92
- </body>
93
- <script>
94
- document.getElementById('copy-button').addEventListener('click', async () => {
95
- const text = document.getElementById('manifest-url').value;
96
- await navigator.clipboard.writeText(text);
97
- const btn = document.getElementById('copy-button');
98
- btn.textContent = 'Copied!';
99
- setTimeout(() => btn.textContent = 'Copy', 1500);
100
- });
101
- </script>
102
- </html>
@@ -1,54 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- {{> head}}
4
-
5
- <body>
6
- <div class="i_w">
7
- <div class="error-page">
8
- <div>
9
- <div class="error-page-message">
10
- <crowdin-h3>{{ message }}</crowdin-h3>
11
- {{#if owners}}
12
- <crowdin-p>This integration allows only one connection per project to ensure consistent configuration and prevent file import or synchronization issues.</crowdin-p>
13
- {{#if owners.[1]}}
14
- <crowdin-p class="mt-2">Managed by:</crowdin-p>
15
- <ul>
16
- {{#each owners}}
17
- <li><crowdin-a href="#" onclick="contactUser({{this.id}})">{{this.name}}</crowdin-a></li>
18
- {{/each}}
19
- </ul>
20
- <crowdin-p class="mt-2">To request access, please contact one of the project members listed above.</crowdin-p>
21
- {{else}}
22
- <crowdin-p class="mt-2">Managed by: <crowdin-a href="#" onclick="contactUser({{owners.[0].id}})">{{owners.[0].name}}</crowdin-a></crowdin-p>
23
- <crowdin-p class="mt-2">To request access, please contact the project member listed above.</crowdin-p>
24
- {{/if}}
25
- {{/if}}
26
- </div>
27
- {{#unless hideActions}}
28
- <div class="error-page-action">
29
- <crowdin-button outlined onclick="integrationLogout()">Log out</crowdin-button>
30
- <span> or <crowdin-a href="https://crowdin.com/contacts" target="_blank">contact us</crowdin-a> for help</span>
31
- </div>
32
- {{/unless}}
33
- </div>
34
- </div>
35
- </div>
36
- </body>
37
-
38
- </html>
39
- <script>
40
- function integrationLogout() {
41
- checkOrigin()
42
- .then(queryParams => fetch(`api/logout${queryParams}`, { method: 'POST' }))
43
- .then(checkResponse)
44
- .then(reloadLocation)
45
- .then(localStorage.removeItem('revised_{{name}}'))
46
- .catch(e => catchRejection(e, 'Looks like you are not logged in'));
47
- }
48
-
49
- function contactUser(userId) {
50
- AP.getContext(function(context) {
51
- AP.redirect(`${context.organization_id ? '/u' : ''}/messages/create/${userId}`);
52
- });
53
- }
54
- </script>
@@ -1,31 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- {{> head}}
4
- <body>
5
- <div
6
- class="i_w"
7
- style='max-width:680px; position: relative;'
8
- >
9
- <crowdin-card
10
- id="card"
11
- is-shadowed
12
- >
13
- <div id="form"></div>
14
- <div id="form-loading">
15
- <crowdin-progress-indicator />
16
- </div>
17
- </crowdin-card>
18
- </div>
19
- <crowdin-toasts></crowdin-toasts>
20
- <script>
21
- /*<!--*/
22
- var formGetDataUrl = '{{formGetDataUrl}}';
23
- var formPostDataUrl = '{{formPostDataUrl}}';
24
- var formPatchDataUrl = '{{formPatchDataUrl}}';
25
- var formSchema = {{{formSchema}}};
26
- var formUiSchema = {{{formUiSchema}}};
27
- /*-->*/
28
- </script>
29
- <script src="/assets/js/form.js"></script>
30
- </body>
31
- </html>