@projectcaluma/ember-core 11.0.0-beta.2 → 11.0.0-beta.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,78 @@
1
+ # [@projectcaluma/ember-core-v11.0.0-beta.9](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-core-v11.0.0-beta.8...@projectcaluma/ember-core-v11.0.0-beta.9) (2022-08-05)
2
+
3
+
4
+ * feat!: add multi file upload (#2040) ([c4fd004](https://github.com/projectcaluma/ember-caluma/commit/c4fd0049654b2d2e5ea62e5909a45d89cb888b40)), closes [#2040](https://github.com/projectcaluma/ember-caluma/issues/2040)
5
+
6
+
7
+ ### BREAKING CHANGES
8
+
9
+ * This requires the caluma backend version v8.0.0-beta.12
10
+ or later.
11
+
12
+ # [@projectcaluma/ember-core-v11.0.0-beta.8](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-core-v11.0.0-beta.7...@projectcaluma/ember-core-v11.0.0-beta.8) (2022-08-02)
13
+
14
+
15
+ ### Features
16
+
17
+ * **analytics:** adds analytics module for caluma ([#1655](https://github.com/projectcaluma/ember-caluma/issues/1655)) ([9573abe](https://github.com/projectcaluma/ember-caluma/commit/9573abe95cd39cb1467113026f2ab7773c3c9143))
18
+
19
+ # [@projectcaluma/ember-core-v11.0.0-beta.7](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-core-v11.0.0-beta.6...@projectcaluma/ember-core-v11.0.0-beta.7) (2022-05-09)
20
+
21
+
22
+ ### Bug Fixes
23
+
24
+ * **resources:** fix deprecations of ember-resources ([7a84c5c](https://github.com/projectcaluma/ember-caluma/commit/7a84c5c78d5b28f7b5393c64722907728dd5f42b))
25
+
26
+ # [@projectcaluma/ember-core-v11.0.0-beta.6](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-core-v11.0.0-beta.5...@projectcaluma/ember-core-v11.0.0-beta.6) (2022-03-23)
27
+
28
+
29
+ ### Bug Fixes
30
+
31
+ * **embroider:** add missing dependency on @ember/string ([3a6e6bb](https://github.com/projectcaluma/ember-caluma/commit/3a6e6bb39a8c1a40a2ae00b3d4ea00606a755e25))
32
+
33
+ # [@projectcaluma/ember-core-v11.0.0-beta.5](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-core-v11.0.0-beta.4...@projectcaluma/ember-core-v11.0.0-beta.5) (2022-03-11)
34
+
35
+
36
+ ### Bug Fixes
37
+
38
+ * **core:** ensure only language code of the locale is passed to slugify ([02e4506](https://github.com/projectcaluma/ember-caluma/commit/02e45064b9171de85af5b9e1a890d5207a6ec252))
39
+ * **core:** handle null values in raw dates ([9c73d0b](https://github.com/projectcaluma/ember-caluma/commit/9c73d0b3853b154b5edc84bcf2c1227ffb825116)), closes [#1826](https://github.com/projectcaluma/ember-caluma/issues/1826)
40
+ * **distribution:** fix sorting after group names in navigation ([2299d3b](https://github.com/projectcaluma/ember-caluma/commit/2299d3b0e265204ab6747dbdc6a8b64fc22f247f))
41
+
42
+
43
+ ### Features
44
+
45
+ * **form:** support passing component override classes ([9409c7c](https://github.com/projectcaluma/ember-caluma/commit/9409c7cb5901dcdffec1c0294046da64b74b9922))
46
+
47
+ # [@projectcaluma/ember-core-v11.0.0-beta.4](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-core-v11.0.0-beta.3...@projectcaluma/ember-core-v11.0.0-beta.4) (2022-02-07)
48
+
49
+
50
+ ### Bug Fixes
51
+
52
+ * **core:** remove usage of moment and remove momentAttr for models ([92f3651](https://github.com/projectcaluma/ember-caluma/commit/92f365114900fe9f9ad5b49c9e9eed97b25991b5))
53
+
54
+
55
+ ### BREAKING CHANGES
56
+
57
+ * **core:** The `momentAttr` decorator for models was replaced with
58
+ a `dateAttr` that returns a plain JS date object. Predefined date
59
+ attributes on models are now JS dates instead of moment objects.
60
+
61
+ # [@projectcaluma/ember-core-v11.0.0-beta.3](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-core-v11.0.0-beta.2...@projectcaluma/ember-core-v11.0.0-beta.3) (2022-02-03)
62
+
63
+
64
+ ### Bug Fixes
65
+
66
+ * **validation:** sync format validator validation with backend ([ee66968](https://github.com/projectcaluma/ember-caluma/commit/ee66968230b9f0e4c5a4df8bdb3f8e58b44b5b82))
67
+
68
+
69
+ ### BREAKING CHANGES
70
+
71
+ * **validation:** Use the `formatValidators` property of the backend to store and read
72
+ format validators instead of the `meta.formatValidators` so the backend
73
+ validates as well. For more information on how to migrate check the
74
+ migration guide to v11.
75
+
1
76
  # [@projectcaluma/ember-core-v11.0.0-beta.2](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-core-v11.0.0-beta.1...@projectcaluma/ember-core-v11.0.0-beta.2) (2022-01-18)
2
77
 
3
78
 
@@ -1,44 +1,31 @@
1
1
  export default {
2
- Node: [
3
- "Workflow",
4
- "Form",
5
- "Document",
6
- "Case",
7
- "WorkItem",
8
- "Flow",
9
- "DynamicOption",
10
- "Option",
2
+ Question: [
11
3
  "TextQuestion",
12
- "StringAnswer",
13
4
  "ChoiceQuestion",
14
5
  "MultipleChoiceQuestion",
15
- "ListAnswer",
16
6
  "DynamicChoiceQuestion",
17
7
  "DynamicMultipleChoiceQuestion",
18
8
  "TextareaQuestion",
19
9
  "FloatQuestion",
20
- "FloatAnswer",
21
10
  "IntegerQuestion",
22
- "IntegerAnswer",
23
11
  "DateQuestion",
24
- "DateAnswer",
25
12
  "TableQuestion",
26
- "TableAnswer",
27
13
  "FormQuestion",
28
- "FileQuestion",
14
+ "FilesQuestion",
29
15
  "StaticQuestion",
30
- "FileAnswer",
31
- "File",
32
16
  "CalculatedFloatQuestion",
33
17
  "ActionButtonQuestion",
34
- "SimpleTask",
35
- "CompleteWorkflowFormTask",
36
- "CompleteTaskFormTask",
37
18
  ],
38
- Task: ["SimpleTask", "CompleteWorkflowFormTask", "CompleteTaskFormTask"],
39
- Question: [
19
+ Node: [
40
20
  "TextQuestion",
21
+ "Form",
22
+ "Document",
23
+ "Case",
24
+ "Workflow",
25
+ "Flow",
26
+ "WorkItem",
41
27
  "ChoiceQuestion",
28
+ "Option",
42
29
  "MultipleChoiceQuestion",
43
30
  "DynamicChoiceQuestion",
44
31
  "DynamicMultipleChoiceQuestion",
@@ -48,19 +35,35 @@ export default {
48
35
  "DateQuestion",
49
36
  "TableQuestion",
50
37
  "FormQuestion",
51
- "FileQuestion",
38
+ "FilesQuestion",
52
39
  "StaticQuestion",
40
+ "StringAnswer",
41
+ "ListAnswer",
42
+ "IntegerAnswer",
43
+ "FloatAnswer",
44
+ "DateAnswer",
45
+ "TableAnswer",
46
+ "FilesAnswer",
47
+ "File",
53
48
  "CalculatedFloatQuestion",
54
49
  "ActionButtonQuestion",
50
+ "SimpleTask",
51
+ "CompleteWorkflowFormTask",
52
+ "CompleteTaskFormTask",
53
+ "AnalyticsTable",
54
+ "AvailableField",
55
+ "AnalyticsField",
56
+ "DynamicOption",
55
57
  ],
56
58
  Answer: [
57
59
  "StringAnswer",
58
60
  "ListAnswer",
59
- "FloatAnswer",
60
61
  "IntegerAnswer",
62
+ "FloatAnswer",
61
63
  "DateAnswer",
62
64
  "TableAnswer",
63
- "FileAnswer",
65
+ "FilesAnswer",
64
66
  ],
67
+ Task: ["SimpleTask", "CompleteWorkflowFormTask", "CompleteTaskFormTask"],
65
68
  DynamicQuestion: ["DynamicChoiceQuestion", "DynamicMultipleChoiceQuestion"],
66
69
  };
@@ -1,13 +1,9 @@
1
1
  import { getOwner, setOwner } from "@ember/application";
2
- import { useResource } from "ember-resources";
3
2
 
4
3
  import CalumaQueryResource from "@projectcaluma/ember-core/caluma-query/resource";
5
4
 
6
5
  export function useCalumaQuery(destroyable, query, thunk) {
7
- return useResource(destroyable, CalumaQueryResource, () => ({
8
- query,
9
- ...thunk(),
10
- }));
6
+ return CalumaQueryResource.from(destroyable, () => ({ query, ...thunk() }));
11
7
  }
12
8
 
13
9
  export default function calumaQuery({ query, options = {} }) {
@@ -1,15 +1,15 @@
1
1
  import { inject as service } from "@ember/service";
2
2
 
3
3
  import CalumaQueryModel, {
4
- momentAttr,
4
+ dateAttr,
5
5
  } from "@projectcaluma/ember-core/caluma-query/models/index";
6
6
 
7
7
  export default class CaseModel extends CalumaQueryModel {
8
8
  @service intl;
9
9
 
10
- @momentAttr createdAt;
11
- @momentAttr modifiedAt;
12
- @momentAttr closedAt;
10
+ @dateAttr createdAt;
11
+ @dateAttr modifiedAt;
12
+ @dateAttr closedAt;
13
13
 
14
14
  get status() {
15
15
  return this.intl.t(`caluma.caluma-query.case.status.${this.raw.status}`);
@@ -1,5 +1,4 @@
1
1
  import cloneDeep from "lodash.clonedeep";
2
- import moment from "moment";
3
2
 
4
3
  import { decodeId } from "@projectcaluma/ember-core/helpers/decode-id";
5
4
 
@@ -11,15 +10,16 @@ export function uuidAttr(target, name) {
11
10
  };
12
11
  }
13
12
 
14
- export function momentAttr(target, name) {
13
+ export function dateAttr(target, name) {
15
14
  return {
16
15
  get() {
17
- const date = moment(this.raw[name]);
16
+ const raw = this.raw[name];
17
+ const date = raw ? new Date(raw) : null;
18
18
 
19
- return date.isValid() ? date : null;
19
+ return raw && !isNaN(date) ? date : null;
20
20
  },
21
21
  set(value) {
22
- if (value.isValid()) {
22
+ if (!isNaN(value)) {
23
23
  this.raw[name] = value.toISOString();
24
24
  }
25
25
  },
@@ -1,16 +1,16 @@
1
1
  import { inject as service } from "@ember/service";
2
2
 
3
3
  import CalumaQueryModel, {
4
- momentAttr,
4
+ dateAttr,
5
5
  } from "@projectcaluma/ember-core/caluma-query/models/index";
6
6
 
7
7
  export default class WorkItemModel extends CalumaQueryModel {
8
8
  @service intl;
9
9
 
10
- @momentAttr createdAt;
11
- @momentAttr modifiedAt;
12
- @momentAttr closedAt;
13
- @momentAttr deadline;
10
+ @dateAttr createdAt;
11
+ @dateAttr modifiedAt;
12
+ @dateAttr closedAt;
13
+ @dateAttr deadline;
14
14
 
15
15
  get status() {
16
16
  return this.intl.t(
@@ -1,47 +1,48 @@
1
1
  import { getOwner, setOwner } from "@ember/application";
2
- import { destroy } from "@ember/destroyable";
2
+ import { destroy, registerDestructor } from "@ember/destroyable";
3
3
  import { action } from "@ember/object";
4
4
  import { tracked } from "@glimmer/tracking";
5
- import { LifecycleResource } from "ember-resources";
5
+ import { Resource } from "ember-resources/core";
6
6
 
7
- export default class CalumaQueryResource extends LifecycleResource {
8
- @tracked query;
9
-
10
- setup() {
11
- const { query, options, queryArgs } = this._parsedArgs;
12
-
13
- this.query = query(options);
14
- setOwner(this.query, getOwner(this));
7
+ const MUTABLE_OPTIONS = [
8
+ "pageSize",
9
+ "processAll",
10
+ "processNew",
11
+ "queryOptions",
12
+ ];
15
13
 
16
- this.query.fetch(queryArgs);
17
- }
14
+ export default class CalumaQueryResource extends Resource {
15
+ @tracked query;
18
16
 
19
- update() {
20
- this._updateOptions();
17
+ didSetup = false;
21
18
 
22
- this.query.fetch(this._parsedArgs.queryArgs);
23
- }
19
+ constructor(owner, args) {
20
+ super(owner, args);
24
21
 
25
- teardown() {
26
- destroy(this.query);
22
+ registerDestructor(this, () => {
23
+ destroy(this.query);
24
+ });
27
25
  }
28
26
 
29
- get _parsedArgs() {
30
- const { query, options = {}, ...queryArgs } = this.args.named;
31
-
32
- return { query, options, queryArgs };
33
- }
27
+ modify(_, { options = {}, query, ...args }) {
28
+ if (!this.didSetup) {
29
+ // initialize the caluma query with the given options
30
+ this.query = query(options);
31
+ setOwner(this.query, getOwner(this));
34
32
 
35
- _updateOptions() {
36
- ["pageSize", "processAll", "processNew", "queryOptions"].forEach(
37
- (optionKey) => {
38
- const option = this._parsedArgs.options[optionKey];
33
+ this.didSetup = true;
34
+ } else {
35
+ // update changed options on the caluma query
36
+ MUTABLE_OPTIONS.forEach((optionKey) => {
37
+ const option = options[optionKey];
39
38
 
40
39
  if (option !== undefined && option !== this.query[optionKey]) {
41
40
  this.query[optionKey] = option;
42
41
  }
43
- }
44
- );
42
+ });
43
+ }
44
+
45
+ this.query.fetch(args);
45
46
  }
46
47
 
47
48
  @action
@@ -2,6 +2,7 @@ import { assert } from "@ember/debug";
2
2
  import { once } from "@ember/runloop";
3
3
  import Service, { inject as service } from "@ember/service";
4
4
  import { camelize } from "@ember/string";
5
+ import { tracked } from "@glimmer/tracking";
5
6
  import { task } from "ember-concurrency";
6
7
  import { pluralize } from "ember-inflector";
7
8
 
@@ -14,25 +15,46 @@ import { pluralize } from "ember-inflector";
14
15
  */
15
16
  function typeResolver(type) {
16
17
  return task(function* () {
17
- const identifiers = [...this[type].identifiers];
18
- const callbacks = [...this[type].callbacks];
18
+ const identifiers = [...(this[type]?.identifiers ?? [])];
19
+ const callbacks = [...(this[type]?.callbacks ?? [])];
19
20
 
20
21
  this[type] = undefined;
21
22
 
22
23
  if (!identifiers.length) return;
23
24
 
25
+ const cached = this[`${type}Cache`];
26
+ const uncachedIdentifiers = identifiers.filter(
27
+ (identifier) =>
28
+ !cached
29
+ .map((resolved) =>
30
+ String(resolved[this.calumaOptions[`${type}IdentifierProperty`]])
31
+ )
32
+ .includes(String(identifier))
33
+ );
34
+
24
35
  const methodName = camelize(`resolve-${pluralize(type)}`);
25
- const result = yield this.calumaOptions[methodName]?.(identifiers);
36
+ const result = uncachedIdentifiers.length
37
+ ? yield this.calumaOptions[methodName]?.(uncachedIdentifiers)
38
+ : [];
39
+
40
+ const allResults = [...cached, ...(result?.toArray?.() ?? result ?? [])];
26
41
 
27
- yield Promise.all(callbacks.map((callback) => callback(result)));
42
+ if (result?.length) {
43
+ this[`${type}Cache`] = allResults;
44
+ }
45
+
46
+ yield Promise.all(callbacks.map((callback) => callback(allResults)));
28
47
 
29
- return result;
48
+ return allResults;
30
49
  }).enqueue();
31
50
  }
32
51
 
33
52
  export default class PrivateSchedulerService extends Service {
34
53
  @service calumaOptions;
35
54
 
55
+ @tracked groupCache = [];
56
+ @tracked userCache = [];
57
+
36
58
  @typeResolver("group") resolveGroup;
37
59
  @typeResolver("user") resolveUser;
38
60
 
@@ -18,33 +18,6 @@ export default class CalumaOptionsService extends Service {
18
18
 
19
19
  @tracked currentGroupId;
20
20
 
21
- constructor(...args) {
22
- super(...args);
23
-
24
- this.registerComponentOverride({
25
- label: this.intl.t(
26
- "caluma.form-builder.question.widgetOverrides.powerselect"
27
- ),
28
- component: "cf-field/input/powerselect",
29
- types: [
30
- "ChoiceQuestion",
31
- "MultipleChoiceQuestion",
32
- "DynamicChoiceQuestion",
33
- "DynamicMultipleChoiceQuestion",
34
- ],
35
- });
36
-
37
- this.registerComponentOverride({
38
- label: this.intl.t("caluma.form-builder.question.widgetOverrides.hidden"),
39
- component: "cf-field/input/hidden",
40
- });
41
-
42
- this.registerComponentOverride({
43
- component: "cfb-form-editor/question/default/table",
44
- types: [],
45
- });
46
- }
47
-
48
21
  _namespace = null;
49
22
  _overrides = {};
50
23
 
@@ -7,6 +7,6 @@ export default function (value, { locale = null } = {}) {
7
7
  return slugify(value, {
8
8
  lower: true,
9
9
  strict: true,
10
- locale,
10
+ locale: locale?.split("-")[0].toLowerCase(),
11
11
  }).substr(0, 127);
12
12
  }
@@ -0,0 +1 @@
1
+ @import "../cc-uikit-powerselect";
@@ -0,0 +1,31 @@
1
+ @import "ember-uikit/variables-theme";
2
+
3
+ // Backgrounds
4
+ $ember-power-select-selected-background: lighten(
5
+ $global-secondary-background,
6
+ 25%
7
+ ) !default;
8
+ $ember-power-select-highlighted-background: lighten(
9
+ $ember-power-select-selected-background,
10
+ 25%
11
+ ) !default;
12
+ $ember-power-select-multiple-selection-background-color: $ember-power-select-selected-background !default;
13
+
14
+ // Texts
15
+ $ember-power-select-highlighted-color: #ffffff !default;
16
+ $ember-power-select-multiple-selection-color: #ffffff !default;
17
+
18
+ .ember-power-select-option[aria-selected="true"] {
19
+ color: $ember-power-select-highlighted-color;
20
+ }
21
+
22
+ // Borders
23
+ $ember-power-select-focus-outline: 0 !default;
24
+ $ember-power-select-border-color: $global-border !default;
25
+ $ember-power-select-default-border-radius: 0 !default;
26
+ $ember-power-select-multiple-option-border-color: $ember-power-select-border-color !default;
27
+
28
+ // Other
29
+ $ember-power-select-line-height: 38px !default;
30
+ $ember-power-select-multiple-option-padding: 0 8px !default;
31
+ $ember-power-select-multiple-option-line-height: 32px !default;
@@ -10,6 +10,6 @@ module.exports = {
10
10
  { name: "ember-intl" },
11
11
  { name: "ember-uikit" },
12
12
  ],
13
- }).then(() => this.addPackagesToProject([{ name: "moment" }]));
13
+ });
14
14
  },
15
15
  };
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
 
3
3
  module.exports = {
4
- name: require("./package").name,
4
+ name: require("./package.json").name,
5
5
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectcaluma/ember-core",
3
- "version": "11.0.0-beta.2",
3
+ "version": "11.0.0-beta.26",
4
4
  "description": "Ember core addon for working with Caluma.",
5
5
  "keywords": [
6
6
  "ember-addon"
@@ -14,38 +14,40 @@
14
14
  "test:ember-compatibility": "ember try:each"
15
15
  },
16
16
  "dependencies": {
17
- "@apollo/client": "^3.5.7",
18
- "@glimmer/tracking": "^1.0.4",
19
- "ember-apollo-client": "^3.2.0",
20
- "ember-auto-import": "^2.3.0",
17
+ "@apollo/client": "^3.6.9",
18
+ "@ember/string": "^3.0.0",
19
+ "@glimmer/tracking": "^1.1.2",
20
+ "ember-apollo-client": "~4.0.2",
21
+ "ember-auto-import": "^2.4.2",
21
22
  "ember-cli-babel": "^7.26.11",
22
- "ember-cli-htmlbars": "^6.0.1",
23
- "ember-concurrency": "^2.2.0",
24
- "ember-fetch": "^8.1.1",
23
+ "ember-cli-htmlbars": "^6.1.0",
24
+ "ember-concurrency": "^2.3.2",
25
+ "ember-fetch": "^8.1.2",
25
26
  "ember-inflector": "^4.0.2",
26
27
  "ember-intl": "^5.7.2",
27
- "ember-resources": "^4.1.3",
28
+ "ember-resources": "^5.3.0",
29
+ "ember-uikit": "^6.0.0",
28
30
  "graphql": "^15.8.0",
29
31
  "graphql-tag": "^2.12.6",
30
32
  "jexl": "^2.3.0",
31
33
  "lodash.clonedeep": "^4.5.0",
32
- "moment": "^2.29.1",
33
34
  "slugify": "^1.6.5"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@ember/optional-features": "2.0.0",
37
- "@ember/render-modifiers": "2.0.3",
38
- "@ember/test-helpers": "2.6.0",
39
- "@embroider/test-setup": "0.50.2",
40
- "@faker-js/faker": "6.0.0-alpha.3",
41
- "@glimmer/component": "1.0.4",
42
- "@projectcaluma/ember-testing": "10.2.0-beta.1",
38
+ "@ember/render-modifiers": "2.0.4",
39
+ "@ember/test-helpers": "2.8.1",
40
+ "@embroider/test-setup": "1.8.3",
41
+ "@embroider/util": "^1.8.3",
42
+ "@faker-js/faker": "7.5.0",
43
+ "@glimmer/component": "1.1.2",
44
+ "@projectcaluma/ember-testing": "11.0.0-beta.26",
43
45
  "broccoli-asset-rev": "3.0.0",
44
46
  "ember-cli": "3.28.5",
45
47
  "ember-cli-code-coverage": "1.0.3",
46
- "ember-cli-dependency-checker": "3.2.0",
48
+ "ember-cli-dependency-checker": "3.3.1",
47
49
  "ember-cli-inject-live-reload": "2.1.0",
48
- "ember-cli-mirage": "2.3.1",
50
+ "ember-cli-mirage": "3.0.0-alpha.3",
49
51
  "ember-cli-sri": "2.1.1",
50
52
  "ember-cli-terser": "4.0.2",
51
53
  "ember-disable-prototype-extensions": "1.1.3",
@@ -54,14 +56,14 @@
54
56
  "ember-maybe-import-regenerator": "1.0.0",
55
57
  "ember-qunit": "5.1.5",
56
58
  "ember-resolver": "8.0.3",
57
- "ember-source": "3.28.8",
59
+ "ember-source": "3.28.9",
58
60
  "ember-source-channel-url": "3.0.0",
59
61
  "ember-try": "2.0.0",
60
62
  "loader.js": "4.7.0",
61
63
  "npm-run-all": "4.1.5",
62
- "qunit": "2.17.2",
64
+ "qunit": "2.19.1",
63
65
  "qunit-dom": "2.0.0",
64
- "webpack": "5.66.0"
66
+ "webpack": "5.74.0"
65
67
  },
66
68
  "engines": {
67
69
  "node": "12.* || 14.* || >= 16"
@@ -1,12 +0,0 @@
1
- query AllFormatValidators {
2
- allFormatValidators {
3
- edges {
4
- node {
5
- slug
6
- name
7
- regex
8
- errorMsg
9
- }
10
- }
11
- }
12
- }
@@ -1,66 +0,0 @@
1
- import { assert } from "@ember/debug";
2
- import Service from "@ember/service";
3
- import { isEmpty } from "@ember/utils";
4
- import { queryManager } from "ember-apollo-client";
5
- import { enqueueTask } from "ember-concurrency";
6
-
7
- import allFormatValidatorsQuery from "@projectcaluma/ember-core/gql/queries/all-format-validators.graphql";
8
-
9
- export default class ValidatorService extends Service {
10
- @queryManager() apollo;
11
-
12
- /**
13
- * Tests a value against one or multiple regular expressions.
14
- *
15
- * ```js
16
- * await this.validator.validate("foo@example.com", ["email", "lowercase"]);
17
- * ```
18
- *
19
- * @param {String} value The value to be tested.
20
- * @param {String[]} slugs A list of tests (via slug) to run.
21
- * @return {RSVP.Promise}
22
- */
23
- async validate(value, slugs) {
24
- if (isEmpty(value)) {
25
- // empty values should not be validated since they are handled by the
26
- // requiredness validation
27
- return slugs.map(() => true);
28
- }
29
-
30
- const validators =
31
- this.validators.lastSuccessful?.value ||
32
- (await this.validators.last)?.value ||
33
- (await this.validators.perform());
34
-
35
- return slugs.map((slug) => {
36
- const validator = validators.find((validator) => validator.slug === slug);
37
-
38
- assert(`No validator found with the slug "${slug}".`, validator);
39
-
40
- return (
41
- validator.regex.test(value) || {
42
- type: "format",
43
- message: undefined,
44
- context: { errorMsg: validator.errorMsg },
45
- value,
46
- }
47
- );
48
- });
49
- }
50
-
51
- @enqueueTask
52
- *validators() {
53
- const raw = yield this.apollo.watchQuery(
54
- { query: allFormatValidatorsQuery },
55
- "allFormatValidators.edges"
56
- );
57
-
58
- return raw.map((rawValidator) => {
59
- return {
60
- slug: rawValidator.node.slug,
61
- regex: new RegExp(rawValidator.node.regex),
62
- errorMsg: rawValidator.node.errorMsg,
63
- };
64
- });
65
- }
66
- }
@@ -1 +0,0 @@
1
- export { default } from "@projectcaluma/ember-core/services/validator";