@antelopejs/dms 0.4.2 → 0.4.4

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 (51) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/pages/settings/users/invites.js +6 -5
  3. package/dist/pages/settings/users/invites.js.map +1 -1
  4. package/dist/pages/settings/users/members.d.ts +1 -0
  5. package/dist/pages/settings/users/members.js +12 -3
  6. package/dist/pages/settings/users/members.js.map +1 -1
  7. package/dist/test/unit/interfaces/dms-base/form-catalog.test.d.ts +1 -0
  8. package/dist/test/unit/interfaces/dms-base/form-catalog.test.js +62 -0
  9. package/dist/test/unit/interfaces/dms-base/form-catalog.test.js.map +1 -0
  10. package/dist/test/unit/interfaces/dms-base/period-selector-catalog.test.d.ts +1 -0
  11. package/dist/test/unit/interfaces/dms-base/period-selector-catalog.test.js +36 -0
  12. package/dist/test/unit/interfaces/dms-base/period-selector-catalog.test.js.map +1 -0
  13. package/dist/test/unit/interfaces/dms-base/resource-form.test.d.ts +1 -0
  14. package/dist/test/unit/interfaces/dms-base/resource-form.test.js +117 -0
  15. package/dist/test/unit/interfaces/dms-base/resource-form.test.js.map +1 -0
  16. package/dist/test/unit/interfaces/dms-base/table-and-card-catalog.test.d.ts +1 -0
  17. package/dist/test/unit/interfaces/dms-base/table-and-card-catalog.test.js +62 -0
  18. package/dist/test/unit/interfaces/dms-base/table-and-card-catalog.test.js.map +1 -0
  19. package/frontend-vue/dms.frontend.ts +2 -0
  20. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +4 -2
  21. package/frontend-vue/layers/dms-layout/app/composables/general/types/index.ts +7 -0
  22. package/frontend-vue/layers/dms-layout/app/composables/general/useColorModePreference.ts +17 -0
  23. package/frontend-vue/layers/dms-layout/app/custom-pages/settings/appearance.vue +6 -6
  24. package/frontend-vue/layers/dms-layout/app/plugins/color-mode.ts +100 -0
  25. package/frontend-vue/layers/dms-ui/app/components/Placeholder.vue +17 -5
  26. package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +14 -9
  27. package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +49 -6
  28. package/frontend-vue/layers/dms-ui/app/components/form/components/Calendar.vue +49 -26
  29. package/frontend-vue/layers/dms-ui/app/components/form/components/DatePicker.vue +77 -32
  30. package/frontend-vue/layers/dms-ui/app/components/grid/Grid.vue +15 -5
  31. package/frontend-vue/layers/dms-ui/app/components/grid/GridRow.vue +7 -4
  32. package/frontend-vue/layers/dms-ui/app/components/grid/constants.ts +8 -1
  33. package/frontend-vue/layers/dms-ui/app/components/kpi/KpiCard.vue +14 -9
  34. package/frontend-vue/layers/dms-ui/app/composables/chart/formatValue.ts +15 -0
  35. package/frontend-vue/layers/dms-ui/app/composables/chart/types.ts +4 -2
  36. package/frontend-vue/layers/dms-ui/app/composables/chart/useThemeRevision.ts +0 -22
  37. package/frontend-vue/layers/dms-ui/app/composables/form/types/props.ts +2 -0
  38. package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +76 -4
  39. package/frontend-vue/layers/dms-ui/app/composables/tree/useTree.ts +5 -7
  40. package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +2 -0
  41. package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +2 -0
  42. package/frontend-vue/package.json +2 -2
  43. package/frontend-vue/pnpm-lock.yaml +7 -33
  44. package/frontend-vue/tests/chart-absent-value.test.ts +78 -0
  45. package/frontend-vue/tests/color-mode-server-render.test.ts +84 -0
  46. package/frontend-vue/tests/color-mode-sync.test.ts +320 -0
  47. package/frontend-vue/tests/form-actions.test.ts +27 -0
  48. package/frontend-vue/tests/form-required-fields.test.ts +44 -0
  49. package/frontend-vue/tests/form-submit-target.test.ts +28 -0
  50. package/frontend-vue/tests/tree-without-source.test.ts +79 -0
  51. package/package.json +1 -1
