@joystyk/catalog 0.0.0 → 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/CHANGELOG.md +24 -0
- package/README.md +29 -2
- package/dist/advertise.d.ts +82 -0
- package/dist/advertise.js +203 -0
- package/dist/advertise.js.map +1 -0
- package/dist/categories.d.ts +12 -0
- package/dist/categories.js +45 -0
- package/dist/categories.js.map +1 -0
- package/dist/client.d.ts +1 -0
- package/dist/client.js +9 -0
- package/dist/client.js.map +1 -0
- package/dist/components/advertise.d.ts +4 -0
- package/dist/components/advertise.js +1304 -0
- package/dist/components/advertise.js.map +1 -0
- package/dist/components/app.d.ts +25 -0
- package/dist/components/app.js +106 -0
- package/dist/components/app.js.map +1 -0
- package/dist/components/leaving.d.ts +2 -0
- package/dist/components/leaving.js +104 -0
- package/dist/components/leaving.js.map +1 -0
- package/dist/components/views.d.ts +13 -0
- package/dist/components/views.js +1410 -0
- package/dist/components/views.js.map +1 -0
- package/dist/head.d.ts +6 -0
- package/dist/head.js +33 -0
- package/dist/head.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +12 -0
- package/dist/labels.d.ts +10 -0
- package/dist/labels.js +27 -0
- package/dist/labels.js.map +1 -0
- package/dist/placeholders.d.ts +3 -0
- package/dist/placeholders.js +7 -0
- package/dist/placeholders.js.map +1 -0
- package/dist/registry.d.ts +46 -0
- package/dist/registry.js +106 -0
- package/dist/registry.js.map +1 -0
- package/dist/routes.d.ts +56 -0
- package/dist/routes.js +89 -0
- package/dist/routes.js.map +1 -0
- package/dist/seo.d.ts +31 -0
- package/dist/seo.js +174 -0
- package/dist/seo.js.map +1 -0
- package/dist/server.d.ts +50 -0
- package/dist/server.js +162 -0
- package/dist/server.js.map +1 -0
- package/dist/store.d.ts +202 -0
- package/dist/store.js +136 -0
- package/dist/store.js.map +1 -0
- package/dist/styles.css +1121 -0
- package/dist/wire.d.ts +108 -0
- package/dist/wire.js +74 -0
- package/dist/wire.js.map +1 -0
- package/package.json +63 -11
package/dist/wire.d.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import * as z from 'zod/mini';
|
|
2
|
+
export declare const MODES: readonly ["solo", "ai", "pass-and-play", "p2p", "server", "daily"];
|
|
3
|
+
/** Whether a game can be played yet. Every placeholder is `coming-soon`. */
|
|
4
|
+
export declare const GAME_STATUSES: readonly ["coming-soon", "available"];
|
|
5
|
+
export type GameStatus = (typeof GAME_STATUSES)[number];
|
|
6
|
+
export declare const GameSummarySchema: z.ZodMiniObject<{
|
|
7
|
+
id: z.ZodMiniString<string>;
|
|
8
|
+
name: z.ZodMiniString<string>;
|
|
9
|
+
summary: z.ZodMiniString<string>;
|
|
10
|
+
category: z.ZodMiniString<string>;
|
|
11
|
+
tags: z.ZodMiniArray<z.ZodMiniString<string>>;
|
|
12
|
+
modes: z.ZodMiniArray<z.ZodMiniEnum<{
|
|
13
|
+
daily: "daily";
|
|
14
|
+
ai: "ai";
|
|
15
|
+
server: "server";
|
|
16
|
+
solo: "solo";
|
|
17
|
+
"pass-and-play": "pass-and-play";
|
|
18
|
+
p2p: "p2p";
|
|
19
|
+
}>>;
|
|
20
|
+
players: z.ZodMiniObject<{
|
|
21
|
+
min: z.ZodMiniInt;
|
|
22
|
+
max: z.ZodMiniInt;
|
|
23
|
+
default: z.ZodMiniOptional<z.ZodMiniInt>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
status: z.ZodMiniEnum<{
|
|
26
|
+
"coming-soon": "coming-soon";
|
|
27
|
+
available: "available";
|
|
28
|
+
}>;
|
|
29
|
+
placeholder: z.ZodMiniBoolean<boolean>;
|
|
30
|
+
featured: z.ZodMiniBoolean<boolean>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
/** What a card, a grid tile and a lineup row need. */
|
|
33
|
+
export type GameSummary = z.infer<typeof GameSummarySchema>;
|
|
34
|
+
export declare const GameDetailSchema: z.ZodMiniObject<{
|
|
35
|
+
id: z.ZodMiniString<string>;
|
|
36
|
+
name: z.ZodMiniString<string>;
|
|
37
|
+
summary: z.ZodMiniString<string>;
|
|
38
|
+
category: z.ZodMiniString<string>;
|
|
39
|
+
tags: z.ZodMiniArray<z.ZodMiniString<string>>;
|
|
40
|
+
modes: z.ZodMiniArray<z.ZodMiniEnum<{
|
|
41
|
+
daily: "daily";
|
|
42
|
+
ai: "ai";
|
|
43
|
+
server: "server";
|
|
44
|
+
solo: "solo";
|
|
45
|
+
"pass-and-play": "pass-and-play";
|
|
46
|
+
p2p: "p2p";
|
|
47
|
+
}>>;
|
|
48
|
+
players: z.ZodMiniObject<{
|
|
49
|
+
min: z.ZodMiniInt;
|
|
50
|
+
max: z.ZodMiniInt;
|
|
51
|
+
default: z.ZodMiniOptional<z.ZodMiniInt>;
|
|
52
|
+
}, z.core.$strip>;
|
|
53
|
+
status: z.ZodMiniEnum<{
|
|
54
|
+
"coming-soon": "coming-soon";
|
|
55
|
+
available: "available";
|
|
56
|
+
}>;
|
|
57
|
+
placeholder: z.ZodMiniBoolean<boolean>;
|
|
58
|
+
featured: z.ZodMiniBoolean<boolean>;
|
|
59
|
+
description: z.ZodMiniString<string>;
|
|
60
|
+
pageTitle: z.ZodMiniOptional<z.ZodMiniString<string>>;
|
|
61
|
+
rules: z.ZodMiniArray<z.ZodMiniString<string>>;
|
|
62
|
+
aiLevels: z.ZodMiniArray<z.ZodMiniString<string>>;
|
|
63
|
+
essentialMotion: z.ZodMiniBoolean<boolean>;
|
|
64
|
+
aiContent: z.ZodMiniBoolean<boolean>;
|
|
65
|
+
assets: z.ZodMiniString<string>;
|
|
66
|
+
options: z.ZodMiniOptional<z.ZodMiniCustom<import("@joystyk/contracts").GameOption[], import("@joystyk/contracts").GameOption[]>>;
|
|
67
|
+
attribution: z.ZodMiniOptional<z.ZodMiniObject<{
|
|
68
|
+
text: z.ZodMiniString<string>;
|
|
69
|
+
href: z.ZodMiniString<string>;
|
|
70
|
+
}, z.core.$strip>>;
|
|
71
|
+
}, z.core.$strip>;
|
|
72
|
+
/** What a game page needs. */
|
|
73
|
+
export type GameDetail = z.infer<typeof GameDetailSchema>;
|
|
74
|
+
export declare const GameSummaryListSchema: z.ZodMiniArray<z.ZodMiniObject<{
|
|
75
|
+
id: z.ZodMiniString<string>;
|
|
76
|
+
name: z.ZodMiniString<string>;
|
|
77
|
+
summary: z.ZodMiniString<string>;
|
|
78
|
+
category: z.ZodMiniString<string>;
|
|
79
|
+
tags: z.ZodMiniArray<z.ZodMiniString<string>>;
|
|
80
|
+
modes: z.ZodMiniArray<z.ZodMiniEnum<{
|
|
81
|
+
daily: "daily";
|
|
82
|
+
ai: "ai";
|
|
83
|
+
server: "server";
|
|
84
|
+
solo: "solo";
|
|
85
|
+
"pass-and-play": "pass-and-play";
|
|
86
|
+
p2p: "p2p";
|
|
87
|
+
}>>;
|
|
88
|
+
players: z.ZodMiniObject<{
|
|
89
|
+
min: z.ZodMiniInt;
|
|
90
|
+
max: z.ZodMiniInt;
|
|
91
|
+
default: z.ZodMiniOptional<z.ZodMiniInt>;
|
|
92
|
+
}, z.core.$strip>;
|
|
93
|
+
status: z.ZodMiniEnum<{
|
|
94
|
+
"coming-soon": "coming-soon";
|
|
95
|
+
available: "available";
|
|
96
|
+
}>;
|
|
97
|
+
placeholder: z.ZodMiniBoolean<boolean>;
|
|
98
|
+
featured: z.ZodMiniBoolean<boolean>;
|
|
99
|
+
}, z.core.$strip>>;
|
|
100
|
+
export declare const CategoryInfoSchema: z.ZodMiniObject<{
|
|
101
|
+
id: z.ZodMiniString<string>;
|
|
102
|
+
name: z.ZodMiniString<string>;
|
|
103
|
+
noun: z.ZodMiniString<string>;
|
|
104
|
+
description: z.ZodMiniString<string>;
|
|
105
|
+
games: z.ZodMiniInt;
|
|
106
|
+
}, z.core.$strip>;
|
|
107
|
+
/** A category that has at least one game. Every page's seed carries the full list. */
|
|
108
|
+
export type CategoryInfo = z.infer<typeof CategoryInfoSchema>;
|
package/dist/wire.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { isGameId, isGameOptions } from "@joystyk/contracts";
|
|
2
|
+
import * as z from "zod/mini";
|
|
3
|
+
//#region src/wire.ts
|
|
4
|
+
var MODES = [
|
|
5
|
+
"solo",
|
|
6
|
+
"ai",
|
|
7
|
+
"pass-and-play",
|
|
8
|
+
"p2p",
|
|
9
|
+
"server",
|
|
10
|
+
"daily"
|
|
11
|
+
];
|
|
12
|
+
/** Whether a game can be played yet. Every placeholder is `coming-soon`. */
|
|
13
|
+
var GAME_STATUSES = ["coming-soon", "available"];
|
|
14
|
+
var count = z.int().check(z.positive());
|
|
15
|
+
var gameId = z.string().check(z.refine(isGameId, "not a kebab-case game id"));
|
|
16
|
+
var GameSummarySchema = z.object({
|
|
17
|
+
id: gameId,
|
|
18
|
+
name: z.string(),
|
|
19
|
+
summary: z.string(),
|
|
20
|
+
category: z.string(),
|
|
21
|
+
tags: z.array(z.string()),
|
|
22
|
+
modes: z.array(z.enum(MODES)),
|
|
23
|
+
/** `default`: the table size the launcher starts at against the computer (the manifest's `players.default`). */
|
|
24
|
+
players: z.object({
|
|
25
|
+
min: count,
|
|
26
|
+
max: count,
|
|
27
|
+
default: z.optional(count)
|
|
28
|
+
}),
|
|
29
|
+
status: z.enum(GAME_STATUSES),
|
|
30
|
+
/** True while the entry is a stand-in written before the game exists. */
|
|
31
|
+
placeholder: z.boolean(),
|
|
32
|
+
featured: z.boolean()
|
|
33
|
+
});
|
|
34
|
+
var GameDetailSchema = z.extend(GameSummarySchema, {
|
|
35
|
+
description: z.string(),
|
|
36
|
+
/**
|
|
37
|
+
* The manifest's `pageTitle`, the fuller name people search for ("Klondike Solitaire"):
|
|
38
|
+
* the page's title, heading and structured data use it. Cards and the launcher use `name`.
|
|
39
|
+
*/
|
|
40
|
+
pageTitle: z.optional(z.string()),
|
|
41
|
+
/** A short rules summary; the full rules arrive with the game. */
|
|
42
|
+
rules: z.array(z.string()),
|
|
43
|
+
aiLevels: z.array(z.string()),
|
|
44
|
+
essentialMotion: z.boolean(),
|
|
45
|
+
/** The game plays AI-generated content, so the launcher asks for the notice first (D-44). */
|
|
46
|
+
aiContent: z.boolean(),
|
|
47
|
+
/** The game manifest's `assets`: its asset list, which "Make available offline" pins. */
|
|
48
|
+
assets: z.string(),
|
|
49
|
+
options: z.optional(z.custom(isGameOptions)),
|
|
50
|
+
attribution: z.optional(z.object({
|
|
51
|
+
text: z.string().check(z.minLength(1), z.maxLength(500)),
|
|
52
|
+
href: z.string().check(z.refine((value) => {
|
|
53
|
+
try {
|
|
54
|
+
const url = new URL(value);
|
|
55
|
+
return url.protocol === "https:" && url.username === "" && url.password === "";
|
|
56
|
+
} catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}, "credit links must use HTTPS"))
|
|
60
|
+
}))
|
|
61
|
+
});
|
|
62
|
+
var GameSummaryListSchema = z.array(GameSummarySchema);
|
|
63
|
+
var CategoryInfoSchema = z.object({
|
|
64
|
+
id: z.string(),
|
|
65
|
+
name: z.string(),
|
|
66
|
+
/** Lowercase singular for prose and titles, e.g. "dice game". */
|
|
67
|
+
noun: z.string(),
|
|
68
|
+
description: z.string(),
|
|
69
|
+
games: count
|
|
70
|
+
});
|
|
71
|
+
//#endregion
|
|
72
|
+
export { CategoryInfoSchema, GAME_STATUSES, GameDetailSchema, GameSummaryListSchema, GameSummarySchema, MODES };
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=wire.js.map
|
package/dist/wire.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","names":[],"sources":["../src/wire.ts"],"sourcesContent":["// Catalog data as it crosses the wire: the store seed in every page and the /api/games\n// responses. Plain JSON, decoded in the browser through Zod's Standard Schema interface\n// (D-18, D-22; browser code uses zod/mini). The server builds these values from the\n// registry, so the client never bundles the registry itself.\nimport { isGameId, isGameOptions, type Mode } from '@joystyk/contracts';\nimport * as z from 'zod/mini';\n\nexport const MODES = ['solo', 'ai', 'pass-and-play', 'p2p', 'server', 'daily'] as const satisfies readonly Mode[];\n\n/** Whether a game can be played yet. Every placeholder is `coming-soon`. */\nexport const GAME_STATUSES = ['coming-soon', 'available'] as const;\nexport type GameStatus = (typeof GAME_STATUSES)[number];\n\nconst count = z.int().check(z.positive());\nconst gameId = z.string().check(z.refine(isGameId, 'not a kebab-case game id'));\n\nexport const GameSummarySchema = z.object({\n id: gameId,\n name: z.string(),\n summary: z.string(),\n category: z.string(),\n tags: z.array(z.string()),\n modes: z.array(z.enum(MODES)),\n /** `default`: the table size the launcher starts at against the computer (the manifest's `players.default`). */\n players: z.object({ min: count, max: count, default: z.optional(count) }),\n status: z.enum(GAME_STATUSES),\n /** True while the entry is a stand-in written before the game exists. */\n placeholder: z.boolean(),\n featured: z.boolean(),\n});\n\n/** What a card, a grid tile and a lineup row need. */\nexport type GameSummary = z.infer<typeof GameSummarySchema>;\n\nexport const GameDetailSchema = z.extend(GameSummarySchema, {\n description: z.string(),\n /**\n * The manifest's `pageTitle`, the fuller name people search for (\"Klondike Solitaire\"):\n * the page's title, heading and structured data use it. Cards and the launcher use `name`.\n */\n pageTitle: z.optional(z.string()),\n /** A short rules summary; the full rules arrive with the game. */\n rules: z.array(z.string()),\n aiLevels: z.array(z.string()),\n essentialMotion: z.boolean(),\n /** The game plays AI-generated content, so the launcher asks for the notice first (D-44). */\n aiContent: z.boolean(),\n /** The game manifest's `assets`: its asset list, which \"Make available offline\" pins. */\n assets: z.string(),\n options: z.optional(z.custom<import('@joystyk/contracts').GameOption[]>(isGameOptions)),\n attribution: z.optional(\n z.object({\n text: z.string().check(z.minLength(1), z.maxLength(500)),\n href: z.string().check(\n z.refine((value) => {\n try {\n const url = new URL(value);\n return url.protocol === 'https:' && url.username === '' && url.password === '';\n } catch {\n return false;\n }\n }, 'credit links must use HTTPS'),\n ),\n }),\n ),\n});\n\n/** What a game page needs. */\nexport type GameDetail = z.infer<typeof GameDetailSchema>;\n\nexport const GameSummaryListSchema = z.array(GameSummarySchema);\n\nexport const CategoryInfoSchema = z.object({\n id: z.string(),\n name: z.string(),\n /** Lowercase singular for prose and titles, e.g. \"dice game\". */\n noun: z.string(),\n description: z.string(),\n games: count,\n});\n\n/** A category that has at least one game. Every page's seed carries the full list. */\nexport type CategoryInfo = z.infer<typeof CategoryInfoSchema>;\n"],"mappings":";;;AAOA,IAAa,QAAQ;CAAC;CAAQ;CAAM;CAAiB;CAAO;CAAU;AAAO;;AAG7E,IAAa,gBAAgB,CAAC,eAAe,WAAW;AAGxD,IAAM,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC;AACxC,IAAM,SAAS,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,OAAO,UAAU,0BAA0B,CAAC;AAE9E,IAAa,oBAAoB,EAAE,OAAO;CACxC,IAAI;CACJ,MAAM,EAAE,OAAO;CACf,SAAS,EAAE,OAAO;CAClB,UAAU,EAAE,OAAO;CACnB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;CACxB,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,CAAC;;CAE5B,SAAS,EAAE,OAAO;EAAE,KAAK;EAAO,KAAK;EAAO,SAAS,EAAE,SAAS,KAAK;CAAE,CAAC;CACxE,QAAQ,EAAE,KAAK,aAAa;;CAE5B,aAAa,EAAE,QAAQ;CACvB,UAAU,EAAE,QAAQ;AACtB,CAAC;AAKD,IAAa,mBAAmB,EAAE,OAAO,mBAAmB;CAC1D,aAAa,EAAE,OAAO;;;;;CAKtB,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC;;CAEhC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;CACzB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;CAC5B,iBAAiB,EAAE,QAAQ;;CAE3B,WAAW,EAAE,QAAQ;;CAErB,QAAQ,EAAE,OAAO;CACjB,SAAS,EAAE,SAAS,EAAE,OAAkD,aAAa,CAAC;CACtF,aAAa,EAAE,SACb,EAAE,OAAO;EACP,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC;EACvD,MAAM,EAAE,OAAO,CAAC,CAAC,MACf,EAAE,QAAQ,UAAU;GAClB,IAAI;IACF,MAAM,MAAM,IAAI,IAAI,KAAK;IACzB,OAAO,IAAI,aAAa,YAAY,IAAI,aAAa,MAAM,IAAI,aAAa;GAC9E,QAAQ;IACN,OAAO;GACT;EACF,GAAG,6BAA6B,CAClC;CACF,CAAC,CACH;AACF,CAAC;AAKD,IAAa,wBAAwB,EAAE,MAAM,iBAAiB;AAE9D,IAAa,qBAAqB,EAAE,OAAO;CACzC,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;;CAEf,MAAM,EAAE,OAAO;CACf,aAAa,EAAE,OAAO;CACtB,OAAO;AACT,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,20 +1,72 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@joystyk/catalog",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "The Joystyk catalog: manifest registry, slot registry, routes and the server-rendered index, category and game pages.",
|
|
5
|
+
"private": false,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": [
|
|
8
|
+
"**/client.[jt]s",
|
|
9
|
+
"**/server.[jt]s",
|
|
10
|
+
"**/components/*.[jt]s",
|
|
11
|
+
"**/styles.css"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./client": {
|
|
19
|
+
"types": "./dist/client.d.ts",
|
|
20
|
+
"default": "./dist/client.js"
|
|
21
|
+
},
|
|
22
|
+
"./server": {
|
|
23
|
+
"types": "./dist/server.d.ts",
|
|
24
|
+
"default": "./dist/server.js"
|
|
25
|
+
},
|
|
26
|
+
"./styles.css": "./dist/styles.css"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@gyral/core": "0.3.1",
|
|
30
|
+
"@gyral/http": "0.3.1",
|
|
31
|
+
"@gyral/router": "0.3.1",
|
|
32
|
+
"@gyral/ssr": "0.3.1",
|
|
33
|
+
"zod": "4.6.5",
|
|
34
|
+
"@joystyk/contracts": "0.2.0",
|
|
35
|
+
"@joystyk/launcher": "0.2.0",
|
|
36
|
+
"@joystyk/ui": "0.2.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@gyral/testing": "0.3.1",
|
|
40
|
+
"parse5": "8.0.1",
|
|
41
|
+
"typescript": "5.9.3",
|
|
42
|
+
"vite": "8.3.3",
|
|
43
|
+
"vitest": "4.1.11"
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist",
|
|
50
|
+
"README.md",
|
|
51
|
+
"LICENSE",
|
|
52
|
+
"NOTICE",
|
|
53
|
+
"CHANGELOG.md"
|
|
54
|
+
],
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=24.15.0"
|
|
57
|
+
},
|
|
5
58
|
"license": "MIT",
|
|
6
59
|
"repository": {
|
|
7
60
|
"type": "git",
|
|
8
61
|
"url": "git+https://github.com/joystyk-games/game-libraries.git",
|
|
9
62
|
"directory": "packages/catalog"
|
|
10
63
|
},
|
|
11
|
-
"homepage": "https://github.com/joystyk-games/game-libraries",
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"access": "public"
|
|
64
|
+
"homepage": "https://github.com/joystyk-games/game-libraries/tree/main/packages/catalog#readme",
|
|
65
|
+
"bugs": {
|
|
66
|
+
"url": "https://github.com/joystyk-games/game-libraries/issues"
|
|
67
|
+
},
|
|
68
|
+
"scripts": {
|
|
69
|
+
"typecheck": "tsc --noEmit",
|
|
70
|
+
"build": "node ../../scripts/build-package.ts"
|
|
19
71
|
}
|
|
20
|
-
}
|
|
72
|
+
}
|