Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Restrict character sets for attribute values #397

Draft
wants to merge 52 commits into
base: release/v7
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
5df34b7
feat: restrict character sets
Magnus-Kuhn Jan 24, 2025
7efde04
Merge remote-tracking branch 'origin/main' into restrict-character-sets
Magnus-Kuhn Jan 24, 2025
c6eb239
feat: restrict value hints
Magnus-Kuhn Jan 24, 2025
3ae49a0
fix: remove wrong \ in regex
Magnus-Kuhn Jan 24, 2025
2b46a96
refactor: only use unicode codes when necessary
Magnus-Kuhn Jan 25, 2025
aa82195
test: add first character set tests
Magnus-Kuhn Jan 25, 2025
aaf956b
test: add more tests
Magnus-Kuhn Jan 27, 2025
5452b33
fix: import in JobTitle
Magnus-Kuhn Jan 27, 2025
5414c8b
fix: check regex in AbstractXML
Magnus-Kuhn Jan 27, 2025
667a232
fix: undo JSON.stringify replacements
Magnus-Kuhn Jan 28, 2025
03fb0f6
test: remove regex comparison
Magnus-Kuhn Jan 28, 2025
b957dff
test: check error property, change test value to \r
Magnus-Kuhn Jan 28, 2025
9113192
refactor: add character set source warning
Magnus-Kuhn Jan 28, 2025
6c690be
test: fix names containing numbers
Magnus-Kuhn Jan 28, 2025
378fe0e
Merge branch 'main' into restrict-character-sets
Magnus-Kuhn Jan 28, 2025
5db6869
test: fix more names containing numbers
Magnus-Kuhn Jan 28, 2025
be05487
refactor: test variable naming
Magnus-Kuhn Jan 28, 2025
2fd930e
test: change test value
Magnus-Kuhn Jan 28, 2025
9cce0af
feat: validate key of rel attribute
Magnus-Kuhn Jan 28, 2025
a3bc119
fix: missing valueHints adaptations
Magnus-Kuhn Jan 28, 2025
5d0b199
refactor: variable naming
Magnus-Kuhn Jan 28, 2025
e833423
fix: move some checks to custom validators
Magnus-Kuhn Jan 28, 2025
a643b22
refactor: remove conditional from test
Magnus-Kuhn Jan 28, 2025
d1fd080
refactor: test variable naming
Magnus-Kuhn Jan 28, 2025
9da1f64
Merge branch 'main' into restrict-character-sets
Magnus-Kuhn Jan 28, 2025
9b06742
Merge branch 'main' into restrict-character-sets
Magnus-Kuhn Jan 29, 2025
4bc90d6
test: more variety in tested characters
Magnus-Kuhn Jan 29, 2025
b052ea0
fix: make ValueHintsOverride work, add tests
Magnus-Kuhn Jan 29, 2025
1fcb037
refactor: clearer datatype explanation
Magnus-Kuhn Jan 29, 2025
63b0269
Merge branch 'main' into restrict-character-sets
Magnus-Kuhn Jan 29, 2025
9d0fdc1
feat: restrict some addresses
Magnus-Kuhn Jan 29, 2025
5fb432e
feat: restrict attributeQueries
Magnus-Kuhn Jan 29, 2025
0806108
Merge branch 'main' into restrict-character-sets
Magnus-Kuhn Jan 30, 2025
8fbfbac
test: don't test NFC normalization
Magnus-Kuhn Jan 30, 2025
00b6346
refactor: namings in the test
Magnus-Kuhn Jan 30, 2025
e17074f
refactor: cleaner test names
Magnus-Kuhn Jan 30, 2025
3241932
refactor: review comments
Magnus-Kuhn Feb 2, 2025
73e9a6a
refactor: remove unneeded code
Magnus-Kuhn Feb 3, 2025
b33c8f4
refactor: import regex in test
Magnus-Kuhn Feb 3, 2025
460b99f
Merge branch 'main' into restrict-character-sets
Magnus-Kuhn Feb 4, 2025
f46b980
feat: don't validate ProprietaryXML/JSON
Magnus-Kuhn Feb 4, 2025
c341628
Merge branch 'main' into restrict-character-sets
jkoenig134 Feb 17, 2025
0c3a889
Merge branch 'main' into restrict-character-sets
Magnus-Kuhn Feb 24, 2025
22158b6
Merge branch 'main' into restrict-character-sets
Magnus-Kuhn Feb 27, 2025
b24c654
Merge branch 'release/v7' into restrict-character-sets
jkoenig134 Mar 5, 2025
e96086e
Merge branch 'release/v7' into restrict-character-sets
mergify[bot] Mar 5, 2025
1c304a9
Merge branch 'release/v7' into restrict-character-sets
mergify[bot] Mar 6, 2025
8d35c75
Merge branch 'release/v7' into restrict-character-sets
mergify[bot] Mar 6, 2025
d9a610c
Merge branch 'release/v7' into restrict-character-sets
mergify[bot] Mar 6, 2025
a40b043
Merge branch 'release/v7' into restrict-character-sets
mergify[bot] Mar 6, 2025
049490c
Merge branch 'release/v7' into restrict-character-sets
mergify[bot] Mar 6, 2025
78298fe
Merge branch 'release/v7' into restrict-character-sets
mergify[bot] Mar 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions packages/content/src/attributes/constants/CharacterSets.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export const characterSets: Record<string, RegExp> = {
// DIN91379 character sets from https://xoev.de/schemata/din/91379/2022-08/din-norm-91379-datatypes.xsd
// datatype A for names of natural persons
din91379DatatypeA:
/^(\u0020|\u0027|[\u002C-\\u002E]|[\u0041-\u005A]|[\u0060-\u007A]|\u007E|\u00A8|\u00B4|\u00B7|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u017E]|[\u0187-\u0188]|\u018F|\u0197|[\u01A0-\u01A1]|[\u01AF-\u01B0]|\u01B7|[\u01CD-\u01DC]|[\u01DE-\u01DF]|[\u01E2-\u01F0]|[\u01F4-\u01F5]|[\u01F8-\u01FF]|[\u0212-\u0213]|[\u0218-\u021B]|[\u021E-\u021F]|[\u0227-\u0233]|\u0259|\u0268|\u0292|[\u02B9-\u02BA]|[\u02BE-\u02BF]|\u02C8|\u02CC|[\u1E02-\u1E03]|[\u1E06-\u1E07]|[\u1E0A-\u1E11]|\u1E17|[\u1E1C-\u1E2B]|[\u1E2F-\u1E37]|[\u1E3A-\u1E3B]|[\u1E40-\u1E49]|[\u1E52-\u1E5B]|[\u1E5E-\u1E63]|[\u1E6A-\u1E6F]|[\u1E80-\u1E87]|[\u1E8C-\u1E97]|\u1E9E|[\u1EA0-\u1EF9]|\u2019|\u2021|\u0041\u030B|\u0043(\u0300|\u0304|\u0306|\u0308|\u0315|\u0323|\u0326|\u0328\u0306)|\u0044\u0302|\u0046(\u0300|\u0304)|\u0047\u0300|\u0048(\u0304|\u0326|\u0331)|\u004A(\u0301|\u030C)|\u004B(\u0300|\u0302|\u0304|\u0307|\u0315|\u031B|\u0326|\u035F\u0048|\u035F\u0068)|\u004C(\u0302|\u0325|\u0325\u0304|\u0326)|\u004D(\u0300|\u0302|\u0306|\u0310)|\u004E(\u0302|\u0304|\u0306|\u0326)|\u0050(\u0300|\u0304|\u0315|\u0323)|\u0052(\u0306|\u0325|\u0325\u0304)|\u0053(\u0300|\u0304|\u031B\u0304|\u0331)|\u0054(\u0300|\u0304|\u0308|\u0315|\u031B)|\u0055\u0307|\u005A(\u0300|\u0304|\u0306|\u0308|\u0327)|\u0061\u030B|\u0063(\u0300|\u0304|\u0306|\u0308|\u0315|\u0323|\u0326|\u0328\u0306)|\u0064\u0302|\u0066(\u0300|\u0304)|\u0067\u0300|\u0068(\u0304|\u0326)|\u006A\u0301|\u006B(\u0300|\u0302|\u0304|\u0307|\u0315|\u031B|\u0326|\u035F\u0068)|\u006C(\u0302|\u0325|\u0325\u0304|\u0326)|\u006D(\u0300|\u0302|\u0306|\u0310)|\u006E(\u0302|\u0304|\u0306|\u0326)|\u0070(\u0300|\u0304|\u0315|\u0323)|\u0072(\u0306|\u0325|\u0325\u0304)|\u0073(\u0300|\u0304|\u031B\u0304|\u0331)|\u0074(\u0300|\u0304|\u0315|\u031B)|\u0075\u0307|\u007A(\u0300|\u0304|\u0306|\u0308|\u0327)|\u00C7\u0306|\u00DB\u0304|\u00E7\u0306|\u00FB\u0304|\u00FF\u0301|\u010C(\u0315|\u0323)|\u010D(\u0315|\u0323)|\u0113\u030D|\u012A\u0301|\u012B\u0301|\u014D\u030D|\u017D(\u0326|\u0327)|\u017E(\u0326|\u0327)|\u1E32\u0304|\u1E33\u0304|\u1E62\u0304|\u1E63\u0304|\u1E6C\u0304|\u1E6D\u0304|\u1EA0\u0308|\u1EA1\u0308|\u1ECC\u0308|\u1ECD\u0308|\u1EE4(\u0304|\u0308)|\u1EE5(\u0304|\u0308))*$/,
// datatype B for all names
din91379DatatypeB:
/^([\u0020-\u007E]|[\u00A1-\u00A3]|\u00A5|[\u00A7-\u00AC]|[\u00AE-\u00B7]|[\u00B9-\u00BB]|[\u00BF-\u017E]|[\u0187-\u0188]|\u018F|\u0197|[\u01A0-\u01A1]|[\u01AF-\u01B0]|\u01B7|[\u01CD-\u01DC]|[\u01DE-\u01DF]|[\u01E2-\u01F0]|[\u01F4-\u01F5]|[\u01F8-\u01FF]|[\u0212-\u0213]|[\u0218-\u021B]|[\u021E-\u021F]|[\u0227-\u0233]|\u0259|\u0268|\u0292|[\u02B9-\u02BA]|[\u02BE-\u02BF]|\u02C8|\u02CC|[\u1E02-\u1E03]|[\u1E06-\u1E07]|[\u1E0A-\u1E11]|\u1E17|[\u1E1C-\u1E2B]|[\u1E2F-\u1E37]|[\u1E3A-\u1E3B]|[\u1E40-\u1E49]|[\u1E52-\u1E5B]|[\u1E5E-\u1E63]|[\u1E6A-\u1E6F]|[\u1E80-\u1E87]|[\u1E8C-\u1E97]|\u1E9E|[\u1EA0-\u1EF9]|\u2019|\u2021|\u20AC|\u0041\u030B|\u0043(\u0300|\u0304|\u0306|\u0308|\u0315|\u0323|\u0326|\u0328\u0306)|\u0044\u0302|\u0046(\u0300|\u0304)|\u0047\u0300|\u0048(\u0304|\u0326|\u0331)|\u004A(\u0301|\u030C)|\u004B(\u0300|\u0302|\u0304|\u0307|\u0315|\u031B|\u0326|\u035F\u0048|\u035F\u0068)|\u004C(\u0302|\u0325|\u0325\u0304|\u0326)|\u004D(\u0300|\u0302|\u0306|\u0310)|\u004E(\u0302|\u0304|\u0306|\u0326)|\u0050(\u0300|\u0304|\u0315|\u0323)|\u0052(\u0306|\u0325|\u0325\u0304)|\u0053(\u0300|\u0304|\u031B\u0304|\u0331)|\u0054(\u0300|\u0304|\u0308|\u0315|\u031B)|\u0055\u0307|\u005A(\u0300|\u0304|\u0306|\u0308|\u0327)|\u0061\u030B|\u0063(\u0300|\u0304|\u0306|\u0308|\u0315|\u0323|\u0326|\u0328\u0306)|\u0064\u0302|\u0066(\u0300|\u0304)|\u0067\u0300|\u0068(\u0304|\u0326)|\u006A\u0301|\u006B(\u0300|\u0302|\u0304|\u0307|\u0315|\u031B|\u0326|\u035F\u0068)|\u006C(\u0302|\u0325|\u0325\u0304|\u0326)|\u006D(\u0300|\u0302|\u0306|\u0310)|\u006E(\u0302|\u0304|\u0306|\u0326)|\u0070(\u0300|\u0304|\u0315|\u0323)|\u0072(\u0306|\u0325|\u0325\u0304)|\u0073(\u0300|\u0304|\u031B\u0304|\u0331)|\u0074(\u0300|\u0304|\u0315|\u031B)|\u0075\u0307|\u007A(\u0300|\u0304|\u0306|\u0308|\u0327)|\u00C7\u0306|\u00DB\u0304|\u00E7\u0306|\u00FB\u0304|\u00FF\u0301|\u010C(\u0315|\u0323)|\u010D(\u0315|\u0323)|\u0113\u030D|\u012A\u0301|\u012B\u0301|\u014D\u030D|\u017D(\u0326|\u0327)|\u017E(\u0326|\u0327)|\u1E32\u0304|\u1E33\u0304|\u1E62\u0304|\u1E63\u0304|\u1E6C\u0304|\u1E6D\u0304|\u1EA0\u0308|\u1EA1\u0308|\u1ECC\u0308|\u1ECD\u0308|\u1EE4(\u0304|\u0308)|\u1EE5(\u0304|\u0308))*$/,
// datatype C for everything
din91379DatatypeC:
/^([\u0009-\u000A]|\u000D|[\u0020-\u007E]|[\u00A0-\u00AC]|[\u00AE-\u017E]|[\u0187-\u0188]|\u018F|\u0197|[\u01A0-\u01A1]|[\u01AF-\u01B0]|\u01B7|[\u01CD-\u01DC]|[\u01DE-\u01DF]|[\u01E2-\u01F0]|[\u01F4-\u01F5]|[\u01F8-\u01FF]|[\u0212-\u0213]|[\u0218-\u021B]|[\u021E-\u021F]|[\u0227-\u0233]|\u0259|\u0268|\u0292|[\u02B9-\u02BA]|[\u02BE-\u02BF]|\u02C8|\u02CC|[\u1E02-\u1E03]|[\u1E06-\u1E07]|[\u1E0A-\u1E11]|\u1E17|[\u1E1C-\u1E2B]|[\u1E2F-\u1E37]|[\u1E3A-\u1E3B]|[\u1E40-\u1E49]|[\u1E52-\u1E5B]|[\u1E5E-\u1E63]|[\u1E6A-\u1E6F]|[\u1E80-\u1E87]|[\u1E8C-\u1E97]|\u1E9E|[\u1EA0-\u1EF9]|\u2019|\u2021|\u20AC|\u0041\u030B|\u0043(\u0300|\u0304|\u0306|\u0308|\u0315|\u0323|\u0326|\u0328\u0306)|\u0044\u0302|\u0046(\u0300|\u0304)|\u0047\u0300|\u0048(\u0304|\u0326|\u0331)|\u004A(\u0301|\u030C)|\u004B(\u0300|\u0302|\u0304|\u0307|\u0315|\u031B|\u0326|\u035F\u0048|\u035F\u0068)|\u004C(\u0302|\u0325|\u0325\u0304|\u0326)|\u004D(\u0300|\u0302|\u0306|\u0310)|\u004E(\u0302|\u0304|\u0306|\u0326)|\u0050(\u0300|\u0304|\u0315|\u0323)|\u0052(\u0306|\u0325|\u0325\u0304)|\u0053(\u0300|\u0304|\u031B\u0304|\u0331)|\u0054(\u0300|\u0304|\u0308|\u0315|\u031B)|\u0055\u0307|\u005A(\u0300|\u0304|\u0306|\u0308|\u0327)|\u0061\u030B|\u0063(\u0300|\u0304|\u0306|\u0308|\u0315|\u0323|\u0326|\u0328\u0306)|\u0064\u0302|\u0066(\u0300|\u0304)|\u0067\u0300|\u0068(\u0304|\u0326)|\u006A\u0301|\u006B(\u0300|\u0302|\u0304|\u0307|\u0315|\u031B|\u0326|\u035F\u0068)|\u006C(\u0302|\u0325|\u0325\u0304|\u0326)|\u006D(\u0300|\u0302|\u0306|\u0310)|\u006E(\u0302|\u0304|\u0306|\u0326)|\u0070(\u0300|\u0304|\u0315|\u0323)|\u0072(\u0306|\u0325|\u0325\u0304)|\u0073(\u0300|\u0304|\u031B\u0304|\u0331)|\u0074(\u0300|\u0304|\u0315|\u031B)|\u0075\u0307|\u007A(\u0300|\u0304|\u0306|\u0308|\u0327)|\u00C7\u0306|\u00DB\u0304|\u00E7\u0306|\u00FB\u0304|\u00FF\u0301|\u010C(\u0315|\u0323)|\u010D(\u0315|\u0323)|\u0113\u030D|\u012A\u0301|\u012B\u0301|\u014D\u030D|\u017D(\u0326|\u0327)|\u017E(\u0326|\u0327)|\u1E32\u0304|\u1E33\u0304|\u1E62\u0304|\u1E63\u0304|\u1E6C\u0304|\u1E6D\u0304|\u1EA0\u0308|\u1EA1\u0308|\u1ECC\u0308|\u1ECD\u0308|\u1EE4(\u0304|\u0308)|\u1EE5(\u0304|\u0308))*$/
};
12 changes: 10 additions & 2 deletions packages/content/src/attributes/types/AbstractString.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { serialize, validate } from "@js-soft/ts-serval";
import { AbstractAttributeValue, AbstractAttributeValueJSON, IAbstractAttributeValue } from "../AbstractAttributeValue";
import { characterSets } from "../constants/CharacterSets";
import { RenderHints, RenderHintsEditType, RenderHintsTechnicalType, ValueHints } from "../hints";