@@ -0,0 +1,320 @@
1
+ // @vitest-environment jsdom
2
+ /**
3
+ * The color-mode plugin in the browser, in boot order: the server-rendered
4
+ * pre-paint script runs while `<head>` parses, Nuxt UI's `useDark()` runs when
5
+ * the app installs Nuxt UI, then the DMS plugins run. The `dms-color-mode`
6
+ * cookie is the source of truth, and vueuse's store, which Nuxt UI's
7
+ * components share, mirrors it both ways.
8
+ */
9
+ import { useHead } from "@unhead/vue";
10
+ import {
11
+ createHead as createClientHead,
12
+ renderDOMHead,
13
+ } from "@unhead/vue/client";
14
+ import {
15
+ createHead as createServerHead,
16
+ renderSSRHead,
17
+ } from "@unhead/vue/server";
18
+ import { useColorMode, useDark } from "@vueuse/core";
19
+ import {
20
+ computed,
21
+ createApp,
22
+ createSSRApp,
23
+ effectScope,
24
+ ref,
25
+ type EffectScope,
26
+ } from "vue";
27
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
28
+
29
+ interface ColorSchemeChange {
30
+ matches: boolean;
31
+ }
32
+
33
+ type ColorSchemeListener = (change: ColorSchemeChange) => void;
34
+
35
+ type ClientHead = ReturnType<typeof createClientHead>;
36
+
37
+ const DARK_SCHEME_QUERY = "(prefers-color-scheme: dark)";
38
+ const VUEUSE_STORAGE_KEY = "vueuse-color-scheme";
39
+ const colorSchemeListeners = new Set<ColorSchemeListener>();
40
+ const storedPreference = ref("system");
41
+ const cookieWrites = vi.fn();
42
+ const preference = computed({
43
+ get: () => storedPreference.value,
44
+ set: (next: string) => {
45
+ cookieWrites(next);
46
+ storedPreference.value = next;
47
+ },
48
+ });
49
+ let prefersDark = false;
50
+ let scope: EffectScope;
51
+ let clientHead: ClientHead | undefined;
52
+
53
+ vi.stubGlobal("defineDmsPlugin", (setup: unknown) => setup);
54
+ vi.stubGlobal("useHead", useHead);
55
+ vi.stubGlobal("useDmsCookie", () => preference);
56
+
57
+ const { default: colorModePlugin } = await import(
58
+ "../layers/dms-layout/app/plugins/color-mode"
59
+ );
60
+
61
+ async function renderServerHead(): Promise<string> {
62
+ vi.stubEnv("SSR", true);
63
+ const app = createSSRApp({ render: () => null });
64
+ const head = createServerHead();
65
+ app.use(head);
66
+ app.runWithContext(() => colorModePlugin({} as never));
67
+ vi.unstubAllEnvs();
68
+ return (await renderSSRHead(head)).headTags;
69
+ }
70
+
71
+ const serverHead = await renderServerHead();
72
+
73
+ function stubSystemColorScheme(): void {
74
+ vi.stubGlobal("matchMedia", (query: string) => ({
75
+ get matches() {
76
+ return query === DARK_SCHEME_QUERY && prefersDark;
77
+ },
78
+ addEventListener: (_type: string, listener: ColorSchemeListener) =>
79
+ colorSchemeListeners.add(listener),
80
+ removeEventListener: (_type: string, listener: ColorSchemeListener) =>
81
+ colorSchemeListeners.delete(listener),
82
+ }));
83
+ }
84
+
85
+ function switchSystemColorScheme(isDark: boolean): void {
86
+ prefersDark = isDark;
87
+ colorSchemeListeners.forEach((listener) => listener({ matches: isDark }));
88
+ }
89
+
90
+ /** Parses the server's `<head>`, running its inline script as a browser would. */
91
+ function loadDocument(cookie?: string): void {
92
+ if (cookie !== undefined) document.cookie = `dms-color-mode=${cookie}`;
93
+ document.head.innerHTML = serverHead;
94
+ const script = document.querySelector("script#dms-color-mode");
95
+ new Function(script?.textContent ?? "")();
96
+ }
97
+
98
+ /** What `@nuxt/ui/vue-plugin` runs when the app installs it. */
99
+ function bootNuxtUi() {
100
+ return scope.run(() => useDark())!;
101
+ }
102
+
103
+ /** A Nuxt UI color-mode component's store, `UDashboardSearch`'s theme group. */
104
+ function mountNuxtUiComponent() {
105
+ return scope.run(() => useColorMode())!;
106
+ }
107
+
108
+ function bootDmsPlugin(): void {
109
+ const app = createApp({ render: () => null });
110
+ clientHead = createClientHead();
111
+ app.use(clientHead);
112
+ scope.run(() => app.runWithContext(() => colorModePlugin({} as never)));
113
+ }
114
+
115
+ function htmlClasses(): string[] {
116
+ return [...document.documentElement.classList];
117
+ }
118
+
119
+ /** Lets the watchers run and unhead patch the document. */
120
+ async function settle(): Promise<void> {
121
+ await new Promise((resolve) => setTimeout(resolve));
122
+ if (clientHead) await renderDOMHead(clientHead);
123
+ }
124
+
125
+ beforeEach(() => {
126
+ scope = effectScope();
127
+ clientHead = undefined;
128
+ prefersDark = false;
129
+ storedPreference.value = "system";
130
+ cookieWrites.mockClear();
131
+ localStorage.clear();
132
+ document.cookie = "dms-color-mode=; max-age=0";
133
+ document.head.innerHTML = "";
134
+ document.documentElement.className = "";
135
+ stubSystemColorScheme();
136
+ });
137
+
138
+ afterEach(() => {
139
+ scope.stop();
140
+ colorSchemeListeners.clear();
141
+ });
142
+
143
+ describe("pre-paint script", () => {
144
+ it("hands vueuse the cookie's mode, so Nuxt UI boots agreeing", () => {
145
+ localStorage.setItem(VUEUSE_STORAGE_KEY, "light");
146
+ // What the renderer's own pre-paint script may still have added.
147
+ document.documentElement.classList.add("light");
148
+
149
+ loadDocument("%22dark%22");
150
+
151
+ expect(localStorage.getItem(VUEUSE_STORAGE_KEY)).toBe("dark");
152
+ expect(htmlClasses()).toEqual(["dark"]);
153
+ expect(bootNuxtUi().value).toBe(true);
154
+ expect(htmlClasses()).toEqual(["dark"]);
155
+ });
156
+
157
+ it.each([
158
+ {
159
+ source: "light as useDmsCookie writes it, on a dark system",
160
+ cookie: "%22light%22",
161
+ prefersDark: true,
162
+ stored: "light",
163
+ painted: "light",
164
+ },
165
+ {
166
+ source: "a raw dark",
167
+ cookie: "dark",
168
+ prefersDark: false,
169
+ stored: "dark",
170
+ painted: "dark",
171
+ },
172
+ {
173
+ source: "system on a dark system",
174
+ cookie: "%22system%22",
175
+ prefersDark: true,
176
+ stored: "auto",
177
+ painted: "dark",
178
+ },
179
+ {
180
+ source: "no cookie on a light system",
181
+ cookie: undefined,
182
+ prefersDark: false,
183
+ stored: "auto",
184
+ painted: "light",
185
+ },
186
+ {
187
+ source: "an unknown value on a dark system",
188
+ cookie: "%22sepia%22",
189
+ prefersDark: true,
190
+ stored: "auto",
191
+ painted: "dark",
192
+ },
193
+ ])(
194
+ "stores $stored and paints $painted for $source",
195
+ ({ cookie, prefersDark: isDark, stored, painted }) => {
196
+ prefersDark = isDark;
197
+
198
+ loadDocument(cookie);
199
+
200
+ expect(localStorage.getItem(VUEUSE_STORAGE_KEY)).toBe(stored);
201
+ expect(htmlClasses()).toEqual([painted]);
202
+ },
203
+ );
204
+
205
+ it("is left in place by the client head, which neither removes nor re-inserts it", async () => {
206
+ loadDocument("%22dark%22");
207
+ bootNuxtUi();
208
+ bootDmsPlugin();
209
+ await settle();
210
+
211
+ expect(document.querySelectorAll("script#dms-color-mode")).toHaveLength(1);
212
+ });
213
+
214
+ it("is never inserted by the client head when the page was rendered without it", async () => {
215
+ bootNuxtUi();
216
+ bootDmsPlugin();
217
+ await settle();
218
+
219
+ expect(document.querySelectorAll("script#dms-color-mode")).toHaveLength(0);
220
+ });
221
+ });
222
+
223
+ describe("sync with Nuxt UI's store", () => {
224
+ it("boots without writing either side when the script already agreed", async () => {
225
+ storedPreference.value = "dark";
226
+ loadDocument("%22dark%22");
227
+ const setItem = vi.spyOn(Storage.prototype, "setItem");
228
+
229
+ bootNuxtUi();
230
+ bootDmsPlugin();
231
+ await settle();
232
+
233
+ expect(setItem).not.toHaveBeenCalled();
234
+ expect(cookieWrites).not.toHaveBeenCalled();
235
+ expect(htmlClasses()).toEqual(["dark"]);
236
+ setItem.mockRestore();
237
+ });
238
+
239
+ it("brings the store in line on boot when the pre-paint script did not run", async () => {
240
+ storedPreference.value = "dark";
241
+ localStorage.setItem(VUEUSE_STORAGE_KEY, "light");
242
+
243
+ const isDark = bootNuxtUi();
244
+ bootDmsPlugin();
245
+ await settle();
246
+
247
+ expect(isDark.value).toBe(true);
248
+ expect(htmlClasses()).toEqual(["dark"]);
249
+ expect(cookieWrites).not.toHaveBeenCalled();
250
+ });
251
+
252
+ it("mirrors a preference change into the store Nuxt UI's components read", async () => {
253
+ loadDocument();
254
+ bootNuxtUi();
255
+ bootDmsPlugin();
256
+ const component = mountNuxtUiComponent();
257
+
258
+ preference.value = "dark";
259
+ await settle();
260
+
261
+ expect(component.store.value).toBe("dark");
262
+ expect(htmlClasses()).toEqual(["dark"]);
263
+ expect(cookieWrites.mock.calls).toEqual([["dark"]]);
264
+
265
+ preference.value = "system";
266
+ await settle();
267
+
268
+ expect(component.store.value).toBe("auto");
269
+ expect(htmlClasses()).toEqual(["light"]);
270
+ });
271
+
272
+ it("writes a theme picked in a Nuxt UI component back to the cookie", async () => {
273
+ loadDocument();
274
+ bootNuxtUi();
275
+ bootDmsPlugin();
276
+ const component = mountNuxtUiComponent();
277
+
278
+ component.store.value = "dark";
279
+ await settle();
280
+
281
+ expect(cookieWrites.mock.calls).toEqual([["dark"]]);
282
+ expect(htmlClasses()).toEqual(["dark"]);
283
+
284
+ component.store.value = "auto";
285
+ await settle();
286
+
287
+ expect(cookieWrites.mock.calls).toEqual([["dark"], ["system"]]);
288
+ });
289
+
290
+ it.each([true, false])(
291
+ "keeps the class when an explicit mode gives way to a system that resolves the same (dark system: %s)",
292
+ async (isDark) => {
293
+ const mode = isDark ? "dark" : "light";
294
+ prefersDark = isDark;
295
+ storedPreference.value = mode;
296
+ loadDocument(`%22${mode}%22`);
297
+ bootNuxtUi();
298
+ bootDmsPlugin();
299
+ await settle();
300
+
301
+ preference.value = "system";
302
+ await settle();
303
+
304
+ expect(htmlClasses()).toEqual([mode]);
305
+ },
306
+ );
307
+
308
+ it("follows the system color scheme while the preference is system", async () => {
309
+ loadDocument();
310
+ bootNuxtUi();
311
+ bootDmsPlugin();
312
+ await settle();
313
+ expect(htmlClasses()).toEqual(["light"]);
314
+
315
+ switchSystemColorScheme(true);
316
+ await settle();
317
+
318
+ expect(htmlClasses()).toEqual(["dark"]);
319
+ });
320
+ });
@@ -0,0 +1,27 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { formShowsActions } from "../layers/dms-ui/app/composables/form/useForm";
3
+
4
+ describe("formShowsActions", () => {
5
+ it("shows the buttons once the form has somewhere to submit to", () => {
6
+ expect(formShowsActions({ submitUrl: "/api/order/new" }, [{}])).toBe(true);
7
+ expect(formShowsActions({}, [{}])).toBe(false);
8
+ });
9
+
10
+ it("hides them on a form nothing in which can be filled in", () => {
11
+ expect(
12
+ formShowsActions({ submitUrl: "/api/order/new" }, [{ disabled: true }]),
13
+ ).toBe(false);
14
+ });
15
+
16
+ it("shows them when asked, before there is an address or a field", () => {
17
+ expect(formShowsActions({ showActions: true }, [])).toBe(true);
18
+ });
19
+
20
+ it("hides them when asked, whatever the form could submit", () => {
21
+ expect(
22
+ formShowsActions({ showActions: false, submitUrl: "/api/order/new" }, [
23
+ {},
24
+ ]),
25
+ ).toBe(false);
26
+ });
27
+ });
@@ -4,6 +4,7 @@ import { zodToJsonSchema } from "zod-to-json-schema";
4
4
  import { jsonSchemaToZod, type JsonSchema } from "json-schema-to-zod";
