Skip to content

Commit 380b9cf

Browse files
committed
refactor: rewrite runtime-core in TypeScript with intermediate build step
1 parent af32751 commit 380b9cf

24 files changed

+100
-151
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,6 @@ apps/outreach/src/content/docs/en/runtime-core-docs/
6262
# docker dbs
6363
mongo/
6464
sqlite/
65+
66+
# runtime core intermediate build
67+
packages/runtime-core/lib/

packages/runtime-core/config/api-extractor.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
3-
"mainEntryPointFilePath": "<projectFolder>/src/index.d.ts",
3+
"mainEntryPointFilePath": "<projectFolder>/lib/index.d.ts",
44
"bundledPackages": ["@douglasneuroinformatics/libui-form-types"],
55
"apiReport": {
66
"enabled": false

packages/runtime-core/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
"./package.json": "./package.json"
1313
},
1414
"scripts": {
15-
"build": "rm -rf dist && pnpm build:js && pnpm build:ts",
16-
"build:js": "pnpm exec esbuild --bundle --format=esm --outfile=dist/index.js --platform=browser src/index.js",
17-
"build:ts": "api-extractor run -c config/api-extractor.json",
15+
"build": "rm -rf dist lib && pnpm build:lib && pnpm build:dist",
16+
"build:dist": "pnpm exec esbuild --bundle --format=esm --outfile=dist/index.js --platform=browser lib/index.js && api-extractor run -c config/api-extractor.json",
17+
"build:lib": "tsc -b tsconfig.build.json",
1818
"format": "prettier --write src",
1919
"lint": "tsc --noEmit && eslint --fix src"
2020
},

packages/runtime-core/src/__tests__/define.test-d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import { z } from 'zod';
33

44
import { defineInstrument } from '../define.js';
55

6-
import type { DiscriminatedInstrument } from '../define.d.ts';
7-
import type { FormInstrument } from '../types/instrument.form.d.ts';
8-
import type { InteractiveInstrument } from '../types/instrument.interactive.d.ts';
6+
import type { DiscriminatedInstrument } from '../define.js';
7+
import type { FormInstrument } from '../types/instrument.form.js';
8+
import type { InteractiveInstrument } from '../types/instrument.interactive.js';
99

1010
expectTypeOf<DiscriminatedInstrument<'FORM', 'en', { foo: string }>>().toMatchTypeOf<
1111
FormInstrument<{ foo: string }, 'en'>

packages/runtime-core/src/define.js

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import type { z } from 'zod';
22

3-
import type { InstrumentKind, InstrumentLanguage } from './types/instrument.base.d.ts';
4-
import type { FormInstrument } from './types/instrument.form.d.ts';
5-
import type { InteractiveInstrument } from './types/instrument.interactive.d.ts';
3+
import type { InstrumentKind, InstrumentLanguage } from './types/instrument.base.js';
4+
import type { FormInstrument } from './types/instrument.form.js';
5+
import type { InteractiveInstrument } from './types/instrument.interactive.js';
66

77
/** @public */
88
// prettier-ignore
9-
type DiscriminatedInstrument<
9+
export type DiscriminatedInstrument<
1010
TKind extends InstrumentKind,
1111
TLanguage extends InstrumentLanguage,
1212
TData
@@ -21,7 +21,7 @@ type DiscriminatedInstrument<
2121
: never;
2222

2323
/** @public */
24-
type InstrumentDef<
24+
export type InstrumentDef<
2525
TKind extends InstrumentKind,
2626
TLanguage extends InstrumentLanguage,
2727
TSchema extends z.ZodTypeAny
@@ -35,8 +35,12 @@ type InstrumentDef<
3535
};
3636

