@antelopejs/dms 0.8.1 → 0.8.3
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 +28 -0
- package/dist/test/unit/interfaces/dms-base/table-and-card-catalog.test.js +25 -0
- package/dist/test/unit/interfaces/dms-base/table-and-card-catalog.test.js.map +1 -1
- package/dist/validation/regional-preferences.schema.d.ts +2 -2
- package/frontend-vue/layers/dms-core/app/utils/url-interpolation.ts +16 -5
- package/frontend-vue/tests/url-interpolation.test.ts +12 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.8.3
|
|
4
|
+
|
|
5
|
+
[compare changes](https://github.com/AntelopeJS/dms/compare/v0.8.2...v0.8.3)
|
|
6
|
+
|
|
7
|
+
### 🚀 Enhancements
|
|
8
|
+
|
|
9
|
+
- **blocks:** Fit the simple options to someone building a page without code ([#251](https://github.com/AntelopeJS/dms/pull/251))
|
|
10
|
+
|
|
11
|
+
### 🏡 Chore
|
|
12
|
+
|
|
13
|
+
- **release:** @antelopejs/interface-dms v0.6.1 ([ad8a713c](https://github.com/AntelopeJS/dms/commit/ad8a713c))
|
|
14
|
+
|
|
15
|
+
### ❤️ Contributors
|
|
16
|
+
|
|
17
|
+
- Glastis ([@Glastis](http://github.com/Glastis))
|
|
18
|
+
|
|
19
|
+
## v0.8.2
|
|
20
|
+
|
|
21
|
+
[compare changes](https://github.com/AntelopeJS/dms/compare/v0.8.1...v0.8.2)
|
|
22
|
+
|
|
23
|
+
### 🩹 Fixes
|
|
24
|
+
|
|
25
|
+
- **links:** Open a row field holding a whole URL as written ([#273](https://github.com/AntelopeJS/dms/pull/273))
|
|
26
|
+
|
|
27
|
+
### ❤️ Contributors
|
|
28
|
+
|
|
29
|
+
- Antony Rizzitelli <rizzitelli.antony@pm.me>
|
|
30
|
+
|
|
3
31
|
## v0.8.1
|
|
4
32
|
|
|
5
33
|
[compare changes](https://github.com/AntelopeJS/dms/compare/v0.8.0...v0.8.1)
|
|
@@ -24,6 +24,31 @@ describe("[unit] interfaces/dms-base/table-view — its row actions in the catal
|
|
|
24
24
|
(0, chai_1.expect)(actions().hasSelection?.default).to.equal(undefined);
|
|
25
25
|
});
|
|
26
26
|
});
|
|
27
|
+
describe("[unit] interfaces/dms-base — options for a page built without code", () => {
|
|
28
|
+
it("leaves a table's technical options to the developer view", () => {
|
|
29
|
+
const table = configOf("TableView");
|
|
30
|
+
for (const option of [
|
|
31
|
+
"maxHeight",
|
|
32
|
+
"expandable",
|
|
33
|
+
"searchShortcut",
|
|
34
|
+
"pinnedRows",
|
|
35
|
+
"liveHold",
|
|
36
|
+
]) {
|
|
37
|
+
(0, chai_1.expect)(table[option]?.ui?.advanced, option).to.equal(true);
|
|
38
|
+
}
|
|
39
|
+
(0, chai_1.expect)(table.caption?.ui?.advanced, "its title").to.equal(undefined);
|
|
40
|
+
});
|
|
41
|
+
it("offers a meter's source with the arrangement it reads", () => {
|
|
42
|
+
const source = configOf("Meter").fetchUrl?.ui;
|
|
43
|
+
(0, chai_1.expect)(source?.responseShape).to.equal("value");
|
|
44
|
+
(0, chai_1.expect)(source?.advanced).to.equal(undefined);
|
|
45
|
+
});
|
|
46
|
+
it("keeps a source no editor can generate for the developer view", () => {
|
|
47
|
+
const source = configOf("ActivityFeed").fetchUrl?.ui;
|
|
48
|
+
(0, chai_1.expect)(source?.responseShape).to.equal(undefined);
|
|
49
|
+
(0, chai_1.expect)(source?.advanced).to.equal(true);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
27
52
|
describe("[unit] interfaces/dms-base/chart-card — the chart it wraps, in the catalog", () => {
|
|
28
53
|
it("names the options of its chart it supplies itself", () => {
|
|
29
54
|
const supplied = configOf("ChartCard").chart?.ui?.supplies;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-and-card-catalog.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-and-card-catalog.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table-and-card-catalog.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-and-card-catalog.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,12 +11,12 @@ export declare const regionalPreferencesSchema: z.ZodObject<{
|
|
|
11
11
|
timeZone?: string | null | undefined;
|
|
12
12
|
weekStart?: 0 | 1 | 6 | null | undefined;
|
|
13
13
|
timeFormat?: "h23" | "h12" | null | undefined;
|
|
14
|
-
dateFormat?: "
|
|
14
|
+
dateFormat?: "text" | "numeric" | null | undefined;
|
|
15
15
|
}, {
|
|
16
16
|
language?: string | undefined;
|
|
17
17
|
timeZone?: string | null | undefined;
|
|
18
18
|
weekStart?: 0 | 1 | 6 | null | undefined;
|
|
19
19
|
timeFormat?: "h23" | "h12" | null | undefined;
|
|
20
|
-
dateFormat?: "
|
|
20
|
+
dateFormat?: "text" | "numeric" | null | undefined;
|
|
21
21
|
}>;
|
|
22
22
|
export type RegionalPreferencesInput = z.infer<typeof regionalPreferencesSchema>;
|
|
@@ -3,6 +3,10 @@ import { get } from "@nuxt/ui/runtime/utils/index.js";
|
|
|
3
3
|
// A row field is named `{{row.<field>}}` (a dotted path reaching into it), as
|
|
4
4
|
// the page's values are `{{params.X}}` / `{{query.X}}`, filled elsewhere.
|
|
5
5
|
const ROW_TOKEN = /\{\{\s*row\.([^{}\s]+)\s*\}\}/g;
|
|
6
|
+
// A template that is one row token and nothing else takes a whole URL from the
|
|
7
|
+
// row (`{{row.invoiceUrl}}`): encoding it would turn its `/` and `?` into
|
|
8
|
+
// `%2F` and `%3F`, leaving no URL to open.
|
|
9
|
+
const WHOLE_ROW_TOKEN = new RegExp(`^\\s*${ROW_TOKEN.source}\\s*$`);
|
|
6
10
|
|
|
7
11
|
/** Whether a template names a field of a row (`{{row.X}}`). */
|
|
8
12
|
export const namesRowField = (template: string): boolean =>
|
|
@@ -30,18 +34,25 @@ function hasSafeScheme(url: string): boolean {
|
|
|
30
34
|
return scheme === undefined || SAFE_SCHEMES.has(scheme.toLowerCase());
|
|
31
35
|
}
|
|
32
36
|
|
|
37
|
+
const fillRowTokens = (url: string, data: Record<string, unknown>): string => {
|
|
38
|
+
const wholeKey = WHOLE_ROW_TOKEN.exec(url)?.[1];
|
|
39
|
+
if (wholeKey !== undefined) return rowValue(data, wholeKey);
|
|
40
|
+
return url.replace(ROW_TOKEN, (_, key: string) =>
|
|
41
|
+
encodeURIComponent(rowValue(data, key)).replace(ENCODED_COLON, ":"),
|
|
42
|
+
);
|
|
43
|
+
};
|
|
44
|
+
|
|
33
45
|
/**
|
|
34
46
|
* Fills the `{{row.field}}` tokens of a URL template with encoded row values,
|
|
35
|
-
* a field the row lacks left empty. A
|
|
36
|
-
*
|
|
47
|
+
* a field the row lacks left empty. A template that is a single token takes
|
|
48
|
+
* the field as the whole URL, unencoded. A result with a scheme other than
|
|
49
|
+
* http, https or mailto comes back empty.
|
|
37
50
|
*/
|
|
38
51
|
export const interpolateUrl = (
|
|
39
52
|
url: string,
|
|
40
53
|
data: Record<string, unknown>,
|
|
41
54
|
): string => {
|
|
42
|
-
const interpolated = url
|
|
43
|
-
encodeURIComponent(rowValue(data, key)).replace(ENCODED_COLON, ":"),
|
|
44
|
-
);
|
|
55
|
+
const interpolated = fillRowTokens(url, data);
|
|
45
56
|
return hasSafeScheme(interpolated) ? interpolated : REFUSED_URL;
|
|
46
57
|
};
|
|
47
58
|
|
|
@@ -4,7 +4,10 @@ import { interpolateUrl } from "../layers/dms-core/app/utils/url-interpolation";
|
|
|
4
4
|
describe("interpolateUrl", () => {
|
|
5
5
|
it("fills row fields into the URL, encoded", () => {
|
|
6
6
|
expect(
|
|
7
|
-
interpolateUrl("/items/{{row._id}}/tag/{{row.name}}", {
|
|
7
|
+
interpolateUrl("/items/{{row._id}}/tag/{{row.name}}", {
|
|
8
|
+
_id: "a1",
|
|
9
|
+
name: "a b/c",
|
|
10
|
+
}),
|
|
8
11
|
).toBe("/items/a1/tag/a%20b%2Fc");
|
|
9
12
|
});
|
|
10
13
|
|
|
@@ -27,6 +30,14 @@ describe("interpolateUrl", () => {
|
|
|
27
30
|
);
|
|
28
31
|
});
|
|
29
32
|
|
|
33
|
+
it("takes a field forming the whole URL as it is", () => {
|
|
34
|
+
const url = "https://pay.stripe.com/invoice/acct_1/x/pdf?s=ap";
|
|
35
|
+
expect(interpolateUrl("{{row.invoiceUrl}}", { invoiceUrl: url })).toBe(url);
|
|
36
|
+
expect(
|
|
37
|
+
interpolateUrl(" {{ row.links.self }} ", { links: { self: "/a/b?c=d" } }),
|
|
38
|
+
).toBe("/a/b?c=d");
|
|
39
|
+
});
|
|
40
|
+
|
|
30
41
|
it("refuses a scheme the row data brings in", () => {
|
|
31
42
|
for (const site of [
|
|
32
43
|
"javascript:alert(1)",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antelopejs/dms",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.3",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/AntelopeJS/dms.git"
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"@antelopejs/interface-data-api": ">=0.2.0 <1.0.0",
|
|
38
38
|
"@antelopejs/interface-database": ">=0.1.8 <1.0.0",
|
|
39
39
|
"@antelopejs/interface-database-decorators": ">=0.1.7 <1.0.0",
|
|
40
|
-
"@antelopejs/interface-dms": ">=0.6.
|
|
40
|
+
"@antelopejs/interface-dms": ">=0.6.1 <0.7.0",
|
|
41
41
|
"@antelopejs/interface-email": ">=0.0.5 <1.0.0",
|
|
42
42
|
"@antelopejs/interface-file-storage": ">=0.1.3 <1.0.0",
|
|
43
43
|
"archiver": "^7.0.1",
|