@superzerodev/config 0.1.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/dist/define.d.ts +25 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +62 -0
- package/dist/define.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/reserved.d.ts +26 -0
- package/dist/reserved.d.ts.map +1 -0
- package/dist/reserved.js +78 -0
- package/dist/reserved.js.map +1 -0
- package/dist/schema.d.ts +151 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +112 -0
- package/dist/schema.js.map +1 -0
- package/package.json +39 -0
package/dist/define.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* defineApp と、宣言ファイル → DesiredResource[] への変換
|
|
3
|
+
*
|
|
4
|
+
* Provisioning Engine は宣言ファイルの形を知らない。ここで平らなリソース列に落とす。
|
|
5
|
+
*/
|
|
6
|
+
import { type DesiredResource } from '@superzerodev/core';
|
|
7
|
+
import { type AppConfig, type AppConfigInput } from './schema.js';
|
|
8
|
+
/**
|
|
9
|
+
* superzero.config.ts が default export する関数。
|
|
10
|
+
* 型補完のためだけの薄いラッパで、検証は loadConfig 側で行う
|
|
11
|
+
* (設定ファイルの読み込み時に一度だけ検証したいため)。
|
|
12
|
+
*/
|
|
13
|
+
export declare function defineApp(config: AppConfigInput): AppConfigInput;
|
|
14
|
+
/** Zod のエラーを、エージェントが直せる形へ正規化する(§5.9) */
|
|
15
|
+
export declare function parseConfig(raw: unknown): AppConfig;
|
|
16
|
+
/**
|
|
17
|
+
* 宣言ファイルを Provisioning Engine が扱える DesiredResource[] へ落とす。
|
|
18
|
+
*
|
|
19
|
+
* ここが「宣言ファイルの形」と「リソースモデル」の唯一の接続点。
|
|
20
|
+
* 宣言ファイルの構造を変えても、影響はこの関数に閉じる。
|
|
21
|
+
*/
|
|
22
|
+
export declare function toDesiredResources(config: AppConfig): DesiredResource[];
|
|
23
|
+
/** JSON Schema を吐く。MCP のツール定義とエディタ補完に流用する */
|
|
24
|
+
export declare function toJsonSchema(): unknown;
|
|
25
|
+
//# sourceMappingURL=define.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpF,OAAO,EAAmB,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAElF;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAEhE;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAoBnD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,eAAe,EAAE,CAavE;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}
|
package/dist/define.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* defineApp と、宣言ファイル → DesiredResource[] への変換
|
|
3
|
+
*
|
|
4
|
+
* Provisioning Engine は宣言ファイルの形を知らない。ここで平らなリソース列に落とす。
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { SuperzeroError, ErrorCode } from '@superzerodev/core';
|
|
8
|
+
import { AppConfigSchema } from './schema.js';
|
|
9
|
+
/**
|
|
10
|
+
* superzero.config.ts が default export する関数。
|
|
11
|
+
* 型補完のためだけの薄いラッパで、検証は loadConfig 側で行う
|
|
12
|
+
* (設定ファイルの読み込み時に一度だけ検証したいため)。
|
|
13
|
+
*/
|
|
14
|
+
export function defineApp(config) {
|
|
15
|
+
return config;
|
|
16
|
+
}
|
|
17
|
+
/** Zod のエラーを、エージェントが直せる形へ正規化する(§5.9) */
|
|
18
|
+
export function parseConfig(raw) {
|
|
19
|
+
const result = AppConfigSchema.safeParse(raw);
|
|
20
|
+
if (result.success)
|
|
21
|
+
return result.data;
|
|
22
|
+
const issues = result.error.issues;
|
|
23
|
+
const first = issues[0];
|
|
24
|
+
const path = first ? first.path.join('.') : '(root)';
|
|
25
|
+
throw new SuperzeroError({
|
|
26
|
+
code: ErrorCode.CONFIG_INVALID,
|
|
27
|
+
message: `superzero.config.ts is invalid: ${issues.length} problem(s). ` +
|
|
28
|
+
issues.map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`).join(' / '),
|
|
29
|
+
suggestedFix: {
|
|
30
|
+
description: `Fix "${path}" in superzero.config.ts. ` +
|
|
31
|
+
`Each message above states exactly what the field expects.`,
|
|
32
|
+
command: 'superzero plan',
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 宣言ファイルを Provisioning Engine が扱える DesiredResource[] へ落とす。
|
|
38
|
+
*
|
|
39
|
+
* ここが「宣言ファイルの形」と「リソースモデル」の唯一の接続点。
|
|
40
|
+
* 宣言ファイルの構造を変えても、影響はこの関数に閉じる。
|
|
41
|
+
*/
|
|
42
|
+
export function toDesiredResources(config) {
|
|
43
|
+
const resources = [];
|
|
44
|
+
const add = (kind, spec) => {
|
|
45
|
+
resources.push({ kind, logicalName: 'default', spec });
|
|
46
|
+
};
|
|
47
|
+
if (config.database)
|
|
48
|
+
add('database', config.database);
|
|
49
|
+
if (config.auth)
|
|
50
|
+
add('auth', config.auth);
|
|
51
|
+
if (config.push)
|
|
52
|
+
add('push', config.push);
|
|
53
|
+
// compute は他リソースへ依存するため最後に置く(順序自体は Planner が解決する)
|
|
54
|
+
if (config.compute)
|
|
55
|
+
add('compute', config.compute);
|
|
56
|
+
return resources;
|
|
57
|
+
}
|
|
58
|
+
/** JSON Schema を吐く。MCP のツール定義とエディタ補完に流用する */
|
|
59
|
+
export function toJsonSchema() {
|
|
60
|
+
return z.toJSONSchema(AppConfigSchema, { io: 'input' });
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=define.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAwB,MAAM,oBAAoB,CAAA;AACpF,OAAO,EAAE,eAAe,EAAuC,MAAM,aAAa,CAAA;AAElF;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,MAAsB;IAC9C,OAAO,MAAM,CAAA;AACf,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAC7C,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,IAAI,CAAA;IAEtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAA;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IAEpD,MAAM,IAAI,cAAc,CAAC;QACvB,IAAI,EAAE,SAAS,CAAC,cAAc;QAC9B,OAAO,EACL,mCAAmC,MAAM,CAAC,MAAM,eAAe;YAC/D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAChF,YAAY,EAAE;YACZ,WAAW,EACT,QAAQ,IAAI,4BAA4B;gBACxC,2DAA2D;YAC7D,OAAO,EAAE,gBAAgB;SAC1B;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,SAAS,GAAsB,EAAE,CAAA;IACvC,MAAM,GAAG,GAAG,CAAC,IAA6B,EAAE,IAAa,EAAQ,EAAE;QACjE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC,CAAA;IAED,IAAI,MAAM,CAAC,QAAQ;QAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACrD,IAAI,MAAM,CAAC,IAAI;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,MAAM,CAAC,IAAI;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;IACzC,kDAAkD;IAClD,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAElD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;AACzD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基盤が自分で使うホスト名。プロジェクト名には使わせない。
|
|
3
|
+
*
|
|
4
|
+
* ★ プロジェクト名はそのまま `{name}.{apex}` の公開ホストになる。
|
|
5
|
+
* 予約していないと、顧客が `api` という名前でプロジェクトを作った時点で
|
|
6
|
+
* `api.superzero.dev` のルートが**上書き**され、Control Plane API への
|
|
7
|
+
* 通信がその顧客のコンテナへ流れる。サインアップもキー発行も奪われる。
|
|
8
|
+
* ルート登録は「同じドメインなら PATCH」なので、衝突しても
|
|
9
|
+
* エラーにならず静かに乗っ取られる。
|
|
10
|
+
*
|
|
11
|
+
* ★ いま使っていない名前も含めて広めに取る。
|
|
12
|
+
* あとから予約を増やすと、既に使っている顧客の名前を取り上げることになり、
|
|
13
|
+
* 移行が要る。最初に広く取るほうが安い。
|
|
14
|
+
*/
|
|
15
|
+
export declare const RESERVED_PROJECT_NAMES: ReadonlySet<string>;
|
|
16
|
+
export declare function isReservedProjectName(name: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* プロジェクト名として使える形。DNS の1ラベルと同じ制約。
|
|
19
|
+
*
|
|
20
|
+
* ★ 名前はそのまま公開ホスト名になるので、形も守る必要がある。
|
|
21
|
+
* `*` を通すと `*.{apex}` というワイルドカードのルートが生え、
|
|
22
|
+
* 全顧客のホスト名に一致してしまう。1社が全社の通信を捕まえられる。
|
|
23
|
+
*/
|
|
24
|
+
export declare const PROJECT_NAME_PATTERN: RegExp;
|
|
25
|
+
export declare function isValidProjectName(name: string): boolean;
|
|
26
|
+
//# sourceMappingURL=reserved.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reserved.d.ts","sourceRoot":"","sources":["../src/reserved.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAgDrD,CAAA;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QAAoC,CAAA;AAErE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD"}
|
package/dist/reserved.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基盤が自分で使うホスト名。プロジェクト名には使わせない。
|
|
3
|
+
*
|
|
4
|
+
* ★ プロジェクト名はそのまま `{name}.{apex}` の公開ホストになる。
|
|
5
|
+
* 予約していないと、顧客が `api` という名前でプロジェクトを作った時点で
|
|
6
|
+
* `api.superzero.dev` のルートが**上書き**され、Control Plane API への
|
|
7
|
+
* 通信がその顧客のコンテナへ流れる。サインアップもキー発行も奪われる。
|
|
8
|
+
* ルート登録は「同じドメインなら PATCH」なので、衝突しても
|
|
9
|
+
* エラーにならず静かに乗っ取られる。
|
|
10
|
+
*
|
|
11
|
+
* ★ いま使っていない名前も含めて広めに取る。
|
|
12
|
+
* あとから予約を増やすと、既に使っている顧客の名前を取り上げることになり、
|
|
13
|
+
* 移行が要る。最初に広く取るほうが安い。
|
|
14
|
+
*/
|
|
15
|
+
export const RESERVED_PROJECT_NAMES = new Set([
|
|
16
|
+
// Control Plane と社内向け
|
|
17
|
+
'api',
|
|
18
|
+
'admin',
|
|
19
|
+
'app',
|
|
20
|
+
'console',
|
|
21
|
+
'dashboard',
|
|
22
|
+
'control',
|
|
23
|
+
'internal',
|
|
24
|
+
'auth',
|
|
25
|
+
'login',
|
|
26
|
+
'signup',
|
|
27
|
+
'billing',
|
|
28
|
+
'account',
|
|
29
|
+
'accounts',
|
|
30
|
+
// 公開サイト
|
|
31
|
+
'www',
|
|
32
|
+
'docs',
|
|
33
|
+
'blog',
|
|
34
|
+
'status',
|
|
35
|
+
'support',
|
|
36
|
+
'help',
|
|
37
|
+
'about',
|
|
38
|
+
'legal',
|
|
39
|
+
'assets',
|
|
40
|
+
'static',
|
|
41
|
+
'cdn',
|
|
42
|
+
// メールと DNS。ここを取られると、なりすましや配送の妨害に使える
|
|
43
|
+
'mail',
|
|
44
|
+
'smtp',
|
|
45
|
+
'imap',
|
|
46
|
+
'pop',
|
|
47
|
+
'mx',
|
|
48
|
+
'ns',
|
|
49
|
+
'ns1',
|
|
50
|
+
'ns2',
|
|
51
|
+
'dns',
|
|
52
|
+
'autodiscover',
|
|
53
|
+
'autoconfig',
|
|
54
|
+
// 証明書の検証や、環境の取り違えを招くもの
|
|
55
|
+
'acme',
|
|
56
|
+
'localhost',
|
|
57
|
+
'test',
|
|
58
|
+
'staging',
|
|
59
|
+
'stage',
|
|
60
|
+
'dev',
|
|
61
|
+
'prod',
|
|
62
|
+
'production',
|
|
63
|
+
]);
|
|
64
|
+
export function isReservedProjectName(name) {
|
|
65
|
+
return RESERVED_PROJECT_NAMES.has(name.toLowerCase());
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* プロジェクト名として使える形。DNS の1ラベルと同じ制約。
|
|
69
|
+
*
|
|
70
|
+
* ★ 名前はそのまま公開ホスト名になるので、形も守る必要がある。
|
|
71
|
+
* `*` を通すと `*.{apex}` というワイルドカードのルートが生え、
|
|
72
|
+
* 全顧客のホスト名に一致してしまう。1社が全社の通信を捕まえられる。
|
|
73
|
+
*/
|
|
74
|
+
export const PROJECT_NAME_PATTERN = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;
|
|
75
|
+
export function isValidProjectName(name) {
|
|
76
|
+
return name.length >= 1 && name.length <= 63 && PROJECT_NAME_PATTERN.test(name);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=reserved.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reserved.js","sourceRoot":"","sources":["../src/reserved.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC;IACjE,sBAAsB;IACtB,KAAK;IACL,OAAO;IACP,KAAK;IACL,SAAS;IACT,WAAW;IACX,SAAS;IACT,UAAU;IACV,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,SAAS;IACT,UAAU;IACV,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,oCAAoC;IACpC,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,cAAc;IACd,YAAY;IACZ,uBAAuB;IACvB,MAAM;IACN,WAAW;IACX,MAAM;IACN,SAAS;IACT,OAAO;IACP,KAAK;IACL,MAAM;IACN,YAAY;CACb,CAAC,CAAA;AAEF,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,iCAAiC,CAAA;AAErE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACjF,CAAC"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 宣言ファイルのスキーマ(P0設計 §5.1)
|
|
3
|
+
*
|
|
4
|
+
* Zod を単一ソースとし、ここから
|
|
5
|
+
* - TypeScript の型(エディタ補完)
|
|
6
|
+
* - JSON Schema(MCP のツール定義、エディタの検証)
|
|
7
|
+
* を生成する。定義を2箇所に書かない。
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
/** P0 は東京のみ(v0.2 で 2リージョンから削減) */
|
|
11
|
+
export declare const RegionSchema: z.ZodEnum<{
|
|
12
|
+
"ap-northeast-1": "ap-northeast-1";
|
|
13
|
+
}>;
|
|
14
|
+
export declare const ComputeSchema: z.ZodObject<{
|
|
15
|
+
framework: z.ZodDefault<z.ZodEnum<{
|
|
16
|
+
auto: "auto";
|
|
17
|
+
nextjs: "nextjs";
|
|
18
|
+
node: "node";
|
|
19
|
+
python: "python";
|
|
20
|
+
docker: "docker";
|
|
21
|
+
}>>;
|
|
22
|
+
buildCommand: z.ZodOptional<z.ZodString>;
|
|
23
|
+
startCommand: z.ZodOptional<z.ZodString>;
|
|
24
|
+
envFrom: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
25
|
+
auth: "auth";
|
|
26
|
+
database: "database";
|
|
27
|
+
push: "push";
|
|
28
|
+
email: "email";
|
|
29
|
+
}>>>;
|
|
30
|
+
idleTimeout: z.ZodDefault<z.ZodString>;
|
|
31
|
+
memoryMb: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export declare const DatabaseSchema: z.ZodObject<{
|
|
34
|
+
engine: z.ZodDefault<z.ZodLiteral<"postgres">>;
|
|
35
|
+
extensions: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
36
|
+
pgvector: "pgvector";
|
|
37
|
+
postgis: "postgis";
|
|
38
|
+
pg_cron: "pg_cron";
|
|
39
|
+
"uuid-ossp": "uuid-ossp";
|
|
40
|
+
}>>>;
|
|
41
|
+
}, z.core.$strip>;
|
|
42
|
+
/**
|
|
43
|
+
* SMS の濫用防止 第1層(§5.7)。
|
|
44
|
+
* allowedCountries を必須にすることで、設定漏れによる全開放を構造的に起こさない。
|
|
45
|
+
* ISO 3166-1 alpha-2。
|
|
46
|
+
*/
|
|
47
|
+
export declare const SmsSchema: z.ZodObject<{
|
|
48
|
+
enabled: z.ZodLiteral<true>;
|
|
49
|
+
allowedCountries: z.ZodArray<z.ZodString>;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
export declare const AuthSchema: z.ZodObject<{
|
|
52
|
+
providers: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
53
|
+
email: "email";
|
|
54
|
+
google: "google";
|
|
55
|
+
apple: "apple";
|
|
56
|
+
}>>>;
|
|
57
|
+
sms: z.ZodOptional<z.ZodObject<{
|
|
58
|
+
enabled: z.ZodLiteral<true>;
|
|
59
|
+
allowedCountries: z.ZodArray<z.ZodString>;
|
|
60
|
+
}, z.core.$strip>>;
|
|
61
|
+
jwt: z.ZodDefault<z.ZodObject<{
|
|
62
|
+
expiresIn: z.ZodDefault<z.ZodString>;
|
|
63
|
+
}, z.core.$strip>>;
|
|
64
|
+
}, z.core.$strip>;
|
|
65
|
+
export declare const PushSchema: z.ZodObject<{
|
|
66
|
+
ios: z.ZodOptional<z.ZodObject<{
|
|
67
|
+
bundleId: z.ZodString;
|
|
68
|
+
keyId: z.ZodString;
|
|
69
|
+
teamId: z.ZodString;
|
|
70
|
+
}, z.core.$strip>>;
|
|
71
|
+
android: z.ZodOptional<z.ZodObject<{
|
|
72
|
+
packageName: z.ZodString;
|
|
73
|
+
}, z.core.$strip>>;
|
|
74
|
+
}, z.core.$strip>;
|
|
75
|
+
/**
|
|
76
|
+
* ★ P0 では email を宣言できない。
|
|
77
|
+
*
|
|
78
|
+
* スキーマが受け付けても、対応するアダプタが無いため plan が
|
|
79
|
+
* CONFIG_UNKNOWN_PROVIDER で落ちる。「宣言できるのに動かない」は最悪の体験なので、
|
|
80
|
+
* 提供できるものだけを受け付ける形にした。
|
|
81
|
+
*
|
|
82
|
+
* メールを実際に使う機能(マジックリンク・メール検証)がまだ無く、
|
|
83
|
+
* 送信ドメインだけ用意しても使い道が無いことも理由。
|
|
84
|
+
* 実装する時点でこの定義を復活させ、SES アダプタと同時に入れる。
|
|
85
|
+
*/
|
|
86
|
+
/**
|
|
87
|
+
* ★ strict にする。未知のキーを黙って捨てると、
|
|
88
|
+
* 綴り間違いや P0 未対応の機能が「書いたのに無視される」形になる。
|
|
89
|
+
* エージェントにとっては最も分かりにくい失敗なので、明示的に弾く。
|
|
90
|
+
*/
|
|
91
|
+
export declare const AppConfigSchema: z.ZodObject<{
|
|
92
|
+
name: z.ZodString;
|
|
93
|
+
region: z.ZodDefault<z.ZodEnum<{
|
|
94
|
+
"ap-northeast-1": "ap-northeast-1";
|
|
95
|
+
}>>;
|
|
96
|
+
compute: z.ZodOptional<z.ZodObject<{
|
|
97
|
+
framework: z.ZodDefault<z.ZodEnum<{
|
|
98
|
+
auto: "auto";
|
|
99
|
+
nextjs: "nextjs";
|
|
100
|
+
node: "node";
|
|
101
|
+
python: "python";
|
|
102
|
+
docker: "docker";
|
|
103
|
+
}>>;
|
|
104
|
+
buildCommand: z.ZodOptional<z.ZodString>;
|
|
105
|
+
startCommand: z.ZodOptional<z.ZodString>;
|
|
106
|
+
envFrom: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
107
|
+
auth: "auth";
|
|
108
|
+
database: "database";
|
|
109
|
+
push: "push";
|
|
110
|
+
email: "email";
|
|
111
|
+
}>>>;
|
|
112
|
+
idleTimeout: z.ZodDefault<z.ZodString>;
|
|
113
|
+
memoryMb: z.ZodDefault<z.ZodNumber>;
|
|
114
|
+
}, z.core.$strip>>;
|
|
115
|
+
database: z.ZodOptional<z.ZodObject<{
|
|
116
|
+
engine: z.ZodDefault<z.ZodLiteral<"postgres">>;
|
|
117
|
+
extensions: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
118
|
+
pgvector: "pgvector";
|
|
119
|
+
postgis: "postgis";
|
|
120
|
+
pg_cron: "pg_cron";
|
|
121
|
+
"uuid-ossp": "uuid-ossp";
|
|
122
|
+
}>>>;
|
|
123
|
+
}, z.core.$strip>>;
|
|
124
|
+
auth: z.ZodOptional<z.ZodObject<{
|
|
125
|
+
providers: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
126
|
+
email: "email";
|
|
127
|
+
google: "google";
|
|
128
|
+
apple: "apple";
|
|
129
|
+
}>>>;
|
|
130
|
+
sms: z.ZodOptional<z.ZodObject<{
|
|
131
|
+
enabled: z.ZodLiteral<true>;
|
|
132
|
+
allowedCountries: z.ZodArray<z.ZodString>;
|
|
133
|
+
}, z.core.$strip>>;
|
|
134
|
+
jwt: z.ZodDefault<z.ZodObject<{
|
|
135
|
+
expiresIn: z.ZodDefault<z.ZodString>;
|
|
136
|
+
}, z.core.$strip>>;
|
|
137
|
+
}, z.core.$strip>>;
|
|
138
|
+
push: z.ZodOptional<z.ZodObject<{
|
|
139
|
+
ios: z.ZodOptional<z.ZodObject<{
|
|
140
|
+
bundleId: z.ZodString;
|
|
141
|
+
keyId: z.ZodString;
|
|
142
|
+
teamId: z.ZodString;
|
|
143
|
+
}, z.core.$strip>>;
|
|
144
|
+
android: z.ZodOptional<z.ZodObject<{
|
|
145
|
+
packageName: z.ZodString;
|
|
146
|
+
}, z.core.$strip>>;
|
|
147
|
+
}, z.core.$strip>>;
|
|
148
|
+
}, z.core.$strict>;
|
|
149
|
+
export type AppConfigInput = z.input<typeof AppConfigSchema>;
|
|
150
|
+
export type AppConfig = z.output<typeof AppConfigSchema>;
|
|
151
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,kCAAkC;AAClC,eAAO,MAAM,YAAY;;EAA6B,CAAA;AAEtD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;iBAiBxB,CAAA;AAEF,eAAO,MAAM,cAAc;;;;;;;;iBAGzB,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;iBAKpB,CAAA;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;iBASrB,CAAA;AAEF,eAAO,MAAM,UAAU;;;;;;;;;iBAkBnB,CAAA;AAEJ;;;;;;;;;;GAUG;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqB1B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC5D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAA"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 宣言ファイルのスキーマ(P0設計 §5.1)
|
|
3
|
+
*
|
|
4
|
+
* Zod を単一ソースとし、ここから
|
|
5
|
+
* - TypeScript の型(エディタ補完)
|
|
6
|
+
* - JSON Schema(MCP のツール定義、エディタの検証)
|
|
7
|
+
* を生成する。定義を2箇所に書かない。
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { isReservedProjectName } from './reserved.js';
|
|
11
|
+
/** P0 は東京のみ(v0.2 で 2リージョンから削減) */
|
|
12
|
+
export const RegionSchema = z.enum(['ap-northeast-1']);
|
|
13
|
+
export const ComputeSchema = z.object({
|
|
14
|
+
/** Nixpacks が自動検出する。明示指定も可能 */
|
|
15
|
+
framework: z.enum(['auto', 'nextjs', 'node', 'python', 'docker']).default('auto'),
|
|
16
|
+
buildCommand: z.string().optional(),
|
|
17
|
+
startCommand: z.string().optional(),
|
|
18
|
+
/**
|
|
19
|
+
* 接続情報を環境変数として注入する依存リソース。
|
|
20
|
+
* ここが Provisioning Engine の依存グラフ(PE-2)の入力になる。
|
|
21
|
+
*/
|
|
22
|
+
envFrom: z.array(z.enum(['database', 'auth', 'push', 'email'])).default([]),
|
|
23
|
+
/** scale-to-zero までの無通信時間。P0 の既定は 15分 */
|
|
24
|
+
idleTimeout: z
|
|
25
|
+
.string()
|
|
26
|
+
.regex(/^\d+(s|m|h)$/, 'Use a duration like "15m", "30s" or "1h".')
|
|
27
|
+
.default('15m'),
|
|
28
|
+
/** 1プロジェクト1コンテナ固定(P0)。水平スケールは P1 */
|
|
29
|
+
memoryMb: z.number().int().min(256).max(4096).default(512),
|
|
30
|
+
});
|
|
31
|
+
export const DatabaseSchema = z.object({
|
|
32
|
+
engine: z.literal('postgres').default('postgres'),
|
|
33
|
+
extensions: z.array(z.enum(['pgvector', 'postgis', 'pg_cron', 'uuid-ossp'])).default([]),
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* SMS の濫用防止 第1層(§5.7)。
|
|
37
|
+
* allowedCountries を必須にすることで、設定漏れによる全開放を構造的に起こさない。
|
|
38
|
+
* ISO 3166-1 alpha-2。
|
|
39
|
+
*/
|
|
40
|
+
export const SmsSchema = z.object({
|
|
41
|
+
enabled: z.literal(true),
|
|
42
|
+
allowedCountries: z
|
|
43
|
+
.array(z.string().regex(/^[A-Z]{2}$/, 'Use ISO 3166-1 alpha-2 codes, e.g. "JP".'))
|
|
44
|
+
.min(1, 'auth.sms.allowedCountries must list at least one country. An empty list is never allowed.'),
|
|
45
|
+
});
|
|
46
|
+
export const AuthSchema = z.object({
|
|
47
|
+
/** P0 は email / google / apple のみ。Passkey は P1(D9) */
|
|
48
|
+
providers: z.array(z.enum(['email', 'google', 'apple'])).min(1).default(['email']),
|
|
49
|
+
sms: SmsSchema.optional(),
|
|
50
|
+
jwt: z
|
|
51
|
+
.object({
|
|
52
|
+
expiresIn: z.string().regex(/^\d+(m|h|d)$/).default('1h'),
|
|
53
|
+
})
|
|
54
|
+
.default({ expiresIn: '1h' }),
|
|
55
|
+
});
|
|
56
|
+
export const PushSchema = z
|
|
57
|
+
.object({
|
|
58
|
+
ios: z
|
|
59
|
+
.object({
|
|
60
|
+
bundleId: z.string().min(1),
|
|
61
|
+
/** $SECRET 参照。.p8 の中身は宣言ファイルに書かない */
|
|
62
|
+
keyId: z.string().min(1),
|
|
63
|
+
teamId: z.string().min(1),
|
|
64
|
+
})
|
|
65
|
+
.optional(),
|
|
66
|
+
android: z
|
|
67
|
+
.object({
|
|
68
|
+
packageName: z.string().min(1),
|
|
69
|
+
})
|
|
70
|
+
.optional(),
|
|
71
|
+
})
|
|
72
|
+
.refine((v) => v.ios !== undefined || v.android !== undefined, {
|
|
73
|
+
message: 'push requires at least one of "ios" or "android". Web Push is not supported in P0.',
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* ★ P0 では email を宣言できない。
|
|
77
|
+
*
|
|
78
|
+
* スキーマが受け付けても、対応するアダプタが無いため plan が
|
|
79
|
+
* CONFIG_UNKNOWN_PROVIDER で落ちる。「宣言できるのに動かない」は最悪の体験なので、
|
|
80
|
+
* 提供できるものだけを受け付ける形にした。
|
|
81
|
+
*
|
|
82
|
+
* メールを実際に使う機能(マジックリンク・メール検証)がまだ無く、
|
|
83
|
+
* 送信ドメインだけ用意しても使い道が無いことも理由。
|
|
84
|
+
* 実装する時点でこの定義を復活させ、SES アダプタと同時に入れる。
|
|
85
|
+
*/
|
|
86
|
+
/**
|
|
87
|
+
* ★ strict にする。未知のキーを黙って捨てると、
|
|
88
|
+
* 綴り間違いや P0 未対応の機能が「書いたのに無視される」形になる。
|
|
89
|
+
* エージェントにとっては最も分かりにくい失敗なので、明示的に弾く。
|
|
90
|
+
*/
|
|
91
|
+
export const AppConfigSchema = z.strictObject({
|
|
92
|
+
name: z
|
|
93
|
+
.string()
|
|
94
|
+
.min(1)
|
|
95
|
+
.max(63)
|
|
96
|
+
.regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/, 'Use lowercase letters, digits and hyphens only.')
|
|
97
|
+
/**
|
|
98
|
+
* ★ 名前はそのまま公開ホスト名になる。基盤が使う名前は取らせない。
|
|
99
|
+
* ここで弾くのは早く気づかせるため。実際の防御はサーバー側にある
|
|
100
|
+
* (設定ファイルの検証は顧客の手元で走るので、素通しできてしまう)。
|
|
101
|
+
*/
|
|
102
|
+
.refine((v) => !isReservedProjectName(v), {
|
|
103
|
+
message: 'This name is reserved by the platform. Choose another name; ' +
|
|
104
|
+
'project names become public hostnames.',
|
|
105
|
+
}),
|
|
106
|
+
region: RegionSchema.default('ap-northeast-1'),
|
|
107
|
+
compute: ComputeSchema.optional(),
|
|
108
|
+
database: DatabaseSchema.optional(),
|
|
109
|
+
auth: AuthSchema.optional(),
|
|
110
|
+
push: PushSchema.optional(),
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@superzerodev/config",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"!dist/__tests__"
|
|
16
|
+
],
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"zod": "^4.0.0",
|
|
19
|
+
"@superzerodev/core": "0.1.0"
|
|
20
|
+
},
|
|
21
|
+
"description": "Types and validation for superzero.config.ts. defineApp lives here.",
|
|
22
|
+
"license": "UNLICENSED",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/mashihara/superzero.git",
|
|
26
|
+
"directory": "packages/config"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=22"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc -p tsconfig.json",
|
|
36
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
37
|
+
"test": "tsc -p tsconfig.json && node --test \"dist/__tests__/*.test.js\""
|
|
38
|
+
}
|
|
39
|
+
}
|