3737
/** @public */
38-
export declare function defineInstrument<
38+
export function defineInstrument<
3939
TKind extends InstrumentKind,
4040
TLanguage extends InstrumentLanguage,
4141
TSchema extends z.ZodTypeAny
42-
>(def: InstrumentDef<TKind, TLanguage, TSchema>): DiscriminatedInstrument<TKind, TLanguage, z.TypeOf<TSchema>>;
42+
>(def: InstrumentDef<TKind, TLanguage, TSchema>) {
43+
return Object.assign(def, {
44+
__runtimeVersion: 1
45+
}) as unknown as DiscriminatedInstrument<TKind, TLanguage, z.TypeOf<TSchema>>;
46+
}

packages/runtime-core/src/i18n.d.ts

Lines changed: 0 additions & 27 deletions
This file was deleted.

packages/runtime-core/src/i18n.js

Lines changed: 0 additions & 47 deletions
This file was deleted.
Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
import { get } from 'lodash-es';
22

3-
import type { Language } from './types/core.d.ts';
3+
import type { Language } from './types/core.js';
44

5-
type LanguageChangeHandler = (this: void, language: Language) => void;
5+
/** @alpha */
6+
export type LanguageChangeHandler = (this: void, language: Language) => void;
67

7-
type TranslationKey<T extends { [key: string]: unknown }, Key = keyof T> = Key extends string
8+
/** @alpha */
9+
export type TranslationKey<T extends { [key: string]: unknown }, Key = keyof T> = Key extends string
810
? T[Key] extends { [key: string]: unknown }
911
? T[Key] extends { [K in Language]: string }
1012
? Key
1113
: `${Key}.${TranslationKey<T[Key]>}`
1214
: `${Key}`
1315
: never;
1416

15-
type I18N<T extends { [key: string]: unknown }> = {
17+
/** @alpha */
18+
export type I18N<T extends { [key: string]: unknown }> = {
19+
changeLanguage: (language: Language) => void;
1620
readonly resolvedLanguage: Language;
1721
set onLanguageChange(value: LanguageChangeHandler);
1822
readonly t: (key: TranslationKey<T>) => string;
1923
};
2024

21-
export function createInstance<const T extends { [key: string]: unknown }>({
25+
/** @alpha */
26+
export function createI18Next<const T extends { [key: string]: unknown }>({
2227
fallbackLanguage = 'en',
2328
translations
2429
}: {
@@ -28,8 +33,12 @@ export function createInstance<const T extends { [key: string]: unknown }>({
2833
let resolvedLanguage: Language;
2934
let handleLanguageChange: LanguageChangeHandler | null = null;
3035

36+
if (!window) {
37+
throw new Error('Window is not defined');
38+
}
39+
3140
const documentElement = window.top!.document.documentElement;
32-
const extractLanguageProperty = (element: HTMLElement): Language => {
41+
const extractLanguageProperty = (element: HTMLElement) => {
3342
if (element.lang === 'en' || element.lang === 'fr') {
3443
return element.lang;
3544
}
@@ -51,16 +60,21 @@ export function createInstance<const T extends { [key: string]: unknown }>({
5160
languageAttributeObserver.observe(documentElement, { attributes: true });
5261

5362
return {
63+
changeLanguage: (language) => {
64+
window.top!.document.dispatchEvent(new CustomEvent('changeLanguage', { detail: language }));
65+
},
5466
set onLanguageChange(handler: LanguageChangeHandler) {
5567
handleLanguageChange = handler;
5668
},
57-
resolvedLanguage,
69+
get resolvedLanguage() {
70+
return resolvedLanguage;
71+
},
5872
t: (key) => {
59-
const value = get(translations, key) as { [K in Language]?: string } | string;
73+
const value = get(translations, key) as { [key: string]: string } | string | undefined;
6074
if (typeof value === 'string') {
6175
return value;
6276
}
63-
return value[resolvedLanguage] ?? value[fallbackLanguage] ?? key;
77+
return value?.[resolvedLanguage] ?? value?.[fallbackLanguage] ?? key;
6478
}
6579
};
6680
}

packages/runtime-core/src/index.d.ts

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)