@krizaka/org 0.0.0-stage → 0.2.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.
- package/LICENSE +201 -0
- package/README.md +30 -2
- package/dist/app.schema.json +76 -0
- package/dist/apps/akinaza.json +12 -0
- package/dist/apps/orazaka.json +12 -0
- package/dist/apps/yomizaka.json +12 -0
- package/dist/index.d.ts +816 -0
- package/dist/index.js +451 -0
- package/dist/index.js.map +1 -0
- package/dist/org.json +991 -0
- package/dist/org.schema.json +988 -0
- package/package.json +58 -3
package/dist/index.js
ADDED
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
// package.json
|
|
2
|
+
var package_default = {
|
|
3
|
+
name: "@krizaka/org",
|
|
4
|
+
version: "0.2.0",
|
|
5
|
+
description: "The public facts about Krizaka, in one validated JSON that every footer, site and app reads: legal name, NEQ, \xAB Fait \xE0 Montr\xE9al \xBB in French and English, brand marks, default avatars and banners, the live products and sites, the public contact, the footer line and the mobile apps' public runtime config. Typed data, JSON Schema, and the files published on the CDN.",
|
|
6
|
+
keywords: [
|
|
7
|
+
"krizaka",
|
|
8
|
+
"organization",
|
|
9
|
+
"footer",
|
|
10
|
+
"brand",
|
|
11
|
+
"json-schema"
|
|
12
|
+
],
|
|
13
|
+
homepage: "https://ts.krizaka.com/org",
|
|
14
|
+
bugs: "https://github.com/krizaka/krizaka-ts/issues",
|
|
15
|
+
repository: {
|
|
16
|
+
type: "git",
|
|
17
|
+
url: "git+https://github.com/krizaka/krizaka-ts.git",
|
|
18
|
+
directory: "packages/org"
|
|
19
|
+
},
|
|
20
|
+
license: "Apache-2.0",
|
|
21
|
+
author: "Krizaka (https://www.krizaka.com)",
|
|
22
|
+
type: "module",
|
|
23
|
+
main: "./dist/index.js",
|
|
24
|
+
module: "./dist/index.js",
|
|
25
|
+
types: "./dist/index.d.ts",
|
|
26
|
+
exports: {
|
|
27
|
+
".": {
|
|
28
|
+
types: "./dist/index.d.ts",
|
|
29
|
+
import: "./dist/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./org.json": "./dist/org.json",
|
|
32
|
+
"./org.schema.json": "./dist/org.schema.json",
|
|
33
|
+
"./apps/*.json": "./dist/apps/*.json",
|
|
34
|
+
"./package.json": "./package.json"
|
|
35
|
+
},
|
|
36
|
+
files: [
|
|
37
|
+
"dist",
|
|
38
|
+
"README.md",
|
|
39
|
+
"LICENSE"
|
|
40
|
+
],
|
|
41
|
+
sideEffects: false,
|
|
42
|
+
scripts: {
|
|
43
|
+
build: `node -e "require('node:fs').rmSync('dist',{recursive:true,force:true})" && tsup && node scripts/emit.mjs`,
|
|
44
|
+
lint: "eslint . --max-warnings 0 && tsc --noEmit",
|
|
45
|
+
typecheck: "tsc --noEmit",
|
|
46
|
+
test: "vitest run",
|
|
47
|
+
check: "pnpm run lint && pnpm run test && pnpm run build",
|
|
48
|
+
"publish:cdn": "node scripts/publish.mjs",
|
|
49
|
+
prepublishOnly: "pnpm run build"
|
|
50
|
+
},
|
|
51
|
+
engines: {
|
|
52
|
+
node: ">=22"
|
|
53
|
+
},
|
|
54
|
+
devDependencies: {
|
|
55
|
+
"@krizaka/config": "workspace:^",
|
|
56
|
+
"@types/node": "^22.10.0",
|
|
57
|
+
ajv: "^8.17.0",
|
|
58
|
+
eslint: "^9.39.0",
|
|
59
|
+
tsup: "^8.5.0",
|
|
60
|
+
typescript: "^5.9.3",
|
|
61
|
+
vitest: "^4.1.11"
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// src/defaults.ts
|
|
66
|
+
var BASE = "https://krizaka-assets.b-cdn.net/defaults/v1";
|
|
67
|
+
var DEFAULT_KINDS = ["person", "folder", "organisation", "shop", "banner"];
|
|
68
|
+
var SIZES = { person: [256, 512, 1024], folder: [256, 512, 1024], organisation: [256, 512, 1024], shop: [256, 512, 1024], banner: [960, 1920] };
|
|
69
|
+
var item = (kind, id, alt, drawn) => ({
|
|
70
|
+
id,
|
|
71
|
+
alt,
|
|
72
|
+
urls: {
|
|
73
|
+
...drawn ? { svg: `${BASE}/${kind}/${id}.svg` } : {},
|
|
74
|
+
webp: Object.fromEntries(SIZES[kind].map((size) => [String(size), `${BASE}/${kind}/${id}-${size}.webp`]))
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
var tones = (kind, id, alt) => Array.from({ length: 6 }, (_, i) => item(kind, `${id}-${i + 1}`, alt(i + 1), true));
|
|
78
|
+
var PEOPLE = [
|
|
79
|
+
["boom-bap", { en: "Illustration: a rapper in a denim jacket and beanie, microphone in hand, in a rainy Montr\xE9al alley at night", fr: "Illustration : un rappeur en veste de jean et tuque, micro \xE0 la main, dans une ruelle de Montr\xE9al sous la pluie, la nuit" }],
|
|
80
|
+
["rasta-creative", { en: "A smiling man with long dreadlocks in a paint-stained denim jacket, in an artist's workshop", fr: "Un homme souriant aux longues dreadlocks, en veste de jean tach\xE9e de peinture, dans un atelier d'artiste" }],
|
|
81
|
+
["mile-end-hipster", { en: "A smiling person with round glasses and an orange beanie at a leatherworking bench, in a brick workshop", fr: "Une personne souriante \xE0 lunettes rondes et tuque orange, \xE0 son \xE9tabli de cuir, dans un atelier de briques" }],
|
|
82
|
+
["tech-architect", { en: "A person in a dark hoodie typing at a keyboard, between screens of code and a server rack", fr: "Une personne en chandail \xE0 capuchon sombre qui tape au clavier, entre des \xE9crans de code et une baie de serveurs" }],
|
|
83
|
+
["electronic-dj", { en: "A DJ with headphones behind synthesizers and a mixing desk, in a club with violet lights", fr: "Un DJ casque aux oreilles derri\xE8re des synth\xE9tiseurs et une table de mixage, dans un club aux lumi\xE8res violettes" }],
|
|
84
|
+
["visual-artist", { en: "A smiling painter with violet hair and big glasses, palette in hand, in a studio full of canvases", fr: "Une peintre souriante aux cheveux violets et aux grosses lunettes, palette \xE0 la main, dans un atelier plein de toiles" }],
|
|
85
|
+
["salon-tattoo-maker", { en: "A tattoo artist with tattooed arms working on a client in a warm shop with wooden shelves", fr: "Une tatoueuse aux bras tatou\xE9s au travail sur un client, dans un salon chaleureux aux \xE9tag\xE8res de bois" }],
|
|
86
|
+
["wise-auditor", { en: "A grey-haired person with glasses at a desk of old books and a lamp, a pen over open notes", fr: "Une personne aux cheveux gris et \xE0 lunettes \xE0 un bureau de vieux livres et de lampe, un stylo sur des notes ouvertes" }],
|
|
87
|
+
["digital-creator", { en: "A laughing streamer with a microphone in a purple-lit studio under a neon \xAB Creator Zone \xBB sign", fr: "Une diffuseuse qui rit devant un micro, dans un studio violet sous une enseigne n\xE9on \xAB Creator Zone \xBB" }],
|
|
88
|
+
["studio-maker", { en: "A potter in a linen apron holding a clay bowl, in a bright ceramics studio with plants", fr: "Une poti\xE8re en tablier de lin tenant un bol d'argile, dans un atelier de c\xE9ramique lumineux et plein de plantes" }],
|
|
89
|
+
["community-lead", { en: "A smiling person with curly hair and a grey coat at a wooden table, a community space behind them", fr: "Une personne souriante aux cheveux boucl\xE9s et au manteau gris, \xE0 une table de bois, devant un espace communautaire" }],
|
|
90
|
+
["ai-builder", { en: "A thoughtful person with blue-tinted glasses at a desk, screens of a neural network and code behind", fr: "Une personne pensive aux lunettes teint\xE9es de bleu \xE0 son bureau, devant des \xE9crans de r\xE9seau neuronal et de code" }]
|
|
91
|
+
];
|
|
92
|
+
var BANNERS = [
|
|
93
|
+
["montreal-winter-night", { en: "Illustration: a snowy night in downtown Montr\xE9al, lit shop fronts and walkers", fr: "Illustration : une nuit de neige au centre-ville de Montr\xE9al, devantures \xE9clair\xE9es et passants" }],
|
|
94
|
+
["industrial-heritage", { en: "Dark blue skyline of old brick buildings with lit orange windows under a full moon", fr: "Silhouette bleu nuit de vieux immeubles de briques aux fen\xEAtres orang\xE9es, sous la pleine lune" }],
|
|
95
|
+
["creator-loft-studio", { en: "A dark loft desk with a plant, a code window and a mixing board", fr: "Un bureau de loft sombre avec une plante, une fen\xEAtre de code et une table de mixage" }],
|
|
96
|
+
["abstract-digital-flow", { en: "Flowing teal, violet and orange lines linking glowing points on a dark background", fr: "Des lignes ondulantes turquoise, violettes et orange reliant des points lumineux sur fond sombre" }],
|
|
97
|
+
["paperwork-and-ink", { en: "Two dark document cards with colored stamps on a night-blue grid", fr: "Deux cartes de documents sombres tamponn\xE9es de couleur sur une grille bleu nuit" }],
|
|
98
|
+
["nightlife-music-visual", { en: "A large glowing vinyl record with a pink label beside a small level meter, in violet light", fr: "Un grand disque vinyle lumineux \xE0 l'\xE9tiquette rose pr\xE8s d'un petit indicateur de niveau, en lumi\xE8re violette" }],
|
|
99
|
+
["the-mascot-flock", { en: "The Krizaka mascots \u2014 an owl, a beaver and a flamingo \u2014 standing on a shelf in the dark", fr: "Les mascottes de Krizaka \u2014 un hibou, un castor et un flamant \u2014 debout sur une \xE9tag\xE8re dans le noir" }],
|
|
100
|
+
["abstract-stripes", { en: "Diagonal teal, indigo, violet and orange stripes with a white star and \xAB Montr\xE9al // 514 \xBB", fr: "Des bandes diagonales turquoise, indigo, violettes et orange avec une \xE9toile blanche et \xAB Montr\xE9al // 514 \xBB" }],
|
|
101
|
+
["open-source-horizon", { en: "A dark terminal window on a grid, a faint horizon behind", fr: "Une fen\xEAtre de terminal sombre sur une grille, un horizon p\xE2le derri\xE8re" }],
|
|
102
|
+
["cafe-maker-studio", { en: "A warm dark brown scene with a card reading \xAB Fabriqu\xE9 \xE0 Montr\xE9al \xBB", fr: "Une sc\xE8ne brun fonc\xE9 chaleureuse avec une carte \xAB Fabriqu\xE9 \xE0 Montr\xE9al \xBB" }],
|
|
103
|
+
["the-neon-flamingo", { en: "A pink neon flamingo outline on black, with a violet halo", fr: "Le contour d'un flamant rose en n\xE9on sur fond noir, avec un halo violet" }],
|
|
104
|
+
["cooperative-network", { en: "Small linked glowing points over a dark hill at dusk", fr: "De petits points lumineux reli\xE9s au-dessus d'une colline sombre au cr\xE9puscule" }]
|
|
105
|
+
];
|
|
106
|
+
var GLYPH_ALT = {
|
|
107
|
+
person: (n) => ({ en: `Default profile picture: a silhouette, tone ${n}`, fr: `Photo de profil par d\xE9faut : une silhouette, teinte ${n}` }),
|
|
108
|
+
folder: (n) => ({ en: `Default folder picture: a folder, tone ${n}`, fr: `Image de dossier par d\xE9faut : un dossier, teinte ${n}` }),
|
|
109
|
+
organisation: (n) => ({ en: `Default organisation picture: a building, tone ${n}`, fr: `Image d'organisation par d\xE9faut : un immeuble, teinte ${n}` }),
|
|
110
|
+
shop: (n) => ({ en: `Default shop picture: a storefront, tone ${n}`, fr: `Image de boutique par d\xE9faut : une devanture, teinte ${n}` })
|
|
111
|
+
};
|
|
112
|
+
var defaults = {
|
|
113
|
+
version: "v1",
|
|
114
|
+
base: BASE,
|
|
115
|
+
rule: {
|
|
116
|
+
pick: "fnv1a32-modulo",
|
|
117
|
+
description: "defaultFor(kind, seed) = items[fnv1a32(String(seed)) mod items.length] of the kind's list, in the order of the JSON; the same seed always gives the same item, in every app."
|
|
118
|
+
},
|
|
119
|
+
kinds: {
|
|
120
|
+
person: [...tones("person", "silhouette", GLYPH_ALT.person), ...PEOPLE.map(([id, alt]) => item("person", id, alt, false))],
|
|
121
|
+
folder: tones("folder", "folder", GLYPH_ALT.folder),
|
|
122
|
+
organisation: tones("organisation", "organisation", GLYPH_ALT.organisation),
|
|
123
|
+
shop: tones("shop", "shop", GLYPH_ALT.shop),
|
|
124
|
+
banner: BANNERS.map(([id, alt]) => item("banner", id, alt, false))
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
function seedHash(seed) {
|
|
128
|
+
let h = 2166136261;
|
|
129
|
+
for (const ch of String(seed)) {
|
|
130
|
+
h ^= ch.codePointAt(0) ?? 0;
|
|
131
|
+
h = Math.imul(h, 16777619) >>> 0;
|
|
132
|
+
}
|
|
133
|
+
return h;
|
|
134
|
+
}
|
|
135
|
+
function listDefaults(kind, source = defaults) {
|
|
136
|
+
return source.kinds[kind] ?? [];
|
|
137
|
+
}
|
|
138
|
+
function defaultFor(kind, seed, source = defaults) {
|
|
139
|
+
const items = listDefaults(kind, source);
|
|
140
|
+
return items.length === 0 ? void 0 : items[seedHash(seed) % items.length];
|
|
141
|
+
}
|
|
142
|
+
function defaultUrl(entry, size, format = "webp") {
|
|
143
|
+
if (format === "svg" && entry.urls.svg) return entry.urls.svg;
|
|
144
|
+
const sizes = Object.keys(entry.urls.webp).map(Number).sort((a, b) => a - b);
|
|
145
|
+
const chosen = sizes.find((s) => s >= size) ?? sizes[sizes.length - 1];
|
|
146
|
+
return entry.urls.webp[String(chosen)] ?? "";
|
|
147
|
+
}
|
|
148
|
+
async function fetchDefaults(url, fetchImpl = fetch) {
|
|
149
|
+
const res = await fetchImpl(url, { headers: { Accept: "application/json" } });
|
|
150
|
+
if (!res.ok) throw new Error(`${url} answered ${res.status}`);
|
|
151
|
+
const json = await res.json();
|
|
152
|
+
if (!json.defaults) throw new Error(`${url} has no \`defaults\` section`);
|
|
153
|
+
return json.defaults;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// src/org.ts
|
|
157
|
+
var CDN = "https://krizaka-assets.b-cdn.net";
|
|
158
|
+
var ORG_URL = `${CDN}/org/v1/org.json`;
|
|
159
|
+
var ORG_SCHEMA_URL = `${CDN}/org/v1/org.schema.json`;
|
|
160
|
+
var cdn = (path) => `${CDN}/${path}`;
|
|
161
|
+
var mark = (kind, theme) => ({
|
|
162
|
+
svg: cdn(`brand/krizaka/${kind}-${theme}.svg`),
|
|
163
|
+
png64: cdn(`brand/krizaka/${kind}-${theme}-64.png`),
|
|
164
|
+
png256: cdn(`brand/krizaka/${kind}-${theme}-256.png`),
|
|
165
|
+
png512: cdn(`brand/krizaka/${kind}-${theme}-512.png`),
|
|
166
|
+
png1024: cdn(`brand/krizaka/${kind}-${theme}-1024.png`)
|
|
167
|
+
});
|
|
168
|
+
var TONES = [1, 2, 3, 4, 5, 6];
|
|
169
|
+
var avatarAlt = (kind, n) => kind === "person" ? { fr: `Photo de profil par d\xE9faut : silhouette, teinte ${n}`, en: `Default profile picture: silhouette, tone ${n}` } : { fr: `Photo de profil par d\xE9faut : disque uni, teinte ${n}`, en: `Default profile picture: plain disc, tone ${n}` };
|
|
170
|
+
var defaults2 = ["person", "plain"].flatMap(
|
|
171
|
+
(kind) => TONES.map((n) => ({
|
|
172
|
+
id: `${kind}-${n}`,
|
|
173
|
+
kind,
|
|
174
|
+
svg: cdn(`people/defaults/v1/krizaka/${kind}-${n}.svg`),
|
|
175
|
+
webp256: cdn(`people/defaults/v1/krizaka/${kind}-${n}-256.webp`),
|
|
176
|
+
webp512: cdn(`people/defaults/v1/krizaka/${kind}-${n}-512.webp`),
|
|
177
|
+
alt: avatarAlt(kind, n)
|
|
178
|
+
}))
|
|
179
|
+
);
|
|
180
|
+
var org = {
|
|
181
|
+
$schema: ORG_SCHEMA_URL,
|
|
182
|
+
schemaVersion: 2,
|
|
183
|
+
version: package_default.version,
|
|
184
|
+
updatedAt: "2026-10-26",
|
|
185
|
+
company: {
|
|
186
|
+
legalName: "Technologies Krizaka Inc.",
|
|
187
|
+
tradeName: "Krizaka",
|
|
188
|
+
neq: "1182652231",
|
|
189
|
+
city: "Montr\xE9al",
|
|
190
|
+
region: "Qu\xE9bec",
|
|
191
|
+
country: "CA",
|
|
192
|
+
license: "Apache-2.0",
|
|
193
|
+
madeIn: { fr: "Fait \xE0 Montr\xE9al", en: "Made in Montr\xE9al" }
|
|
194
|
+
},
|
|
195
|
+
brand: {
|
|
196
|
+
name: "Krizaka",
|
|
197
|
+
logo: { dark: mark("logo", "dark"), light: mark("logo", "light") },
|
|
198
|
+
mark: { dark: mark("mark", "dark"), light: mark("mark", "light") },
|
|
199
|
+
favicon: cdn("brand/krizaka/favicon.svg"),
|
|
200
|
+
appleTouchIcon: cdn("brand/krizaka/apple-touch-icon.png"),
|
|
201
|
+
socialPreview: cdn("brand/krizaka/social-preview-1280x640.png"),
|
|
202
|
+
manifest: cdn("brand/manifest.json")
|
|
203
|
+
},
|
|
204
|
+
people: {
|
|
205
|
+
defaults: defaults2,
|
|
206
|
+
// No banner is published on the CDN yet; the set joins here with its alts when it is.
|
|
207
|
+
banners: []
|
|
208
|
+
},
|
|
209
|
+
defaults,
|
|
210
|
+
products: [
|
|
211
|
+
{ id: "orazaka", name: "Orazaka", status: "devPreview", url: "https://dev.orazaka.com", repo: "https://github.com/krizaka/orazaka" },
|
|
212
|
+
{ id: "yomizaka", name: "Yomizaka", status: "development", url: "https://dev.yomizaka.com", repo: "https://github.com/krizaka/yomizaka" },
|
|
213
|
+
{ id: "akinaza", name: "Akinaza", status: "development", url: "https://dev.akinaza.com", repo: "https://github.com/krizaka/akinaza" }
|
|
214
|
+
],
|
|
215
|
+
sites: [
|
|
216
|
+
{ id: "www", name: "krizaka.com", url: "https://www.krizaka.com" },
|
|
217
|
+
{ id: "ui", name: "Krizaka UI", url: "https://ui.krizaka.com" },
|
|
218
|
+
{ id: "java", name: "Krizaka Java", url: "https://java.krizaka.com" },
|
|
219
|
+
{ id: "ts", name: "Krizaka TS", url: "https://ts.krizaka.com" },
|
|
220
|
+
{ id: "motion", name: "Krizaka Motion", url: "https://motion.krizaka.com" },
|
|
221
|
+
{ id: "blog", name: "Blog", url: "https://blog.krizaka.com" }
|
|
222
|
+
],
|
|
223
|
+
contact: {
|
|
224
|
+
page: { fr: "https://www.krizaka.com/fr/contact", en: "https://www.krizaka.com/en/contact" },
|
|
225
|
+
email: null
|
|
226
|
+
},
|
|
227
|
+
footer: {
|
|
228
|
+
line: { fr: "Une entreprise de Technologies Krizaka \xB7 Fait \xE0 Montr\xE9al", en: "A Technologies Krizaka company \xB7 Made in Montr\xE9al" },
|
|
229
|
+
legal: [
|
|
230
|
+
{ id: "privacy", label: { fr: "Confidentialit\xE9", en: "Privacy" }, url: { fr: "https://www.krizaka.com/fr/privacy", en: "https://www.krizaka.com/en/privacy" } },
|
|
231
|
+
{ id: "terms", label: { fr: "Conditions", en: "Terms" }, url: { fr: "https://www.krizaka.com/fr/terms", en: "https://www.krizaka.com/en/terms" } }
|
|
232
|
+
]
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
// src/apps.ts
|
|
237
|
+
var APP_SCHEMA_URL = `${CDN}/org/v1/app.schema.json`;
|
|
238
|
+
var UPDATED = "2026-10-26";
|
|
239
|
+
var app = (id, devUrl) => ({
|
|
240
|
+
$schema: APP_SCHEMA_URL,
|
|
241
|
+
schemaVersion: 1,
|
|
242
|
+
app: id,
|
|
243
|
+
// Public by nature: an address a client calls. No key, no token, no internal host.
|
|
244
|
+
apiBaseUrl: { dev: devUrl, production: null },
|
|
245
|
+
features: {},
|
|
246
|
+
minAppVersion: "0.0.0",
|
|
247
|
+
updatedAt: UPDATED
|
|
248
|
+
});
|
|
249
|
+
var apps = {
|
|
250
|
+
orazaka: app("orazaka", "https://dev.orazaka.com"),
|
|
251
|
+
yomizaka: app("yomizaka", "https://dev.yomizaka.com"),
|
|
252
|
+
akinaza: app("akinaza", "https://dev.akinaza.com")
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
// src/schema.ts
|
|
256
|
+
var localized = {
|
|
257
|
+
type: "object",
|
|
258
|
+
additionalProperties: false,
|
|
259
|
+
required: ["fr", "en"],
|
|
260
|
+
properties: { fr: { type: "string", minLength: 1 }, en: { type: "string", minLength: 1 } }
|
|
261
|
+
};
|
|
262
|
+
var httpsUrl = { type: "string", format: "uri", pattern: "^https://" };
|
|
263
|
+
var mark2 = {
|
|
264
|
+
type: "object",
|
|
265
|
+
additionalProperties: false,
|
|
266
|
+
required: ["svg", "png64", "png256", "png512", "png1024"],
|
|
267
|
+
properties: { svg: httpsUrl, png64: httpsUrl, png256: httpsUrl, png512: httpsUrl, png1024: httpsUrl }
|
|
268
|
+
};
|
|
269
|
+
var slug = { type: "string", pattern: "^[a-z0-9]+(-[a-z0-9]+)*$" };
|
|
270
|
+
var themed = { type: "object", additionalProperties: false, required: ["dark", "light"], properties: { dark: mark2, light: mark2 } };
|
|
271
|
+
var date = { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2}$" };
|
|
272
|
+
var semver = { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" };
|
|
273
|
+
var defaultItems = {
|
|
274
|
+
type: "array",
|
|
275
|
+
minItems: 1,
|
|
276
|
+
uniqueItems: true,
|
|
277
|
+
items: {
|
|
278
|
+
type: "object",
|
|
279
|
+
additionalProperties: false,
|
|
280
|
+
required: ["id", "alt", "urls"],
|
|
281
|
+
properties: {
|
|
282
|
+
id: slug,
|
|
283
|
+
alt: localized,
|
|
284
|
+
urls: {
|
|
285
|
+
type: "object",
|
|
286
|
+
additionalProperties: false,
|
|
287
|
+
required: ["webp"],
|
|
288
|
+
properties: { svg: httpsUrl, webp: { type: "object", minProperties: 1, propertyNames: { pattern: "^\\d+$" }, additionalProperties: httpsUrl } }
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
var orgSchema = {
|
|
294
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
295
|
+
$id: ORG_SCHEMA_URL,
|
|
296
|
+
title: "Krizaka organisation \u2014 public facts",
|
|
297
|
+
type: "object",
|
|
298
|
+
additionalProperties: false,
|
|
299
|
+
required: ["$schema", "schemaVersion", "version", "updatedAt", "company", "brand", "people", "defaults", "products", "sites", "contact", "footer"],
|
|
300
|
+
properties: {
|
|
301
|
+
$schema: { type: "string" },
|
|
302
|
+
schemaVersion: { enum: [1, 2] },
|
|
303
|
+
version: semver,
|
|
304
|
+
updatedAt: date,
|
|
305
|
+
company: {
|
|
306
|
+
type: "object",
|
|
307
|
+
additionalProperties: false,
|
|
308
|
+
required: ["legalName", "tradeName", "neq", "city", "region", "country", "license", "madeIn"],
|
|
309
|
+
properties: {
|
|
310
|
+
legalName: { type: "string", minLength: 1 },
|
|
311
|
+
tradeName: { type: "string", minLength: 1 },
|
|
312
|
+
neq: { type: "string", pattern: "^\\d{10}$" },
|
|
313
|
+
city: { type: "string", minLength: 1 },
|
|
314
|
+
region: { type: "string", minLength: 1 },
|
|
315
|
+
country: { type: "string", pattern: "^[A-Z]{2}$" },
|
|
316
|
+
license: { type: "string", minLength: 1 },
|
|
317
|
+
madeIn: localized
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
brand: {
|
|
321
|
+
type: "object",
|
|
322
|
+
additionalProperties: false,
|
|
323
|
+
required: ["name", "logo", "mark", "favicon", "appleTouchIcon", "socialPreview", "manifest"],
|
|
324
|
+
properties: { name: { type: "string", minLength: 1 }, logo: themed, mark: themed, favicon: httpsUrl, appleTouchIcon: httpsUrl, socialPreview: httpsUrl, manifest: httpsUrl }
|
|
325
|
+
},
|
|
326
|
+
people: {
|
|
327
|
+
type: "object",
|
|
328
|
+
additionalProperties: false,
|
|
329
|
+
required: ["defaults", "banners"],
|
|
330
|
+
properties: {
|
|
331
|
+
defaults: {
|
|
332
|
+
type: "array",
|
|
333
|
+
items: {
|
|
334
|
+
type: "object",
|
|
335
|
+
additionalProperties: false,
|
|
336
|
+
required: ["id", "kind", "svg", "webp256", "webp512", "alt"],
|
|
337
|
+
properties: { id: slug, kind: { enum: ["person", "plain"] }, svg: httpsUrl, webp256: httpsUrl, webp512: httpsUrl, alt: localized }
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
banners: {
|
|
341
|
+
type: "array",
|
|
342
|
+
items: { type: "object", additionalProperties: false, required: ["id", "url", "alt"], properties: { id: slug, url: httpsUrl, alt: localized } }
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
defaults: {
|
|
347
|
+
type: "object",
|
|
348
|
+
additionalProperties: false,
|
|
349
|
+
required: ["version", "base", "rule", "kinds"],
|
|
350
|
+
properties: {
|
|
351
|
+
version: { type: "string", pattern: "^v\\d+$" },
|
|
352
|
+
base: httpsUrl,
|
|
353
|
+
rule: { type: "object", additionalProperties: false, required: ["pick", "description"], properties: { pick: { const: "fnv1a32-modulo" }, description: { type: "string", minLength: 1 } } },
|
|
354
|
+
kinds: {
|
|
355
|
+
type: "object",
|
|
356
|
+
additionalProperties: false,
|
|
357
|
+
required: ["person", "folder", "organisation", "shop", "banner"],
|
|
358
|
+
properties: Object.fromEntries(["person", "folder", "organisation", "shop", "banner"].map((kind) => [kind, defaultItems]))
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
products: {
|
|
363
|
+
type: "array",
|
|
364
|
+
minItems: 1,
|
|
365
|
+
items: {
|
|
366
|
+
type: "object",
|
|
367
|
+
additionalProperties: false,
|
|
368
|
+
required: ["id", "name", "status", "url", "repo"],
|
|
369
|
+
properties: { id: slug, name: { type: "string", minLength: 1 }, status: { enum: ["development", "devPreview"] }, url: httpsUrl, repo: httpsUrl }
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
sites: {
|
|
373
|
+
type: "array",
|
|
374
|
+
minItems: 1,
|
|
375
|
+
items: { type: "object", additionalProperties: false, required: ["id", "name", "url"], properties: { id: slug, name: { type: "string", minLength: 1 }, url: httpsUrl } }
|
|
376
|
+
},
|
|
377
|
+
contact: {
|
|
378
|
+
type: "object",
|
|
379
|
+
additionalProperties: false,
|
|
380
|
+
required: ["page", "email"],
|
|
381
|
+
properties: {
|
|
382
|
+
page: { type: "object", additionalProperties: false, required: ["fr", "en"], properties: { fr: httpsUrl, en: httpsUrl } },
|
|
383
|
+
email: { type: ["string", "null"], format: "email" }
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
footer: {
|
|
387
|
+
type: "object",
|
|
388
|
+
additionalProperties: false,
|
|
389
|
+
required: ["line", "legal"],
|
|
390
|
+
properties: {
|
|
391
|
+
line: localized,
|
|
392
|
+
legal: {
|
|
393
|
+
type: "array",
|
|
394
|
+
minItems: 1,
|
|
395
|
+
items: {
|
|
396
|
+
type: "object",
|
|
397
|
+
additionalProperties: false,
|
|
398
|
+
required: ["id", "label", "url"],
|
|
399
|
+
properties: { id: { enum: ["privacy", "terms"] }, label: localized, url: { type: "object", additionalProperties: false, required: ["fr", "en"], properties: { fr: httpsUrl, en: httpsUrl } } }
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
};
|
|
406
|
+
var appSchema = {
|
|
407
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
408
|
+
$id: `${CDN}/org/v1/app.schema.json`,
|
|
409
|
+
title: "Krizaka mobile app \u2014 public runtime config",
|
|
410
|
+
type: "object",
|
|
411
|
+
additionalProperties: false,
|
|
412
|
+
required: ["$schema", "schemaVersion", "app", "apiBaseUrl", "features", "minAppVersion", "updatedAt"],
|
|
413
|
+
properties: {
|
|
414
|
+
$schema: { type: "string" },
|
|
415
|
+
schemaVersion: { const: 1 },
|
|
416
|
+
app: slug,
|
|
417
|
+
apiBaseUrl: {
|
|
418
|
+
type: "object",
|
|
419
|
+
additionalProperties: false,
|
|
420
|
+
required: ["dev", "production"],
|
|
421
|
+
properties: { dev: { anyOf: [httpsUrl, { type: "null" }] }, production: { anyOf: [httpsUrl, { type: "null" }] } }
|
|
422
|
+
},
|
|
423
|
+
features: { type: "object", additionalProperties: { type: "boolean" } },
|
|
424
|
+
minAppVersion: semver,
|
|
425
|
+
updatedAt: date
|
|
426
|
+
}
|
|
427
|
+
};
|
|
428
|
+
|
|
429
|
+
// src/index.ts
|
|
430
|
+
var localized2 = (text, locale) => locale === "fr" ? text.fr : text.en;
|
|
431
|
+
var footerLine = (locale) => localized2(org.footer.line, locale);
|
|
432
|
+
export {
|
|
433
|
+
APP_SCHEMA_URL,
|
|
434
|
+
CDN,
|
|
435
|
+
DEFAULT_KINDS,
|
|
436
|
+
ORG_SCHEMA_URL,
|
|
437
|
+
ORG_URL,
|
|
438
|
+
appSchema,
|
|
439
|
+
apps,
|
|
440
|
+
defaultFor,
|
|
441
|
+
defaultUrl,
|
|
442
|
+
defaults,
|
|
443
|
+
fetchDefaults,
|
|
444
|
+
footerLine,
|
|
445
|
+
listDefaults,
|
|
446
|
+
localized2 as localized,
|
|
447
|
+
org,
|
|
448
|
+
orgSchema,
|
|
449
|
+
seedHash
|
|
450
|
+
};
|
|
451
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/defaults.ts","../src/org.ts","../src/apps.ts","../src/schema.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@krizaka/org\",\n \"version\": \"0.2.0\",\n \"description\": \"The public facts about Krizaka, in one validated JSON that every footer, site and app reads: legal name, NEQ, « Fait à Montréal » in French and English, brand marks, default avatars and banners, the live products and sites, the public contact, the footer line and the mobile apps' public runtime config. Typed data, JSON Schema, and the files published on the CDN.\",\n \"keywords\": [\n \"krizaka\",\n \"organization\",\n \"footer\",\n \"brand\",\n \"json-schema\"\n ],\n \"homepage\": \"https://ts.krizaka.com/org\",\n \"bugs\": \"https://github.com/krizaka/krizaka-ts/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/krizaka/krizaka-ts.git\",\n \"directory\": \"packages/org\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": \"Krizaka (https://www.krizaka.com)\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./org.json\": \"./dist/org.json\",\n \"./org.schema.json\": \"./dist/org.schema.json\",\n \"./apps/*.json\": \"./dist/apps/*.json\",\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"sideEffects\": false,\n \"scripts\": {\n \"build\": \"node -e \\\"require('node:fs').rmSync('dist',{recursive:true,force:true})\\\" && tsup && node scripts/emit.mjs\",\n \"lint\": \"eslint . --max-warnings 0 && tsc --noEmit\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"check\": \"pnpm run lint && pnpm run test && pnpm run build\",\n \"publish:cdn\": \"node scripts/publish.mjs\",\n \"prepublishOnly\": \"pnpm run build\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"devDependencies\": {\n \"@krizaka/config\": \"workspace:^\",\n \"@types/node\": \"^22.10.0\",\n \"ajv\": \"^8.17.0\",\n \"eslint\": \"^9.39.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n }\n}\n","import type { Localized, OrgDefaultItem, OrgDefaultKind, OrgDefaults } from \"./org.types\";\n\n/** The pull zone that serves the sets. Declared here, not imported from `org.ts`, so `org.ts` can build its section from this file. */\nconst BASE = \"https://krizaka-assets.b-cdn.net/defaults/v1\";\n\n/** The kinds of entity that have a default set, in the order the JSON lists them. */\nexport const DEFAULT_KINDS = [\"person\", \"folder\", \"organisation\", \"shop\", \"banner\"] as const satisfies readonly OrgDefaultKind[];\n\n/** The sizes (px) each kind is served in: squares for the pictures, widths for the banners (3:1). */\nconst SIZES: Record<OrgDefaultKind, readonly number[]> = { person: [256, 512, 1024], folder: [256, 512, 1024], organisation: [256, 512, 1024], shop: [256, 512, 1024], banner: [960, 1920] };\n\nconst item = (kind: OrgDefaultKind, id: string, alt: Localized, drawn: boolean): OrgDefaultItem => ({\n id,\n alt,\n urls: {\n ...(drawn ? { svg: `${BASE}/${kind}/${id}.svg` } : {}),\n webp: Object.fromEntries(SIZES[kind].map((size) => [String(size), `${BASE}/${kind}/${id}-${size}.webp`])),\n },\n});\n\nconst tones = (kind: OrgDefaultKind, id: string, alt: (n: number) => Localized): OrgDefaultItem[] => Array.from({ length: 6 }, (_, i) => item(kind, `${id}-${i + 1}`, alt(i + 1), true));\n\n/** The founder's illustrated people (`defaults/v1/person/<id>-<size>.webp`). Alt texts say what the picture shows, never who. */\nconst PEOPLE: [string, Localized][] = [\n [\"boom-bap\", { en: \"Illustration: a rapper in a denim jacket and beanie, microphone in hand, in a rainy Montréal alley at night\", fr: \"Illustration : un rappeur en veste de jean et tuque, micro à la main, dans une ruelle de Montréal sous la pluie, la nuit\" }],\n [\"rasta-creative\", { en: \"A smiling man with long dreadlocks in a paint-stained denim jacket, in an artist's workshop\", fr: \"Un homme souriant aux longues dreadlocks, en veste de jean tachée de peinture, dans un atelier d'artiste\" }],\n [\"mile-end-hipster\", { en: \"A smiling person with round glasses and an orange beanie at a leatherworking bench, in a brick workshop\", fr: \"Une personne souriante à lunettes rondes et tuque orange, à son établi de cuir, dans un atelier de briques\" }],\n [\"tech-architect\", { en: \"A person in a dark hoodie typing at a keyboard, between screens of code and a server rack\", fr: \"Une personne en chandail à capuchon sombre qui tape au clavier, entre des écrans de code et une baie de serveurs\" }],\n [\"electronic-dj\", { en: \"A DJ with headphones behind synthesizers and a mixing desk, in a club with violet lights\", fr: \"Un DJ casque aux oreilles derrière des synthétiseurs et une table de mixage, dans un club aux lumières violettes\" }],\n [\"visual-artist\", { en: \"A smiling painter with violet hair and big glasses, palette in hand, in a studio full of canvases\", fr: \"Une peintre souriante aux cheveux violets et aux grosses lunettes, palette à la main, dans un atelier plein de toiles\" }],\n [\"salon-tattoo-maker\", { en: \"A tattoo artist with tattooed arms working on a client in a warm shop with wooden shelves\", fr: \"Une tatoueuse aux bras tatoués au travail sur un client, dans un salon chaleureux aux étagères de bois\" }],\n [\"wise-auditor\", { en: \"A grey-haired person with glasses at a desk of old books and a lamp, a pen over open notes\", fr: \"Une personne aux cheveux gris et à lunettes à un bureau de vieux livres et de lampe, un stylo sur des notes ouvertes\" }],\n [\"digital-creator\", { en: \"A laughing streamer with a microphone in a purple-lit studio under a neon « Creator Zone » sign\", fr: \"Une diffuseuse qui rit devant un micro, dans un studio violet sous une enseigne néon « Creator Zone »\" }],\n [\"studio-maker\", { en: \"A potter in a linen apron holding a clay bowl, in a bright ceramics studio with plants\", fr: \"Une potière en tablier de lin tenant un bol d'argile, dans un atelier de céramique lumineux et plein de plantes\" }],\n [\"community-lead\", { en: \"A smiling person with curly hair and a grey coat at a wooden table, a community space behind them\", fr: \"Une personne souriante aux cheveux bouclés et au manteau gris, à une table de bois, devant un espace communautaire\" }],\n [\"ai-builder\", { en: \"A thoughtful person with blue-tinted glasses at a desk, screens of a neural network and code behind\", fr: \"Une personne pensive aux lunettes teintées de bleu à son bureau, devant des écrans de réseau neuronal et de code\" }],\n];\n\n/** The founder's banners, 3:1 (`defaults/v1/banner/<id>-<width>.webp`). */\nconst BANNERS: [string, Localized][] = [\n [\"montreal-winter-night\", { en: \"Illustration: a snowy night in downtown Montréal, lit shop fronts and walkers\", fr: \"Illustration : une nuit de neige au centre-ville de Montréal, devantures éclairées et passants\" }],\n [\"industrial-heritage\", { en: \"Dark blue skyline of old brick buildings with lit orange windows under a full moon\", fr: \"Silhouette bleu nuit de vieux immeubles de briques aux fenêtres orangées, sous la pleine lune\" }],\n [\"creator-loft-studio\", { en: \"A dark loft desk with a plant, a code window and a mixing board\", fr: \"Un bureau de loft sombre avec une plante, une fenêtre de code et une table de mixage\" }],\n [\"abstract-digital-flow\", { en: \"Flowing teal, violet and orange lines linking glowing points on a dark background\", fr: \"Des lignes ondulantes turquoise, violettes et orange reliant des points lumineux sur fond sombre\" }],\n [\"paperwork-and-ink\", { en: \"Two dark document cards with colored stamps on a night-blue grid\", fr: \"Deux cartes de documents sombres tamponnées de couleur sur une grille bleu nuit\" }],\n [\"nightlife-music-visual\", { en: \"A large glowing vinyl record with a pink label beside a small level meter, in violet light\", fr: \"Un grand disque vinyle lumineux à l'étiquette rose près d'un petit indicateur de niveau, en lumière violette\" }],\n [\"the-mascot-flock\", { en: \"The Krizaka mascots — an owl, a beaver and a flamingo — standing on a shelf in the dark\", fr: \"Les mascottes de Krizaka — un hibou, un castor et un flamant — debout sur une étagère dans le noir\" }],\n [\"abstract-stripes\", { en: \"Diagonal teal, indigo, violet and orange stripes with a white star and « Montréal // 514 »\", fr: \"Des bandes diagonales turquoise, indigo, violettes et orange avec une étoile blanche et « Montréal // 514 »\" }],\n [\"open-source-horizon\", { en: \"A dark terminal window on a grid, a faint horizon behind\", fr: \"Une fenêtre de terminal sombre sur une grille, un horizon pâle derrière\" }],\n [\"cafe-maker-studio\", { en: \"A warm dark brown scene with a card reading « Fabriqué à Montréal »\", fr: \"Une scène brun foncé chaleureuse avec une carte « Fabriqué à Montréal »\" }],\n [\"the-neon-flamingo\", { en: \"A pink neon flamingo outline on black, with a violet halo\", fr: \"Le contour d'un flamant rose en néon sur fond noir, avec un halo violet\" }],\n [\"cooperative-network\", { en: \"Small linked glowing points over a dark hill at dusk\", fr: \"De petits points lumineux reliés au-dessus d'une colline sombre au crépuscule\" }],\n];\n\nconst GLYPH_ALT = {\n person: (n: number): Localized => ({ en: `Default profile picture: a silhouette, tone ${n}`, fr: `Photo de profil par défaut : une silhouette, teinte ${n}` }),\n folder: (n: number): Localized => ({ en: `Default folder picture: a folder, tone ${n}`, fr: `Image de dossier par défaut : un dossier, teinte ${n}` }),\n organisation: (n: number): Localized => ({ en: `Default organisation picture: a building, tone ${n}`, fr: `Image d'organisation par défaut : un immeuble, teinte ${n}` }),\n shop: (n: number): Localized => ({ en: `Default shop picture: a storefront, tone ${n}`, fr: `Image de boutique par défaut : une devanture, teinte ${n}` }),\n};\n\n/** The `defaults` section of the org JSON: the central sets on Bunny (`defaults/v1/<kind>/<id>-<size>.<ext>`), written by krizaka-ui `tools/export-defaults.mjs`. */\nexport const defaults: OrgDefaults = {\n version: \"v1\",\n base: BASE,\n rule: {\n pick: \"fnv1a32-modulo\",\n description: \"defaultFor(kind, seed) = items[fnv1a32(String(seed)) mod items.length] of the kind's list, in the order of the JSON; the same seed always gives the same item, in every app.\",\n },\n kinds: {\n person: [...tones(\"person\", \"silhouette\", GLYPH_ALT.person), ...PEOPLE.map(([id, alt]) => item(\"person\", id, alt, false))],\n folder: tones(\"folder\", \"folder\", GLYPH_ALT.folder),\n organisation: tones(\"organisation\", \"organisation\", GLYPH_ALT.organisation),\n shop: tones(\"shop\", \"shop\", GLYPH_ALT.shop),\n banner: BANNERS.map(([id, alt]) => item(\"banner\", id, alt, false)),\n },\n};\n\n// ---- reading -------------------------------------------------------------------------------------------------------\n\n/** 32-bit FNV-1a of a seed: stable across runs, devices and products (the same one `@krizaka/ui`'s default avatars use). */\nexport function seedHash(seed: string | number): number {\n let h = 0x811c9dc5;\n for (const ch of String(seed)) {\n h ^= ch.codePointAt(0) ?? 0;\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n return h;\n}\n\n/** The items of a kind, in the order of the JSON. A source other than the bundled one is the JSON an app fetched. */\nexport function listDefaults(kind: OrgDefaultKind, source: OrgDefaults = defaults): readonly OrgDefaultItem[] {\n return source.kinds[kind] ?? [];\n}\n\n/** The item of a kind for a seed (an entity's id): deterministic, so a folder keeps its picture everywhere. `undefined` only when the kind's list is empty. */\nexport function defaultFor(kind: OrgDefaultKind, seed: string | number, source: OrgDefaults = defaults): OrgDefaultItem | undefined {\n const items = listDefaults(kind, source);\n return items.length === 0 ? undefined : items[seedHash(seed) % items.length];\n}\n\n/** The URL of an item at the smallest size that is at least `size` px (or the largest there is); `svg` when the item has a vector and `format` says so. */\nexport function defaultUrl(entry: OrgDefaultItem, size: number, format: \"webp\" | \"svg\" = \"webp\"): string {\n if (format === \"svg\" && entry.urls.svg) return entry.urls.svg;\n const sizes = Object.keys(entry.urls.webp).map(Number).sort((a, b) => a - b);\n const chosen = sizes.find((s) => s >= size) ?? sizes[sizes.length - 1];\n return entry.urls.webp[String(chosen)] ?? \"\";\n}\n\n/** Reads the section from the published JSON (`ORG_URL`), for an app that does not bundle this package. */\nexport async function fetchDefaults(url: string, fetchImpl: typeof fetch = fetch): Promise<OrgDefaults> {\n const res = await fetchImpl(url, { headers: { Accept: \"application/json\" } });\n if (!res.ok) throw new Error(`${url} answered ${res.status}`);\n const json = (await res.json()) as { defaults?: OrgDefaults };\n if (!json.defaults) throw new Error(`${url} has no \\`defaults\\` section`);\n return json.defaults;\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\nimport { defaults as centralDefaults } from \"./defaults\";\nimport type { Localized, Org, OrgAvatar, OrgMark } from \"./org.types\";\n\n/** The pull zone that serves the brand files and this JSON. */\nexport const CDN = \"https://krizaka-assets.b-cdn.net\";\nexport const ORG_URL = `${CDN}/org/v1/org.json`;\nexport const ORG_SCHEMA_URL = `${CDN}/org/v1/org.schema.json`;\n\nconst cdn = (path: string) => `${CDN}/${path}`;\n\nconst mark = (kind: \"logo\" | \"mark\", theme: \"dark\" | \"light\"): OrgMark => ({\n svg: cdn(`brand/krizaka/${kind}-${theme}.svg`),\n png64: cdn(`brand/krizaka/${kind}-${theme}-64.png`),\n png256: cdn(`brand/krizaka/${kind}-${theme}-256.png`),\n png512: cdn(`brand/krizaka/${kind}-${theme}-512.png`),\n png1024: cdn(`brand/krizaka/${kind}-${theme}-1024.png`),\n});\n\nconst TONES = [1, 2, 3, 4, 5, 6] as const;\n\nconst avatarAlt = (kind: \"person\" | \"plain\", n: number): Localized =>\n kind === \"person\"\n ? { fr: `Photo de profil par défaut : silhouette, teinte ${n}`, en: `Default profile picture: silhouette, tone ${n}` }\n : { fr: `Photo de profil par défaut : disque uni, teinte ${n}`, en: `Default profile picture: plain disc, tone ${n}` };\n\n/** The default profile pictures a product shows when a person has no photo (`people/defaults/v1`, krizaka-ui `tools/export-brand.mjs`). */\nconst defaults: OrgAvatar[] = ([\"person\", \"plain\"] as const).flatMap((kind) =>\n TONES.map((n) => ({\n id: `${kind}-${n}`,\n kind,\n svg: cdn(`people/defaults/v1/krizaka/${kind}-${n}.svg`),\n webp256: cdn(`people/defaults/v1/krizaka/${kind}-${n}-256.webp`),\n webp512: cdn(`people/defaults/v1/krizaka/${kind}-${n}-512.webp`),\n alt: avatarAlt(kind, n),\n })),\n);\n\n/** The public facts about Krizaka. Reviewed by pull request; changing a fact is one PR here and a release. */\nexport const org: Org = {\n $schema: ORG_SCHEMA_URL,\n schemaVersion: 2,\n version: pkg.version,\n updatedAt: \"2026-10-26\",\n company: {\n legalName: \"Technologies Krizaka Inc.\",\n tradeName: \"Krizaka\",\n neq: \"1182652231\",\n city: \"Montréal\",\n region: \"Québec\",\n country: \"CA\",\n license: \"Apache-2.0\",\n madeIn: { fr: \"Fait à Montréal\", en: \"Made in Montréal\" },\n },\n brand: {\n name: \"Krizaka\",\n logo: { dark: mark(\"logo\", \"dark\"), light: mark(\"logo\", \"light\") },\n mark: { dark: mark(\"mark\", \"dark\"), light: mark(\"mark\", \"light\") },\n favicon: cdn(\"brand/krizaka/favicon.svg\"),\n appleTouchIcon: cdn(\"brand/krizaka/apple-touch-icon.png\"),\n socialPreview: cdn(\"brand/krizaka/social-preview-1280x640.png\"),\n manifest: cdn(\"brand/manifest.json\"),\n },\n people: {\n defaults,\n // No banner is published on the CDN yet; the set joins here with its alts when it is.\n banners: [],\n },\n defaults: centralDefaults,\n products: [\n { id: \"orazaka\", name: \"Orazaka\", status: \"devPreview\", url: \"https://dev.orazaka.com\", repo: \"https://github.com/krizaka/orazaka\" },\n { id: \"yomizaka\", name: \"Yomizaka\", status: \"development\", url: \"https://dev.yomizaka.com\", repo: \"https://github.com/krizaka/yomizaka\" },\n { id: \"akinaza\", name: \"Akinaza\", status: \"development\", url: \"https://dev.akinaza.com\", repo: \"https://github.com/krizaka/akinaza\" },\n ],\n sites: [\n { id: \"www\", name: \"krizaka.com\", url: \"https://www.krizaka.com\" },\n { id: \"ui\", name: \"Krizaka UI\", url: \"https://ui.krizaka.com\" },\n { id: \"java\", name: \"Krizaka Java\", url: \"https://java.krizaka.com\" },\n { id: \"ts\", name: \"Krizaka TS\", url: \"https://ts.krizaka.com\" },\n { id: \"motion\", name: \"Krizaka Motion\", url: \"https://motion.krizaka.com\" },\n { id: \"blog\", name: \"Blog\", url: \"https://blog.krizaka.com\" },\n ],\n contact: {\n page: { fr: \"https://www.krizaka.com/fr/contact\", en: \"https://www.krizaka.com/en/contact\" },\n email: null,\n },\n footer: {\n line: { fr: \"Une entreprise de Technologies Krizaka · Fait à Montréal\", en: \"A Technologies Krizaka company · Made in Montréal\" },\n legal: [\n { id: \"privacy\", label: { fr: \"Confidentialité\", en: \"Privacy\" }, url: { fr: \"https://www.krizaka.com/fr/privacy\", en: \"https://www.krizaka.com/en/privacy\" } },\n { id: \"terms\", label: { fr: \"Conditions\", en: \"Terms\" }, url: { fr: \"https://www.krizaka.com/fr/terms\", en: \"https://www.krizaka.com/en/terms\" } },\n ],\n },\n};\n","import { CDN } from \"./org\";\nimport type { AppConfig } from \"./org.types\";\n\nexport const APP_SCHEMA_URL = `${CDN}/org/v1/app.schema.json`;\nconst UPDATED = \"2026-10-26\";\n\nconst app = (id: string, devUrl: string): AppConfig => ({\n $schema: APP_SCHEMA_URL,\n schemaVersion: 1,\n app: id,\n // Public by nature: an address a client calls. No key, no token, no internal host.\n apiBaseUrl: { dev: devUrl, production: null },\n features: {},\n minAppVersion: \"0.0.0\",\n updatedAt: UPDATED,\n});\n\n/** The runtime config a mobile app may know, per live product. The app reads it at start, with a copy built into the binary as fallback. */\nexport const apps: Record<string, AppConfig> = {\n orazaka: app(\"orazaka\", \"https://dev.orazaka.com\"),\n yomizaka: app(\"yomizaka\", \"https://dev.yomizaka.com\"),\n akinaza: app(\"akinaza\", \"https://dev.akinaza.com\"),\n};\n","import { CDN, ORG_SCHEMA_URL } from \"./org\";\n\nconst localized = {\n type: \"object\",\n additionalProperties: false,\n required: [\"fr\", \"en\"],\n properties: { fr: { type: \"string\", minLength: 1 }, en: { type: \"string\", minLength: 1 } },\n} as const;\nconst httpsUrl = { type: \"string\", format: \"uri\", pattern: \"^https://\" } as const;\nconst mark = {\n type: \"object\",\n additionalProperties: false,\n required: [\"svg\", \"png64\", \"png256\", \"png512\", \"png1024\"],\n properties: { svg: httpsUrl, png64: httpsUrl, png256: httpsUrl, png512: httpsUrl, png1024: httpsUrl },\n} as const;\nconst slug = { type: \"string\", pattern: \"^[a-z0-9]+(-[a-z0-9]+)*$\" } as const;\nconst themed = { type: \"object\", additionalProperties: false, required: [\"dark\", \"light\"], properties: { dark: mark, light: mark } } as const;\nconst date = { type: \"string\", pattern: \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\" } as const;\nconst semver = { type: \"string\", pattern: \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\" } as const;\n\nconst defaultItems = {\n type: \"array\",\n minItems: 1,\n uniqueItems: true,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"alt\", \"urls\"],\n properties: {\n id: slug,\n alt: localized,\n urls: {\n type: \"object\",\n additionalProperties: false,\n required: [\"webp\"],\n properties: { svg: httpsUrl, webp: { type: \"object\", minProperties: 1, propertyNames: { pattern: \"^\\\\d+$\" }, additionalProperties: httpsUrl } },\n },\n },\n },\n} as const;\n\n/** The JSON Schema of `org/v1/org.json`. Nothing outside it is allowed (`additionalProperties: false` everywhere): a new fact is a new line here first. */\nexport const orgSchema = {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: ORG_SCHEMA_URL,\n title: \"Krizaka organisation — public facts\",\n type: \"object\",\n additionalProperties: false,\n required: [\"$schema\", \"schemaVersion\", \"version\", \"updatedAt\", \"company\", \"brand\", \"people\", \"defaults\", \"products\", \"sites\", \"contact\", \"footer\"],\n properties: {\n $schema: { type: \"string\" },\n schemaVersion: { enum: [1, 2] },\n version: semver,\n updatedAt: date,\n company: {\n type: \"object\",\n additionalProperties: false,\n required: [\"legalName\", \"tradeName\", \"neq\", \"city\", \"region\", \"country\", \"license\", \"madeIn\"],\n properties: {\n legalName: { type: \"string\", minLength: 1 },\n tradeName: { type: \"string\", minLength: 1 },\n neq: { type: \"string\", pattern: \"^\\\\d{10}$\" },\n city: { type: \"string\", minLength: 1 },\n region: { type: \"string\", minLength: 1 },\n country: { type: \"string\", pattern: \"^[A-Z]{2}$\" },\n license: { type: \"string\", minLength: 1 },\n madeIn: localized,\n },\n },\n brand: {\n type: \"object\",\n additionalProperties: false,\n required: [\"name\", \"logo\", \"mark\", \"favicon\", \"appleTouchIcon\", \"socialPreview\", \"manifest\"],\n properties: { name: { type: \"string\", minLength: 1 }, logo: themed, mark: themed, favicon: httpsUrl, appleTouchIcon: httpsUrl, socialPreview: httpsUrl, manifest: httpsUrl },\n },\n people: {\n type: \"object\",\n additionalProperties: false,\n required: [\"defaults\", \"banners\"],\n properties: {\n defaults: {\n type: \"array\",\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"kind\", \"svg\", \"webp256\", \"webp512\", \"alt\"],\n properties: { id: slug, kind: { enum: [\"person\", \"plain\"] }, svg: httpsUrl, webp256: httpsUrl, webp512: httpsUrl, alt: localized },\n },\n },\n banners: {\n type: \"array\",\n items: { type: \"object\", additionalProperties: false, required: [\"id\", \"url\", \"alt\"], properties: { id: slug, url: httpsUrl, alt: localized } },\n },\n },\n },\n defaults: {\n type: \"object\",\n additionalProperties: false,\n required: [\"version\", \"base\", \"rule\", \"kinds\"],\n properties: {\n version: { type: \"string\", pattern: \"^v\\\\d+$\" },\n base: httpsUrl,\n rule: { type: \"object\", additionalProperties: false, required: [\"pick\", \"description\"], properties: { pick: { const: \"fnv1a32-modulo\" }, description: { type: \"string\", minLength: 1 } } },\n kinds: {\n type: \"object\",\n additionalProperties: false,\n required: [\"person\", \"folder\", \"organisation\", \"shop\", \"banner\"],\n properties: Object.fromEntries([\"person\", \"folder\", \"organisation\", \"shop\", \"banner\"].map((kind) => [kind, defaultItems])),\n },\n },\n },\n products: {\n type: \"array\",\n minItems: 1,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"name\", \"status\", \"url\", \"repo\"],\n properties: { id: slug, name: { type: \"string\", minLength: 1 }, status: { enum: [\"development\", \"devPreview\"] }, url: httpsUrl, repo: httpsUrl },\n },\n },\n sites: {\n type: \"array\",\n minItems: 1,\n items: { type: \"object\", additionalProperties: false, required: [\"id\", \"name\", \"url\"], properties: { id: slug, name: { type: \"string\", minLength: 1 }, url: httpsUrl } },\n },\n contact: {\n type: \"object\",\n additionalProperties: false,\n required: [\"page\", \"email\"],\n properties: {\n page: { type: \"object\", additionalProperties: false, required: [\"fr\", \"en\"], properties: { fr: httpsUrl, en: httpsUrl } },\n email: { type: [\"string\", \"null\"], format: \"email\" },\n },\n },\n footer: {\n type: \"object\",\n additionalProperties: false,\n required: [\"line\", \"legal\"],\n properties: {\n line: localized,\n legal: {\n type: \"array\",\n minItems: 1,\n items: {\n type: \"object\",\n additionalProperties: false,\n required: [\"id\", \"label\", \"url\"],\n properties: { id: { enum: [\"privacy\", \"terms\"] }, label: localized, url: { type: \"object\", additionalProperties: false, required: [\"fr\", \"en\"], properties: { fr: httpsUrl, en: httpsUrl } } },\n },\n },\n },\n },\n },\n} as const;\n\n/** The JSON Schema of `apps/<product>.json`. */\nexport const appSchema = {\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: `${CDN}/org/v1/app.schema.json`,\n title: \"Krizaka mobile app — public runtime config\",\n type: \"object\",\n additionalProperties: false,\n required: [\"$schema\", \"schemaVersion\", \"app\", \"apiBaseUrl\", \"features\", \"minAppVersion\", \"updatedAt\"],\n properties: {\n $schema: { type: \"string\" },\n schemaVersion: { const: 1 },\n app: slug,\n apiBaseUrl: {\n type: \"object\",\n additionalProperties: false,\n required: [\"dev\", \"production\"],\n properties: { dev: { anyOf: [httpsUrl, { type: \"null\" }] }, production: { anyOf: [httpsUrl, { type: \"null\" }] } },\n },\n features: { type: \"object\", additionalProperties: { type: \"boolean\" } },\n minAppVersion: semver,\n updatedAt: date,\n },\n} as const;\n","export { APP_SCHEMA_URL,apps } from \"./apps\";\nexport { DEFAULT_KINDS, defaultFor, defaults, defaultUrl, fetchDefaults, listDefaults, seedHash } from \"./defaults\";\nexport { CDN, org, ORG_SCHEMA_URL, ORG_URL } from \"./org\";\nexport type { AppConfig, AppEnvironment, Localized, Org, OrgAvatar, OrgBanner, OrgDefaultItem, OrgDefaultKind, OrgDefaults, OrgMark, OrgProduct, OrgSite, ProductStatus } from \"./org.types\";\nexport { appSchema, orgSchema } from \"./schema\";\n\nimport { org } from \"./org\";\nimport type { Localized } from \"./org.types\";\n\n/** The text of a localized pair for a language (`fr` or `en`; anything else reads English). */\nexport const localized = (text: Localized, locale: string): string => (locale === \"fr\" ? text.fr : text.en);\n\n/** The footer line of the family, « Une entreprise de Technologies Krizaka · Fait à Montréal ». */\nexport const footerLine = (locale: string): string => localized(org.footer.line, locale);\n"],"mappings":"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","names":["defaults","mark","localized"]}
|