export interface AbstractStringJSON extends AbstractAttributeValueJSON {
Expand All @@ -12,7 +13,7 @@ export interface IAbstractString extends IAbstractAttributeValue {

export class AbstractString extends AbstractAttributeValue implements IAbstractString {
@serialize()
@validate({ max: 100 })
@validate({ max: 100, regExp: characterSets.din91379DatatypeC })
public value: string;

public static override preFrom(value: any): any {
Expand All @@ -26,7 +27,8 @@ export class AbstractString extends AbstractAttributeValue implements IAbstractS

public static get valueHints(): ValueHints {
return ValueHints.from({
max: 100
max: 100,
pattern: characterSets.din91379DatatypeC.toString().slice(1, -1).replaceAll("/", "\\/")
});
}

Expand All @@ -37,3 +39,9 @@ export class AbstractString extends AbstractAttributeValue implements IAbstractS
});
}
}

export const enum DIN91379CharacterSetRegex {
DatatypeA = "^( |'|[,-.]|[A-Z]|[`-z]|~|¨|´|·|[À-Ö]|[Ø-ö]|[ø-ž]|[Ƈ-ƈ]|Ə|Ɨ|[Ơ-ơ]|[Ư-ư]|Ʒ|[Ǎ-ǜ]|[Ǟ-ǟ]|[Ǣ-ǰ]|[Ǵ-ǵ]|[Ǹ-ǿ]|[Ȓ-ȓ]|[Ș-ț]|[Ȟ-ȟ]|[ȧ-ȳ]|ə|ɨ|ʒ|[ʹ-ʺ]|[ʾ-ʿ]|ˈ|ˌ|[Ḃ-ḃ]|[Ḇ-ḇ]|[Ḋ-ḑ]|ḗ|[Ḝ-ḫ]|[ḯ-ḷ]|[Ḻ-ḻ]|[Ṁ-ṉ]|[Ṓ-ṛ]|[Ṟ-ṣ]|[Ṫ-ṯ]|[Ẁ-ẇ]|[Ẍ-ẗ]|ẞ|[Ạ-ỹ]|’|‡|A̋|C(̀|̄|̆|̈|̕|̣|̦|̨̆)|D̂|F(̀|̄)|G̀|H(̄|̦|̱)|J(́|̌)|K(̀|̂|̄|̇|̕|̛|̦|͟H|͟h)|L(̂|̥|̥̄|̦)|M(̀|̂|̆|̐)|N(̂|̄|̆|̦)|P(̀|̄|̕|̣)|R(̆|̥|̥̄)|S(̀|̄|̛̄|̱)|T(̀|̄|̈|̕|̛)|U̇|Z(̀|̄|̆|̈|̧)|a̋|c(̀|̄|̆|̈|̕|̣|̦|̨̆)|d̂|f(̀|̄)|g̀|h(̄|̦)|j́|k(̀|̂|̄|̇|̕|̛|̦|͟h)|l(̂|̥|̥̄|̦)|m(̀|̂|̆|̐)|n(̂|̄|̆|̦)|p(̀|̄|̕|̣)|r(̆|̥|̥̄)|s(̀|̄|̛̄|̱)|t(̀|̄|̕|̛)|u̇|z(̀|̄|̆|̈|̧)|Ç̆|Û̄|ç̆|û̄|ÿ́|Č(̕|̣)|č(̕|̣)|ē̍|Ī́|ī́|ō̍|Ž(̦|̧)|ž(̦|̧)|Ḳ̄|ḳ̄|Ṣ̄|ṣ̄|Ṭ̄|ṭ̄|Ạ̈|ạ̈|Ọ̈|ọ̈|Ụ(̄|̈)|ụ(̄|̈))*$",
DatatypeB = "^([ -~]|[¡-£]|¥|[§-¬]|[®-·]|[¹-»]|[¿-ž]|[Ƈ-ƈ]|Ə|Ɨ|[Ơ-ơ]|[Ư-ư]|Ʒ|[Ǎ-ǜ]|[Ǟ-ǟ]|[Ǣ-ǰ]|[Ǵ-ǵ]|[Ǹ-ǿ]|[Ȓ-ȓ]|[Ș-ț]|[Ȟ-ȟ]|[ȧ-ȳ]|ə|ɨ|ʒ|[ʹ-ʺ]|[ʾ-ʿ]|ˈ|ˌ|[Ḃ-ḃ]|[Ḇ-ḇ]|[Ḋ-ḑ]|ḗ|[Ḝ-ḫ]|[ḯ-ḷ]|[Ḻ-ḻ]|[Ṁ-ṉ]|[Ṓ-ṛ]|[Ṟ-ṣ]|[Ṫ-ṯ]|[Ẁ-ẇ]|[Ẍ-ẗ]|ẞ|[Ạ-ỹ]|’|‡|€|A̋|C(̀|̄|̆|̈|̕|̣|̦|̨̆)|D̂|F(̀|̄)|G̀|H(̄|̦|̱)|J(́|̌)|K(̀|̂|̄|̇|̕|̛|̦|͟H|͟h)|L(̂|̥|̥̄|̦)|M(̀|̂|̆|̐)|N(̂|̄|̆|̦)|P(̀|̄|̕|̣)|R(̆|̥|̥̄)|S(̀|̄|̛̄|̱)|T(̀|̄|̈|̕|̛)|U̇|Z(̀|̄|̆|̈|̧)|a̋|c(̀|̄|̆|̈|̕|̣|̦|̨̆)|d̂|f(̀|̄)|g̀|h(̄|̦)|j́|k(̀|̂|̄|̇|̕|̛|̦|͟h)|l(̂|̥|̥̄|̦)|m(̀|̂|̆|̐)|n(̂|̄|̆|̦)|p(̀|̄|̕|̣)|r(̆|̥|̥̄)|s(̀|̄|̛̄|̱)|t(̀|̄|̕|̛)|u̇|z(̀|̄|̆|̈|̧)|Ç̆|Û̄|ç̆|û̄|ÿ́|Č(̕|̣)|č(̕|̣)|ē̍|Ī́|ī́|ō̍|Ž(̦|̧)|ž(̦|̧)|Ḳ̄|ḳ̄|Ṣ̄|ṣ̄|Ṭ̄|ṭ̄|Ạ̈|ạ̈|Ọ̈|ọ̈|Ụ(̄|̈)|ụ(̄|̈))*$",
DatatypeC = "^([ -~]|[¡-£]|¥|[§-¬]|[®-·]|[¹-»]|[¿-ž]|[Ƈ-ƈ]|Ə|Ɨ|[Ơ-ơ]|[Ư-ư]|Ʒ|[Ǎ-ǜ]|[Ǟ-ǟ]|[Ǣ-ǰ]|[Ǵ-ǵ]|[Ǹ-ǿ]|[Ȓ-ȓ]|[Ș-ț]|[Ȟ-ȟ]|[ȧ-ȳ]|ə|ɨ|ʒ|[ʹ-ʺ]|[ʾ-ʿ]|ˈ|ˌ|[Ḃ-ḃ]|[Ḇ-ḇ]|[Ḋ-ḑ]|ḗ|[Ḝ-ḫ]|[ḯ-ḷ]|[Ḻ-ḻ]|[Ṁ-ṉ]|[Ṓ-ṛ]|[Ṟ-ṣ]|[Ṫ-ṯ]|[Ẁ-ẇ]|[Ẍ-ẗ]|ẞ|[Ạ-ỹ]|’|‡|€|A̋|C(̀|̄|̆|̈|̕|̣|̦|̨̆)|D̂|F(̀|̄)|G̀|H(̄|̦|̱)|J(́|̌)|K(̀|̂|̄|̇|̕|̛|̦|͟H|͟h)|L(̂|̥|̥̄|̦)|M(̀|̂|̆|̐)|N(̂|̄|̆|̦)|P(̀|̄|̕|̣)|R(̆|̥|̥̄)|S(̀|̄|̛̄|̱)|T(̀|̄|̈|̕|̛)|U̇|Z(̀|̄|̆|̈|̧)|a̋|c(̀|̄|̆|̈|̕|̣|̦|̨̆)|d̂|f(̀|̄)|g̀|h(̄|̦)|j́|k(̀|̂|̄|̇|̕|̛|̦|͟h)|l(̂|̥|̥̄|̦)|m(̀|̂|̆|̐)|n(̂|̄|̆|̦)|p(̀|̄|̕|̣)|r(̆|̥|̥̄)|s(̀|̄|̛̄|̱)|t(̀|̄|̕|̛)|u̇|z(̀|̄|̆|̈|̧)|Ç̆|Û̄|ç̆|û̄|ÿ́|Č(̕|̣)|č(̕|̣)|ē̍|Ī́|ī́|ō̍|Ž(̦|̧)|ž(̦|̧)|Ḳ̄|ḳ̄|Ṣ̄|ṣ̄|Ṭ̄|ṭ̄|Ạ̈|ạ̈|Ọ̈|ọ̈|Ụ(̄|̈)|ụ(̄|̈))*$"
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { serialize, validate } from "@js-soft/ts-serval";
import { nameof } from "ts-simple-nameof";
import { AbstractComplexValue, AbstractComplexValueJSON, IAbstractComplexValue } from "../../AbstractComplexValue";
import { characterSets } from "../../constants/CharacterSets";
import { RenderHints, RenderHintsEditType, RenderHintsTechnicalType, ValueHints } from "../../hints";

export interface AbstractAddressJSON extends AbstractComplexValueJSON {
Expand All @@ -13,7 +14,7 @@ export interface IAbstractAddress extends IAbstractComplexValue {

export abstract class AbstractAddress extends AbstractComplexValue implements IAbstractAddress {
@serialize()
@validate({ max: 100 })
@validate({ max: 100, regExp: characterSets.din91379DatatypeB })
public recipient: string;

public static get valueHints(): ValueHints {
Expand Down
5 changes: 3 additions & 2 deletions packages/content/src/attributes/types/address/City.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractName } from "../strings/AbstractName";

export interface CityJSON extends AbstractStringJSON {
"@type": "City";
Expand All @@ -8,7 +9,7 @@ export interface CityJSON extends AbstractStringJSON {
export interface ICity extends IAbstractString {}

@type("City")
export class City extends AbstractString implements ICity {
export class City extends AbstractName implements ICity {
public static from(value: ICity | Omit<CityJSON, "@type"> | string): City {
return this.fromAny(value);
}
Expand Down
5 changes: 3 additions & 2 deletions packages/content/src/attributes/types/address/HouseNumber.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractName } from "../strings/AbstractName";

export interface HouseNumberJSON extends AbstractStringJSON {
"@type": "HouseNumber";
Expand All @@ -8,7 +9,7 @@ export interface HouseNumberJSON extends AbstractStringJSON {
export interface IHouseNumber extends IAbstractString {}

@type("HouseNumber")
export class HouseNumber extends AbstractString implements IHouseNumber {
export class HouseNumber extends AbstractName implements IHouseNumber {
public static from(value: IHouseNumber | Omit<HouseNumberJSON, "@type"> | string): HouseNumber {
return this.fromAny(value);
}
Expand Down
5 changes: 3 additions & 2 deletions packages/content/src/attributes/types/address/State.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractName } from "../strings/AbstractName";

export interface StateJSON extends AbstractStringJSON {
"@type": "State";
Expand All @@ -8,7 +9,7 @@ export interface StateJSON extends AbstractStringJSON {
export interface IState extends IAbstractString {}

@type("State")
export class State extends AbstractString implements IState {
export class State extends AbstractName implements IState {
public static from(value: IState | Omit<StateJSON, "@type"> | string): State {
return this.fromAny(value);
}
Expand Down
5 changes: 3 additions & 2 deletions packages/content/src/attributes/types/address/Street.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractName } from "../strings/AbstractName";

export interface StreetJSON extends AbstractStringJSON {
"@type": "Street";
Expand All @@ -8,7 +9,7 @@ export interface StreetJSON extends AbstractStringJSON {
export interface IStreet extends IAbstractString {}

@type("Street")
export class Street extends AbstractString implements IStreet {
export class Street extends AbstractName implements IStreet {
public static from(value: IStreet | Omit<StreetJSON, "@type"> | string): Street {
return this.fromAny(value);
}
Expand Down
5 changes: 3 additions & 2 deletions packages/content/src/attributes/types/address/ZipCode.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractName } from "../strings/AbstractName";

export interface ZipCodeJSON extends AbstractStringJSON {
"@type": "ZipCode";
Expand All @@ -8,7 +9,7 @@ export interface ZipCodeJSON extends AbstractStringJSON {
export interface IZipCode extends IAbstractString {}

@type("ZipCode")
export class ZipCode extends AbstractString implements IZipCode {
export class ZipCode extends AbstractName implements IZipCode {
public static from(value: IZipCode | Omit<ZipCodeJSON, "@type"> | string): ZipCode {
return this.fromAny(value);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractName } from "../strings/AbstractName";

export interface AffiliationOrganizationJSON extends AbstractStringJSON {
"@type": "AffiliationOrganization";
Expand All @@ -8,7 +9,7 @@ export interface AffiliationOrganizationJSON extends AbstractStringJSON {
export interface IAffiliationOrganization extends IAbstractString {}

@type("AffiliationOrganization")
export class AffiliationOrganization extends AbstractString implements IAffiliationOrganization {
export class AffiliationOrganization extends AbstractName implements IAffiliationOrganization {
public static from(value: IAffiliationOrganization | Omit<AffiliationOrganizationJSON, "@type"> | string): AffiliationOrganization {
return this.fromAny(value);
}
Expand Down
5 changes: 3 additions & 2 deletions packages/content/src/attributes/types/identity/DisplayName.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractName } from "../strings/AbstractName";

export interface DisplayNameJSON extends AbstractStringJSON {
"@type": "DisplayName";
Expand All @@ -8,7 +9,7 @@ export interface DisplayNameJSON extends AbstractStringJSON {
export interface IDisplayName extends IAbstractString {}

@type("DisplayName")
export class DisplayName extends AbstractString implements IDisplayName {
export class DisplayName extends AbstractName implements IDisplayName {
public static from(value: IDisplayName | Omit<DisplayNameJSON, "@type"> | string): DisplayName {
return this.fromAny(value);
}
Expand Down
5 changes: 3 additions & 2 deletions packages/content/src/attributes/types/name/BirthName.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractNaturalPersonName } from "../strings/AbstractNaturalPersonName";

export interface BirthNameJSON extends AbstractStringJSON {
"@type": "BirthName";
Expand All @@ -8,7 +9,7 @@ export interface BirthNameJSON extends AbstractStringJSON {
export interface IBirthName extends IAbstractString {}

@type("BirthName")
export class BirthName extends AbstractString implements IBirthName {
export class BirthName extends AbstractNaturalPersonName implements IBirthName {
public static from(value: IBirthName | Omit<BirthNameJSON, "@type"> | string): BirthName {
return this.fromAny(value);
}
Expand Down
5 changes: 3 additions & 2 deletions packages/content/src/attributes/types/name/GivenName.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractNaturalPersonName } from "../strings/AbstractNaturalPersonName";

export interface GivenNameJSON extends AbstractStringJSON {
"@type": "GivenName";
Expand All @@ -8,7 +9,7 @@ export interface GivenNameJSON extends AbstractStringJSON {
export interface IGivenName extends IAbstractString {}

@type("GivenName")
export class GivenName extends AbstractString implements IGivenName {
export class GivenName extends AbstractNaturalPersonName implements IGivenName {
public static from(value: IGivenName | Omit<GivenNameJSON, "@type"> | string): GivenName {
return this.fromAny(value);
}
Expand Down
5 changes: 3 additions & 2 deletions packages/content/src/attributes/types/name/HonorificPrefix.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { type } from "@js-soft/ts-serval";
import { AbstractString, AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractStringJSON, IAbstractString } from "../AbstractString";
import { AbstractNaturalPersonName } from "../strings/AbstractNaturalPersonName";

export interface HonorificPrefixJSON extends AbstractStringJSON {
"@type": "HonorificPrefix";
Expand All @@ -8,7 +9,7 @@ export interface HonorificPrefixJSON extends AbstractStringJSON {
export interface IHonorificPrefix extends IAbstractString {}

@type("HonorificPrefix")
export class HonorificPrefix extends AbstractString implements HonorificPrefix {
export class HonorificPrefix extends AbstractNaturalPersonName implements HonorificPrefix {
public static from(value: HonorificPrefix | Omit<HonorificPrefixJSON, "@type"> | string): HonorificPrefix {
return this.fromAny(value);
}
Expand Down
Loading
Loading