5
5
  import {
6
6
  buildValidationSchema,
7
+ isFieldMarkedRequired,
7
8
  makeFieldSchemaRequired,
8
9
  } from "../layers/dms-ui/app/composables/form/useForm";
9
10
 
@@ -86,3 +87,46 @@ describe("buildValidationSchema", () => {
86
87
  expect(schema.safeParse({ firstname: "" }).success).to.equal(true);
87
88
  });
88
89
  });
90
+
91
+ describe("isFieldMarkedRequired", () => {
92
+ const none = new Set<string>();
93
+
94
+ it("marks a field declared required", () => {
95
+ expect(
96
+ isFieldMarkedRequired({ id: "name", required: true }, none, none, none),
97
+ ).to.equal(true);
98
+ expect(isFieldMarkedRequired({ id: "name" }, none, none, none)).to.equal(
99
+ false,
100
+ );
101
+ });
102
+
103
+ it("marks a field a watch action made required", () => {
104
+ expect(
105
+ isFieldMarkedRequired({ id: "name" }, none, none, new Set(["name"])),
106
+ ).to.equal(true);
107
+ });
108
+
109
+ it("does not mark a switch, which always holds a value", () => {
110
+ expect(
111
+ isFieldMarkedRequired(
112
+ { id: "owner", required: true, type: "boolean" },
113
+ none,
114
+ none,
115
+ new Set(["owner"]),
116
+ ),
117
+ ).to.equal(false);
118
+ });
119
+
120
+ it("does not mark a disabled or hidden field, which is not validated", () => {
121
+ const field = { id: "name", required: true };
122
+ expect(
123
+ isFieldMarkedRequired({ ...field, disabled: true }, none, none, none),
124
+ ).to.equal(false);
125
+ expect(
126
+ isFieldMarkedRequired(field, new Set(["name"]), none, none),
127
+ ).to.equal(false);
128
+ expect(
129
+ isFieldMarkedRequired(field, none, new Set(["name"]), none),
130
+ ).to.equal(false);
131
+ });
132
+ });
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { resolveSubmitTarget } from "../layers/dms-ui/app/composables/form/useForm";
3
+
4
+ const page = { routeParams: { id: "42" }, routeQuery: { id: "7" } };
5
+
6
+ describe("resolveSubmitTarget", () => {
7
+ it("sends a submit where its URL points, tokens filled in", () => {
8
+ expect(resolveSubmitTarget("/api/ticket/edit?id={{query.id}}", page)).toEqual(
9
+ { url: "/api/ticket/edit?id=7" },
10
+ );
11
+ expect(resolveSubmitTarget("/api/ticket/edit?id={{params.id}}", page)).toEqual(
12
+ { url: "/api/ticket/edit?id=42" },
13
+ );
14
+ });
15
+
16
+ it("has nowhere to send a read-only form's values", () => {
17
+ expect(resolveSubmitTarget(undefined, page)).toEqual({ missing: "url" });
18
+ expect(resolveSubmitTarget("", page)).toEqual({ missing: "url" });
19
+ });
20
+
21
+ it("refuses a URL naming a row the page does not carry", () => {
22
+ expect(
23
+ resolveSubmitTarget("/api/ticket/edit?id={{query.id}}", {
24
+ routeQuery: {},
25
+ }),
26
+ ).toEqual({ missing: "token" });
27
+ });
28
+ });
@@ -0,0 +1,79 @@
1
+ // @vitest-environment jsdom
2
+ /**
3
+ * A tree is configured after it is placed.
4
+ *
5
+ * The editor drops a block and the author points it at its data afterwards, so
6
+ * a tree with neither a URL nor nodes of its own is a page under construction,
7
+ * not a mistake. It used to throw during setup, which the canvas could only
8
+ * report as a crash on the block the author had just placed.
9
+ */
10
+ import * as vue from "vue";
11
+ import { ref } from "vue";
12
+ import { describe, expect, it, vi } from "vitest";
13
+ import type { TreeProps } from "../layers/dms-ui/app/composables/tree/types";
14
+
15
+ // The layer's auto-imports, as the Nuxt build would supply them: Vue's own
16
+ // first, then the DMS helpers the composable reaches for.
17
+ for (const name of [
18
+ "ref",
19
+ "shallowRef",
20
+ "computed",
21
+ "watch",
22
+ "watchEffect",
23
+ "toValue",
24
+ "nextTick",
25
+ ] as const) {
26
+ vi.stubGlobal(name, vue[name]);
27
+ }
28
+
29
+ vi.stubGlobal(
30
+ "TreeEvents",
31
+ new Proxy({}, { get: (_target, key) => String(key) }),
32
+ );
33
+ vi.stubGlobal("createError", (payload: unknown) => new Error(String(payload)));
34
+ vi.stubGlobal("useAuthFetch", () => ({
35
+ $authFetch: async () => [],
36
+ }));
37
+ vi.stubGlobal("useComponentEvent", () => ({ sendComponentEvent: () => {} }));
38
+ vi.stubGlobal("useDefinedFunctions", () => ({ getFunction: () => undefined }));
39
+ vi.stubGlobal("useTranslation", () => ({ processI18n: (text: string) => text }));
40
+ vi.stubGlobal("useWatch", () => ({ isLoading: ref(false), state: ref({}) }));
41
+ vi.stubGlobal("useToast", () => ({ add: () => {} }));
42
+ vi.stubGlobal("useI18n", () => ({ t: (key: string) => key }));
43
+ vi.stubGlobal("useEventedAction", () => ({ execute: async () => [] }));
44
+ vi.stubGlobal(
45
+ "useDmsAsyncData",
46
+ async (_key: string, handler: () => Promise<unknown>) => ({
47
+ data: ref(await handler()),
48
+ status: ref("success"),
49
+ refresh: async () => {},
50
+ }),
51
+ );
52
+
53
+ const { useTree } = await import(
54
+ "../layers/dms-ui/app/composables/tree/useTree"
55
+ );
56
+
57
+ describe("a tree with no source yet", () => {
58
+ const props = (extra: Partial<TreeProps> = {}) =>
59
+ ({
60
+ selectionBehavior: "toggle",
61
+ componentId: "tree",
62
+ pageId: "page",
63
+ ...extra,
64
+ }) as TreeProps;
65
+
66
+ it("holds nothing, rather than refusing to render", async () => {
67
+ const tree = await useTree(props());
68
+
69
+ expect(tree.items.value).toEqual([]);
70
+ });
71
+
72
+ it("still reads the nodes it is given", async () => {
73
+ const tree = await useTree(
74
+ props({ staticNodes: [{ value: "one", label: "One" }] }),
75
+ );
76
+
77
+ expect(tree.items.value.map((node) => node.value)).toEqual(["one"]);
78
+ });
79
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antelopejs/dms",
3
- "version": "0.4.2",
3
+ "version": "0.4.4",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/AntelopeJS/dms.git"