mapples 0.1.1 → 0.2.0-beta.1
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/api/auth.d.ts +7 -0
- package/dist/api/auth.js +41 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/client.d.ts +1 -0
- package/dist/api/client.js +3 -2
- package/dist/api/client.js.map +1 -1
- package/dist/api/commit.js +5 -0
- package/dist/api/commit.js.map +1 -1
- package/dist/commands/adopt.d.ts +1 -1
- package/dist/commands/adopt.js +2 -0
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/create.d.ts +1 -1
- package/dist/commands/create.js +3 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/impl/adoptImpl.js +2 -10
- package/dist/commands/impl/adoptImpl.js.map +1 -1
- package/dist/commands/impl/createImpl.d.ts +1 -1
- package/dist/commands/impl/createImpl.js +28 -20
- package/dist/commands/impl/createImpl.js.map +1 -1
- package/dist/commands/impl/initImpl.js +12 -17
- package/dist/commands/impl/initImpl.js.map +1 -1
- package/dist/commands/impl/syncImpl.js +3 -16
- package/dist/commands/impl/syncImpl.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +3 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/sync.d.ts +1 -1
- package/dist/commands/sync.js +2 -0
- package/dist/commands/sync.js.map +1 -1
- package/dist/project/env.d.ts +13 -0
- package/dist/project/env.js +33 -0
- package/dist/project/env.js.map +1 -0
- package/dist/project/secret.d.ts +4 -0
- package/dist/project/secret.js +44 -0
- package/dist/project/secret.js.map +1 -0
- package/dist/services/clientFactory.d.ts +2 -0
- package/dist/services/clientFactory.js +18 -0
- package/dist/services/clientFactory.js.map +1 -0
- package/dist/services/scaffold.js +4 -1
- package/dist/services/scaffold.js.map +1 -1
- package/package.json +2 -2
- package/templates/gitignore +2 -0
- package/templates/package.json +51 -13
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface ResolvedProject {
|
|
2
|
+
projectId: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
}
|
|
5
|
+
/** Decode the `project_uuid` claim from an API-key JWT. Null when the secret is not a JWT. */
|
|
6
|
+
export declare function decodeKeyProject(secret: string): string | null;
|
|
7
|
+
export declare function resolveProject(apiUrl: string, secret: string): Promise<ResolvedProject>;
|
package/dist/api/auth.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Secret -> project resolution (RFC-0003). A Mapples API key is an HS256 JWT
|
|
2
|
+
// whose payload carries `project_uuid` — the key both authenticates and
|
|
3
|
+
// identifies the project, so resolution is a LOCAL decode of the payload (no
|
|
4
|
+
// signature check client-side; the server verifies on every request). The
|
|
5
|
+
// HTTP fallback exists only for opaque dev secrets (the mock server's sk_…).
|
|
6
|
+
import axios from 'axios';
|
|
7
|
+
/** Decode the `project_uuid` claim from an API-key JWT. Null when the secret is not a JWT. */
|
|
8
|
+
export function decodeKeyProject(secret) {
|
|
9
|
+
const parts = secret.split('.');
|
|
10
|
+
if (parts.length !== 3)
|
|
11
|
+
return null;
|
|
12
|
+
try {
|
|
13
|
+
const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
|
|
14
|
+
return typeof payload.project_uuid === 'string' && payload.project_uuid.length > 0
|
|
15
|
+
? payload.project_uuid
|
|
16
|
+
: null;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Not a JWT payload we can read — fall through to the HTTP fallback.
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function resolveProject(apiUrl, secret) {
|
|
24
|
+
const local = decodeKeyProject(secret);
|
|
25
|
+
if (local)
|
|
26
|
+
return { projectId: local };
|
|
27
|
+
// Opaque secret (mock server): resolve over HTTP with the real auth header.
|
|
28
|
+
const res = await axios.get(`${apiUrl.replace(/\/+$/, '')}/auth/project`, {
|
|
29
|
+
headers: { 'X-API-Key': secret },
|
|
30
|
+
validateStatus: () => true,
|
|
31
|
+
timeout: 30_000,
|
|
32
|
+
});
|
|
33
|
+
if (res.status === 200 && typeof res.data.projectId === 'string') {
|
|
34
|
+
return res.data;
|
|
35
|
+
}
|
|
36
|
+
if (res.status === 401 || res.status === 403 || res.status === 404) {
|
|
37
|
+
throw new Error('this does not look like a Mapples API key — generate one in Creator (Project → Settings) and re-run with --secret');
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`could not resolve the project from the API secret (HTTP ${res.status})`);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wEAAwE;AACxE,6EAA6E;AAC7E,0EAA0E;AAC1E,6EAA6E;AAE7E,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,8FAA8F;AAC9F,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAE9E,CAAC;QACF,OAAO,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAChF,CAAC,CAAC,OAAO,CAAC,YAAY;YACtB,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,MAAc;IACjE,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAEvC,4EAA4E;IAC5E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,EAAE;QACxE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;QAChC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,OAAQ,GAAG,CAAC,IAAgC,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC9F,OAAO,GAAG,CAAC,IAAuB,CAAC;IACrC,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CACb,mHAAmH,CACpH,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2DAA2D,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5F,CAAC"}
|
package/dist/api/client.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { Bootstrap, CommitOk, Delta, Envelope } from '../types.js';
|
|
|
3
3
|
export interface JpatchClientOptions {
|
|
4
4
|
baseUrl: string;
|
|
5
5
|
projectId: string;
|
|
6
|
+
/** Project API key (Creator → Project → Settings); sent as X-API-Key (RFC-0003). */
|
|
6
7
|
token?: string;
|
|
7
8
|
actor?: string;
|
|
8
9
|
origin?: string;
|
package/dist/api/client.js
CHANGED
|
@@ -15,14 +15,15 @@ export class JpatchClient {
|
|
|
15
15
|
this.origin = opts.origin;
|
|
16
16
|
this.http = axios.create({
|
|
17
17
|
baseURL: opts.baseUrl.replace(/\/+$/, ''),
|
|
18
|
-
headers: opts.token ? {
|
|
18
|
+
headers: opts.token ? { 'X-API-Key': opts.token } : {},
|
|
19
19
|
// We map error bodies ourselves; axios must hand them to us.
|
|
20
20
|
validateStatus: () => true,
|
|
21
21
|
timeout: 30_000,
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
path(suffix = '') {
|
|
25
|
-
|
|
25
|
+
// Real backend shape (service--mapplesorg): plural `projects` prefix.
|
|
26
|
+
return `/projects/${this.projectId}/canvas${suffix}`;
|
|
26
27
|
}
|
|
27
28
|
async commitRaw(envelope) {
|
|
28
29
|
const res = await this.http.post(this.path(), envelope);
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAsB,MAAM,OAAO,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/api/commit.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ulid } from 'ulid';
|
|
2
2
|
import { isNetworkError } from './client.js';
|
|
3
|
+
import { JpatchError } from './errors.js';
|
|
3
4
|
export function mintTxId() {
|
|
4
5
|
return `tx_${ulid()}`;
|
|
5
6
|
}
|
|
@@ -36,6 +37,10 @@ export async function commitWithTransportRetry(client, envelope, maxAttempts = 5
|
|
|
36
37
|
return await client.commitRaw(envelope);
|
|
37
38
|
}
|
|
38
39
|
catch (err) {
|
|
40
|
+
if (err instanceof JpatchError && err.code === 'FORBIDDEN') {
|
|
41
|
+
// RFC-0003: read-scoped keys can pull but not push.
|
|
42
|
+
throw new Error('push rejected: this API key is read-scoped — generate a read & write key in Creator (Project → Settings) and re-run `mapples init --secret <key>`');
|
|
43
|
+
}
|
|
39
44
|
if (!isNetworkError(err))
|
|
40
45
|
throw err;
|
|
41
46
|
lastErr = err;
|
package/dist/api/commit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/api/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/api/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,IAAI,EAAE,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,KAAK,IAAI,EAAE,EAAE,CAAC;AACvB,CAAC;AASD,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,MAAoB;IACtE,MAAM,QAAQ,GAAa;QACzB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,CAAC;QACT,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,EAAE;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE;YACJ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC7B;KACF,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACvE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAoB,EACpB,QAAkB,EAClB,WAAW,GAAG,CAAC;IAEf,IAAI,OAAgB,CAAC;IACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC3D,oDAAoD;gBACpD,MAAM,IAAI,KAAK,CACb,mJAAmJ,CACpJ,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACpC,OAAO,GAAG,GAAG,CAAC;YACd,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,MAAM,OAAO,CAAC;AAChB,CAAC"}
|
package/dist/commands/adopt.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Command } from 'commander';
|
|
2
2
|
export declare function registerAdopt(program: Command): void;
|
package/dist/commands/adopt.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { Option } from 'commander';
|
|
1
2
|
export function registerAdopt(program) {
|
|
2
3
|
program
|
|
3
4
|
.command('adopt <file>')
|
|
4
5
|
.description('Adopt an unmanaged component file into Mapples (no prompt)')
|
|
6
|
+
.addOption(new Option('--denv <env>').hideHelp()) // internal: dev|staging|prod
|
|
5
7
|
.option('--json', 'machine-readable output')
|
|
6
8
|
.action(async (file, opts) => {
|
|
7
9
|
const { runAdopt } = await import('./impl/adoptImpl.js');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adopt.js","sourceRoot":"","sources":["../../src/commands/adopt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adopt.js","sourceRoot":"","sources":["../../src/commands/adopt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,4DAA4D,CAAC;SACzE,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAA6B,EAAE,EAAE;QAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Command } from 'commander';
|
|
2
2
|
export declare function registerCreate(program: Command): void;
|
package/dist/commands/create.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { Option } from 'commander';
|
|
1
2
|
export function registerCreate(program) {
|
|
2
3
|
program
|
|
3
4
|
.command('create <app>')
|
|
4
5
|
.description('Scaffold a new Mapples-connected Expo app')
|
|
5
|
-
.option('--
|
|
6
|
+
.option('--secret <secret>', 'project API secret (Creator: Project → Settings)')
|
|
6
7
|
.option('--api-url <url>', 'Mapples API base URL')
|
|
8
|
+
.addOption(new Option('--denv <env>').hideHelp()) // internal: dev|staging|prod
|
|
7
9
|
.option('--json', 'machine-readable output')
|
|
8
10
|
.action(async (app, opts) => {
|
|
9
11
|
const { runCreate } = await import('./impl/createImpl.js');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAA6B,EAAE,EAAE;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,18 +1,10 @@
|
|
|
1
|
-
import { cliOrigin } from '../../version.js';
|
|
2
1
|
import chalk from 'chalk';
|
|
3
|
-
import { JpatchClient } from '../../api/client.js';
|
|
4
|
-
import { readConfig } from '../../project/config.js';
|
|
5
2
|
import { proposeAdoptions } from '../../services/adoptService.js';
|
|
3
|
+
import { clientForApp } from '../../services/clientFactory.js';
|
|
6
4
|
import { emptyReport, renderReport } from '../../ui/report.js';
|
|
7
5
|
export async function runAdopt(file, opts) {
|
|
8
6
|
const root = process.cwd();
|
|
9
|
-
const
|
|
10
|
-
const client = new JpatchClient({
|
|
11
|
-
baseUrl: config.apiUrl,
|
|
12
|
-
projectId: config.projectId,
|
|
13
|
-
origin: cliOrigin(),
|
|
14
|
-
...(process.env.MAPPLES_TOKEN ? { token: process.env.MAPPLES_TOKEN } : {}),
|
|
15
|
-
});
|
|
7
|
+
const client = clientForApp(root, opts);
|
|
16
8
|
const report = emptyReport();
|
|
17
9
|
await proposeAdoptions({ root, client, report, yes: true, file });
|
|
18
10
|
if (opts.json === true) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adoptImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/adoptImpl.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"adoptImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/adoptImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAA6B;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare
|
|
1
|
+
export declare function askSecret(opts: Record<string, unknown>): Promise<string>;
|
|
2
2
|
export declare function runCreate(app: string, opts: Record<string, unknown>): Promise<void>;
|
|
@@ -1,34 +1,40 @@
|
|
|
1
|
-
import { cliOrigin } from '../../version.js';
|
|
2
1
|
import { existsSync, mkdirSync, readdirSync } from 'node:fs';
|
|
3
|
-
import { resolve } from 'node:path';
|
|
2
|
+
import { basename, resolve } from 'node:path';
|
|
4
3
|
import chalk from 'chalk';
|
|
5
4
|
import prompts from 'prompts';
|
|
6
|
-
import { JpatchClient } from '../../api/client.js';
|
|
7
|
-
import {
|
|
5
|
+
import { JpatchClient, isNetworkError } from '../../api/client.js';
|
|
6
|
+
import { resolveProject } from '../../api/auth.js';
|
|
8
7
|
import { writeConfig } from '../../project/config.js';
|
|
8
|
+
import { resolveApiUrl } from '../../project/env.js';
|
|
9
|
+
import { writeSecret } from '../../project/secret.js';
|
|
9
10
|
import { scaffoldApp } from '../../services/scaffold.js';
|
|
10
11
|
import { runSyncEngine } from '../../services/syncEngine.js';
|
|
11
12
|
import { renderReport } from '../../ui/report.js';
|
|
12
|
-
|
|
13
|
+
import { cliOrigin } from '../../version.js';
|
|
14
|
+
export async function askSecret(opts) {
|
|
15
|
+
if (typeof opts.secret === 'string' && opts.secret.length > 0)
|
|
16
|
+
return opts.secret;
|
|
17
|
+
const answer = await prompts({
|
|
18
|
+
type: 'password',
|
|
19
|
+
name: 'secret',
|
|
20
|
+
message: 'Project API secret (Creator → Project → Settings)',
|
|
21
|
+
});
|
|
22
|
+
const secret = answer.secret;
|
|
23
|
+
if (!secret)
|
|
24
|
+
throw new Error('a project API secret is required (pass --secret <secret>)');
|
|
25
|
+
return secret;
|
|
26
|
+
}
|
|
13
27
|
export async function runCreate(app, opts) {
|
|
14
28
|
const target = resolve(process.cwd(), app);
|
|
15
29
|
if (existsSync(target) && readdirSync(target).length > 0) {
|
|
16
30
|
throw new Error(`${target} already exists and is not empty`);
|
|
17
31
|
}
|
|
32
|
+
const secret = await askSecret(opts);
|
|
33
|
+
const apiUrl = resolveApiUrl({ apiUrl: opts.apiUrl, denv: opts.denv });
|
|
34
|
+
const { projectId, name } = await resolveProject(apiUrl, secret);
|
|
18
35
|
mkdirSync(target, { recursive: true });
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const answer = await prompts({
|
|
22
|
-
type: 'text',
|
|
23
|
-
name: 'projectId',
|
|
24
|
-
message: 'Mapples project id (from Creator → project settings)',
|
|
25
|
-
});
|
|
26
|
-
projectId = answer.projectId;
|
|
27
|
-
}
|
|
28
|
-
if (!projectId)
|
|
29
|
-
throw new Error('a project id is required (pass --project <id>)');
|
|
30
|
-
const apiUrl = typeof opts.apiUrl === 'string' ? opts.apiUrl : DEFAULT_API_URL;
|
|
31
|
-
const written = scaffoldApp(target, app);
|
|
36
|
+
const appName = basename(target);
|
|
37
|
+
const written = scaffoldApp(target, appName);
|
|
32
38
|
writeConfig(target, {
|
|
33
39
|
projectId,
|
|
34
40
|
apiUrl,
|
|
@@ -36,15 +42,17 @@ export async function runCreate(app, opts) {
|
|
|
36
42
|
routesDir: 'app/(mapples)',
|
|
37
43
|
schema: 1,
|
|
38
44
|
});
|
|
39
|
-
|
|
45
|
+
writeSecret(target, secret);
|
|
46
|
+
console.log(chalk.bold(`\nmapples create ${appName}`) + (name ? chalk.gray(` — project “${name}”`) : ''));
|
|
40
47
|
for (const file of written)
|
|
41
48
|
console.log(` ${chalk.green('A')} ${file}`);
|
|
49
|
+
console.log(` ${chalk.green('A')} .mapples/secret ${chalk.gray('(gitignored)')}`);
|
|
42
50
|
// First sync pulls the whole project (tolerates being offline).
|
|
43
51
|
const client = new JpatchClient({
|
|
44
52
|
baseUrl: apiUrl,
|
|
45
53
|
projectId,
|
|
54
|
+
token: secret,
|
|
46
55
|
origin: cliOrigin(),
|
|
47
|
-
...(process.env.MAPPLES_TOKEN ? { token: process.env.MAPPLES_TOKEN } : {}),
|
|
48
56
|
});
|
|
49
57
|
try {
|
|
50
58
|
const report = await runSyncEngine({ root: target, client });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/createImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"createImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/createImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import { cliOrigin } from '../../version.js';
|
|
2
1
|
import { existsSync } from 'node:fs';
|
|
3
2
|
import { join } from 'node:path';
|
|
4
3
|
import chalk from 'chalk';
|
|
5
|
-
import prompts from 'prompts';
|
|
6
4
|
import { JpatchClient, isNetworkError } from '../../api/client.js';
|
|
5
|
+
import { resolveProject } from '../../api/auth.js';
|
|
7
6
|
import { writeConfig, configPath } from '../../project/config.js';
|
|
7
|
+
import { resolveApiUrl } from '../../project/env.js';
|
|
8
|
+
import { writeSecret } from '../../project/secret.js';
|
|
8
9
|
import { ensureBabelPlugin, writeSidTypes } from '../../services/scaffold.js';
|
|
9
10
|
import { runSyncEngine } from '../../services/syncEngine.js';
|
|
10
11
|
import { renderReport } from '../../ui/report.js';
|
|
11
|
-
import {
|
|
12
|
+
import { cliOrigin } from '../../version.js';
|
|
13
|
+
import { askSecret } from './createImpl.js';
|
|
12
14
|
export async function runInit(opts) {
|
|
13
15
|
const root = process.cwd();
|
|
14
16
|
if (!existsSync(join(root, 'package.json'))) {
|
|
@@ -17,18 +19,9 @@ export async function runInit(opts) {
|
|
|
17
19
|
if (existsSync(configPath(root))) {
|
|
18
20
|
throw new Error('this app is already linked (.mapples/config.json exists) — run `mapples sync`');
|
|
19
21
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
type: 'text',
|
|
24
|
-
name: 'projectId',
|
|
25
|
-
message: 'Mapples project id (from Creator → project settings)',
|
|
26
|
-
});
|
|
27
|
-
projectId = answer.projectId;
|
|
28
|
-
}
|
|
29
|
-
if (!projectId)
|
|
30
|
-
throw new Error('a project id is required (pass --project <id>)');
|
|
31
|
-
const apiUrl = typeof opts.apiUrl === 'string' ? opts.apiUrl : DEFAULT_API_URL;
|
|
22
|
+
const secret = await askSecret(opts);
|
|
23
|
+
const apiUrl = resolveApiUrl({ apiUrl: opts.apiUrl, denv: opts.denv });
|
|
24
|
+
const { projectId, name } = await resolveProject(apiUrl, secret);
|
|
32
25
|
writeConfig(root, {
|
|
33
26
|
projectId,
|
|
34
27
|
apiUrl,
|
|
@@ -36,8 +29,10 @@ export async function runInit(opts) {
|
|
|
36
29
|
routesDir: 'app/(mapples)',
|
|
37
30
|
schema: 1,
|
|
38
31
|
});
|
|
39
|
-
|
|
32
|
+
writeSecret(root, secret);
|
|
33
|
+
console.log(chalk.bold('\nmapples init') + (name ? chalk.gray(` — project “${name}”`) : ''));
|
|
40
34
|
console.log(` ${chalk.green('A')} .mapples/config.json`);
|
|
35
|
+
console.log(` ${chalk.green('A')} .mapples/secret ${chalk.gray('(gitignored)')}`);
|
|
41
36
|
if (writeSidTypes(root))
|
|
42
37
|
console.log(` ${chalk.green('A')} mapples/sid.d.ts`);
|
|
43
38
|
const babel = ensureBabelPlugin(root);
|
|
@@ -50,8 +45,8 @@ export async function runInit(opts) {
|
|
|
50
45
|
const client = new JpatchClient({
|
|
51
46
|
baseUrl: apiUrl,
|
|
52
47
|
projectId,
|
|
48
|
+
token: secret,
|
|
53
49
|
origin: cliOrigin(),
|
|
54
|
-
...(process.env.MAPPLES_TOKEN ? { token: process.env.MAPPLES_TOKEN } : {}),
|
|
55
50
|
});
|
|
56
51
|
try {
|
|
57
52
|
const report = await runSyncEngine({ root, client });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/initImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"initImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/initImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +1,17 @@
|
|
|
1
|
-
import { cliOrigin } from '../../version.js';
|
|
2
1
|
import chalk from 'chalk';
|
|
3
|
-
import { JpatchClient } from '../../api/client.js';
|
|
4
|
-
import { readConfig } from '../../project/config.js';
|
|
5
2
|
import { runSyncEngine } from '../../services/syncEngine.js';
|
|
3
|
+
import { clientForApp } from '../../services/clientFactory.js';
|
|
6
4
|
import { renderReport } from '../../ui/report.js';
|
|
7
5
|
export async function runSync(opts) {
|
|
8
6
|
const root = process.cwd();
|
|
9
|
-
const
|
|
10
|
-
const client = new JpatchClient({
|
|
11
|
-
baseUrl: config.apiUrl,
|
|
12
|
-
projectId: config.projectId,
|
|
13
|
-
origin: cliOrigin(),
|
|
14
|
-
...(process.env.MAPPLES_TOKEN ? { token: process.env.MAPPLES_TOKEN } : {}),
|
|
15
|
-
});
|
|
7
|
+
const client = clientForApp(root, opts);
|
|
16
8
|
const report = await runSyncEngine({ root, client });
|
|
17
9
|
if (opts.adopt !== false) {
|
|
18
10
|
const { proposeAdoptions } = await import('../../services/adoptService.js');
|
|
19
11
|
await proposeAdoptions({ root, client, report, yes: opts.yes === true });
|
|
20
12
|
}
|
|
21
13
|
if (opts.json === true) {
|
|
22
|
-
console.log(JSON.stringify(
|
|
23
|
-
...report,
|
|
24
|
-
files: report.files,
|
|
25
|
-
warnings: report.warnings,
|
|
26
|
-
conflicts: report.conflicts,
|
|
27
|
-
}, null, 2));
|
|
14
|
+
console.log(JSON.stringify(report, null, 2));
|
|
28
15
|
return;
|
|
29
16
|
}
|
|
30
17
|
console.log(chalk.bold('\nmapples sync'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/syncImpl.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"syncImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/syncImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAA6B;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAErD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAC5E,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACxD,CAAC"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Command } from 'commander';
|
|
2
2
|
export declare function registerInit(program: Command): void;
|
package/dist/commands/init.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { Option } from 'commander';
|
|
1
2
|
export function registerInit(program) {
|
|
2
3
|
program
|
|
3
4
|
.command('init')
|
|
4
5
|
.description('Link an existing Expo app to a Mapples project')
|
|
5
|
-
.option('--
|
|
6
|
+
.option('--secret <secret>', 'project API secret (Creator: Project → Settings)')
|
|
6
7
|
.option('--api-url <url>', 'Mapples API base URL')
|
|
8
|
+
.addOption(new Option('--denv <env>').hideHelp()) // internal: dev|staging|prod
|
|
7
9
|
.option('--json', 'machine-readable output')
|
|
8
10
|
.action(async (opts) => {
|
|
9
11
|
const { runInit } = await import('./impl/initImpl.js');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/commands/sync.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Command } from 'commander';
|
|
2
2
|
export declare function registerSync(program: Command): void;
|
package/dist/commands/sync.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { Option } from 'commander';
|
|
1
2
|
export function registerSync(program) {
|
|
2
3
|
program
|
|
3
4
|
.command('sync')
|
|
4
5
|
.description('Pull remote changes and push local edits in one run')
|
|
5
6
|
.option('--yes', 'accept all adoption proposals without prompting')
|
|
6
7
|
.option('--no-adopt', 'skip the adoption scan')
|
|
8
|
+
.addOption(new Option('--denv <env>').hideHelp()) // internal: dev|staging|prod
|
|
7
9
|
.option('--json', 'machine-readable output')
|
|
8
10
|
.action(async (opts) => {
|
|
9
11
|
const { runSync } = await import('./impl/syncImpl.js');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,OAAO,EAAE,iDAAiD,CAAC;SAClE,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;SAC9C,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type MapplesEnv = 'dev' | 'staging' | 'prod';
|
|
2
|
+
export declare const API_URLS: Record<MapplesEnv, string>;
|
|
3
|
+
export declare const DEFAULT_API_URL: string;
|
|
4
|
+
/**
|
|
5
|
+
* Precedence: explicit --api-url > --denv flag > MAPPLES_ENV env var > prod.
|
|
6
|
+
* `configuredUrl` (from .mapples/config.json) sits between the flags and the
|
|
7
|
+
* default so a linked app keeps its URL unless the caller overrides per run.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveApiUrl(opts: {
|
|
10
|
+
apiUrl?: unknown;
|
|
11
|
+
denv?: unknown;
|
|
12
|
+
configuredUrl?: string;
|
|
13
|
+
}): string;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Internal environment switch (dev tooling only — deliberately NOT shown in
|
|
2
|
+
// --help). URLs mirror the Mapples Creator app / service--mapplesorg stages.
|
|
3
|
+
export const API_URLS = {
|
|
4
|
+
dev: 'https://dev.mapples.org',
|
|
5
|
+
staging: 'https://staging.mapples.org',
|
|
6
|
+
prod: 'https://prod-us.mapples.org',
|
|
7
|
+
};
|
|
8
|
+
export const DEFAULT_API_URL = API_URLS.prod;
|
|
9
|
+
function urlForEnv(env) {
|
|
10
|
+
const url = API_URLS[env];
|
|
11
|
+
if (!url) {
|
|
12
|
+
throw new Error(`unknown --denv "${env}" — expected one of: ${Object.keys(API_URLS).join(', ')}`);
|
|
13
|
+
}
|
|
14
|
+
return url;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Precedence: explicit --api-url > --denv flag > MAPPLES_ENV env var > prod.
|
|
18
|
+
* `configuredUrl` (from .mapples/config.json) sits between the flags and the
|
|
19
|
+
* default so a linked app keeps its URL unless the caller overrides per run.
|
|
20
|
+
*/
|
|
21
|
+
export function resolveApiUrl(opts) {
|
|
22
|
+
if (typeof opts.apiUrl === 'string' && opts.apiUrl.length > 0)
|
|
23
|
+
return opts.apiUrl;
|
|
24
|
+
if (typeof opts.denv === 'string' && opts.denv.length > 0)
|
|
25
|
+
return urlForEnv(opts.denv);
|
|
26
|
+
const envVar = process.env.MAPPLES_ENV;
|
|
27
|
+
if (envVar)
|
|
28
|
+
return urlForEnv(envVar);
|
|
29
|
+
if (opts.configuredUrl)
|
|
30
|
+
return opts.configuredUrl;
|
|
31
|
+
return DEFAULT_API_URL;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/project/env.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,6EAA6E;AAI7E,MAAM,CAAC,MAAM,QAAQ,GAA+B;IAClD,GAAG,EAAE,yBAAyB;IAC9B,OAAO,EAAE,6BAA6B;IACtC,IAAI,EAAE,6BAA6B;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC;AAE7C,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAiB,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,mBAAmB,GAAG,wBAAwB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAI7B;IACC,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAClF,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC,aAAa,CAAC;IAClD,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function readSecret(root: string): string;
|
|
2
|
+
export declare function writeSecret(root: string, secret: string): void;
|
|
3
|
+
/** Keep the secret out of version control; appends to .gitignore when missing. */
|
|
4
|
+
export declare function ensureGitignored(root: string): boolean;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// The project API secret (generated in Creator: Project -> Settings).
|
|
2
|
+
// Stored in .mapples/secret — NEVER in config.json, which is committable.
|
|
3
|
+
// Lookup precedence: MAPPLES_SECRET env var > .mapples/secret file.
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { CONFIG_DIR } from './config.js';
|
|
7
|
+
const SECRET_FILE = 'secret';
|
|
8
|
+
const GITIGNORE_LINE = '.mapples/secret';
|
|
9
|
+
function secretPath(root) {
|
|
10
|
+
return join(root, CONFIG_DIR, SECRET_FILE);
|
|
11
|
+
}
|
|
12
|
+
export function readSecret(root) {
|
|
13
|
+
const fromEnv = process.env.MAPPLES_SECRET;
|
|
14
|
+
if (fromEnv)
|
|
15
|
+
return fromEnv;
|
|
16
|
+
const path = secretPath(root);
|
|
17
|
+
if (!existsSync(path)) {
|
|
18
|
+
throw new Error('no project API secret found — set MAPPLES_SECRET or re-run `mapples init --secret <secret>` ' +
|
|
19
|
+
'(generate one in Creator: Project → Settings)');
|
|
20
|
+
}
|
|
21
|
+
const secret = readFileSync(path, 'utf8').trim();
|
|
22
|
+
if (!secret)
|
|
23
|
+
throw new Error(`${path} is empty — re-run \`mapples init --secret <secret>\``);
|
|
24
|
+
return secret;
|
|
25
|
+
}
|
|
26
|
+
export function writeSecret(root, secret) {
|
|
27
|
+
mkdirSync(join(root, CONFIG_DIR), { recursive: true });
|
|
28
|
+
writeFileSync(secretPath(root), secret + '\n', { mode: 0o600 });
|
|
29
|
+
ensureGitignored(root);
|
|
30
|
+
}
|
|
31
|
+
/** Keep the secret out of version control; appends to .gitignore when missing. */
|
|
32
|
+
export function ensureGitignored(root) {
|
|
33
|
+
const gitignore = join(root, '.gitignore');
|
|
34
|
+
if (!existsSync(gitignore)) {
|
|
35
|
+
writeFileSync(gitignore, GITIGNORE_LINE + '\n');
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
const content = readFileSync(gitignore, 'utf8');
|
|
39
|
+
if (content.split('\n').some((line) => line.trim() === GITIGNORE_LINE))
|
|
40
|
+
return false;
|
|
41
|
+
appendFileSync(gitignore, (content.endsWith('\n') ? '' : '\n') + GITIGNORE_LINE + '\n');
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=secret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret.js","sourceRoot":"","sources":["../../src/project/secret.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,0EAA0E;AAC1E,oEAAoE;AAEpE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAC7B,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAEzC,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC3C,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,8FAA8F;YAC5F,+CAA+C,CAClD,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,uDAAuD,CAAC,CAAC;IAC7F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,aAAa,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IACrF,cAAc,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,CAAC;IACxF,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Builds the JPATCH client for commands running inside a linked app: config
|
|
2
|
+
// gives the project id, .mapples/secret (or MAPPLES_SECRET) authenticates, and
|
|
3
|
+
// the internal --denv flag can point a single run at another stage.
|
|
4
|
+
import { JpatchClient } from '../api/client.js';
|
|
5
|
+
import { readConfig } from '../project/config.js';
|
|
6
|
+
import { resolveApiUrl } from '../project/env.js';
|
|
7
|
+
import { readSecret } from '../project/secret.js';
|
|
8
|
+
import { cliOrigin } from '../version.js';
|
|
9
|
+
export function clientForApp(root, opts) {
|
|
10
|
+
const config = readConfig(root);
|
|
11
|
+
return new JpatchClient({
|
|
12
|
+
baseUrl: resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl }),
|
|
13
|
+
projectId: config.projectId,
|
|
14
|
+
token: readSecret(root),
|
|
15
|
+
origin: cliOrigin(),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=clientFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientFactory.js","sourceRoot":"","sources":["../../src/services/clientFactory.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+EAA+E;AAC/E,oEAAoE;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAA6B;IACtE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,IAAI,YAAY,CAAC;QACtB,OAAO,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACzE,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC;QACvB,MAAM,EAAE,SAAS,EAAE;KACpB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { dirname, join } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { cliVersion } from '../version.js';
|
|
5
6
|
export function templatesDir() {
|
|
6
7
|
// dist/services/scaffold.js -> ../../templates
|
|
7
8
|
return fileURLToPath(new URL('../../templates/', import.meta.url));
|
|
@@ -23,7 +24,9 @@ export function scaffoldApp(target, appName) {
|
|
|
23
24
|
if (existsSync(outPath))
|
|
24
25
|
continue; // never overwrite
|
|
25
26
|
mkdirSync(dirname(outPath), { recursive: true });
|
|
26
|
-
const content = readFileSync(join(src, relPath), 'utf8')
|
|
27
|
+
const content = readFileSync(join(src, relPath), 'utf8')
|
|
28
|
+
.replaceAll('__APP_NAME__', appName)
|
|
29
|
+
.replaceAll('__CLI_VERSION__', cliVersion());
|
|
27
30
|
writeFileSync(outPath, content);
|
|
28
31
|
written.push(outRel);
|
|
29
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/services/scaffold.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,YAAY;IAC1B,+CAA+C;IAC/C,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,OAAO,GAA2B,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAEpE,+FAA+F;AAC/F,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,OAAe;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACzE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YACzD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,IAAI,UAAU,CAAC,OAAO,CAAC;gBAAE,SAAS,CAAC,kBAAkB;YACrD,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/services/scaffold.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mapples",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-beta.1",
|
|
4
4
|
"description": "Mapples CLI — two-way code sync between Creator and your Expo project",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Oleksandr Soloviov <oleksolv@gmail.com>",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"clean": "rm -rf dist *.tsbuildinfo"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@mapples/sid-ast": "^0.
|
|
21
|
+
"@mapples/sid-ast": "^0.2.0-beta.1",
|
|
22
22
|
"@noble/hashes": "^1.6.1",
|
|
23
23
|
"axios": "^1.7.9",
|
|
24
24
|
"chalk": "^5.4.1",
|
package/templates/gitignore
CHANGED
package/templates/package.json
CHANGED
|
@@ -10,21 +10,59 @@
|
|
|
10
10
|
"sync": "mapples sync"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@mapples/
|
|
14
|
-
"@mapples/
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"react-native-
|
|
13
|
+
"@mapples/action": "^1.1.2",
|
|
14
|
+
"@mapples/form": "^1.2.0",
|
|
15
|
+
"@mapples/inlang": "^1.2.0",
|
|
16
|
+
"@mapples/render": "^1.2.0",
|
|
17
|
+
"@mapples/state": "^1.2.0",
|
|
18
|
+
"@mapples/style": "^1.2.0",
|
|
19
|
+
"@mapples/types": "^1.2.0",
|
|
20
|
+
"@mapples/ui": "^1.1.3",
|
|
21
|
+
"@react-native-vector-icons/ant-design": "^13.1.0",
|
|
22
|
+
"@react-native-vector-icons/entypo": "^13.1.0",
|
|
23
|
+
"@react-native-vector-icons/evil-icons": "^13.1.0",
|
|
24
|
+
"@react-native-vector-icons/feather": "^13.1.0",
|
|
25
|
+
"@react-native-vector-icons/fontawesome": "^13.1.0",
|
|
26
|
+
"@react-native-vector-icons/fontawesome5": "^13.1.0",
|
|
27
|
+
"@react-native-vector-icons/fontawesome6": "^13.1.0",
|
|
28
|
+
"@react-native-vector-icons/fontisto": "^13.1.0",
|
|
29
|
+
"@react-native-vector-icons/foundation": "^13.1.0",
|
|
30
|
+
"@react-native-vector-icons/ionicons": "^13.1.0",
|
|
31
|
+
"@react-native-vector-icons/lucide": "^13.1.0",
|
|
32
|
+
"@react-native-vector-icons/material-design-icons": "^13.1.0",
|
|
33
|
+
"@react-native-vector-icons/material-icons": "^13.1.0",
|
|
34
|
+
"@react-native-vector-icons/octicons": "^21.1.0",
|
|
35
|
+
"@react-native-vector-icons/simple-line-icons": "^13.1.0",
|
|
36
|
+
"@react-native-vector-icons/zocial": "^13.1.0",
|
|
37
|
+
"expo": "~57.0.19",
|
|
38
|
+
"expo-constants": "~57.0.17",
|
|
39
|
+
"expo-font": "~57.0.3",
|
|
40
|
+
"expo-linear-gradient": "~57.0.1",
|
|
41
|
+
"expo-linking": "~57.0.9",
|
|
42
|
+
"expo-router": "~57.0.18",
|
|
43
|
+
"expo-splash-screen": "~57.0.8",
|
|
44
|
+
"expo-status-bar": "~57.0.1",
|
|
45
|
+
"expo-system-ui": "~57.0.3",
|
|
46
|
+
"expo-web-browser": "~57.0.2",
|
|
47
|
+
"jsbarcode": "^3.12.3",
|
|
48
|
+
"react": "19.2.3",
|
|
49
|
+
"react-dom": "19.2.3",
|
|
50
|
+
"react-native": "0.86.3",
|
|
51
|
+
"react-native-gesture-handler": "~2.32.0",
|
|
52
|
+
"react-native-qrcode-svg": "^6.3.22",
|
|
53
|
+
"react-native-reanimated": "4.5.1",
|
|
54
|
+
"react-native-safe-area-context": "~5.7.0",
|
|
55
|
+
"react-native-screens": "~4.26.0",
|
|
56
|
+
"react-native-svg": "15.15.5",
|
|
57
|
+
"react-native-web": "~0.21.0",
|
|
58
|
+
"react-native-worklets": "0.10.1"
|
|
22
59
|
},
|
|
23
60
|
"devDependencies": {
|
|
24
|
-
"@babel/core": "^7.
|
|
25
|
-
"
|
|
26
|
-
"mapples": "
|
|
27
|
-
"
|
|
61
|
+
"@babel/core": "^7.26.0",
|
|
62
|
+
"@types/react": "~19.2.2",
|
|
63
|
+
"babel-plugin-mapples-sid": "__CLI_VERSION__",
|
|
64
|
+
"mapples": "__CLI_VERSION__",
|
|
65
|
+
"typescript": "~6.0.3"
|
|
28
66
|
},
|
|
29
67
|
"private": true
|
|
30
68
|
}
|