mapples 0.1.1 → 0.2.0-beta.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.
Files changed (38) hide show
  1. package/dist/api/auth.d.ts +5 -0
  2. package/dist/api/auth.js +19 -0
  3. package/dist/api/auth.js.map +1 -0
  4. package/dist/commands/adopt.d.ts +1 -1
  5. package/dist/commands/adopt.js +2 -0
  6. package/dist/commands/adopt.js.map +1 -1
  7. package/dist/commands/create.d.ts +1 -1
  8. package/dist/commands/create.js +3 -1
  9. package/dist/commands/create.js.map +1 -1
  10. package/dist/commands/impl/adoptImpl.js +2 -10
  11. package/dist/commands/impl/adoptImpl.js.map +1 -1
  12. package/dist/commands/impl/createImpl.d.ts +1 -1
  13. package/dist/commands/impl/createImpl.js +28 -20
  14. package/dist/commands/impl/createImpl.js.map +1 -1
  15. package/dist/commands/impl/initImpl.js +12 -17
  16. package/dist/commands/impl/initImpl.js.map +1 -1
  17. package/dist/commands/impl/syncImpl.js +3 -16
  18. package/dist/commands/impl/syncImpl.js.map +1 -1
  19. package/dist/commands/init.d.ts +1 -1
  20. package/dist/commands/init.js +3 -1
  21. package/dist/commands/init.js.map +1 -1
  22. package/dist/commands/sync.d.ts +1 -1
  23. package/dist/commands/sync.js +2 -0
  24. package/dist/commands/sync.js.map +1 -1
  25. package/dist/project/env.d.ts +13 -0
  26. package/dist/project/env.js +33 -0
  27. package/dist/project/env.js.map +1 -0
  28. package/dist/project/secret.d.ts +4 -0
  29. package/dist/project/secret.js +44 -0
  30. package/dist/project/secret.js.map +1 -0
  31. package/dist/services/clientFactory.d.ts +2 -0
  32. package/dist/services/clientFactory.js +18 -0
  33. package/dist/services/clientFactory.js.map +1 -0
  34. package/dist/services/scaffold.js +4 -1
  35. package/dist/services/scaffold.js.map +1 -1
  36. package/package.json +2 -2
  37. package/templates/gitignore +2 -0
  38. package/templates/package.json +51 -13
@@ -0,0 +1,5 @@
1
+ export interface ResolvedProject {
2
+ projectId: string;
3
+ name?: string;
4
+ }
5
+ export declare function resolveProject(apiUrl: string, secret: string): Promise<ResolvedProject>;
@@ -0,0 +1,19 @@
1
+ // Secret -> project resolution. The API secret (Creator: Project -> Settings)
2
+ // both authenticates the CLI and identifies the project; the JPATCH paths
3
+ // still need the pid, so we resolve it once and cache it in config.json.
4
+ import axios from 'axios';
5
+ export async function resolveProject(apiUrl, secret) {
6
+ const res = await axios.get(`${apiUrl.replace(/\/+$/, '')}/auth/project`, {
7
+ headers: { Authorization: `Bearer ${secret}` },
8
+ validateStatus: () => true,
9
+ timeout: 30_000,
10
+ });
11
+ if (res.status === 200 && typeof res.data.projectId === 'string') {
12
+ return res.data;
13
+ }
14
+ if (res.status === 401 || res.status === 403) {
15
+ throw new Error('the API secret was rejected — generate a fresh one in Creator (Project → Settings) and re-run with --secret');
16
+ }
17
+ throw new Error(`could not resolve the project from the API secret (HTTP ${res.status})`);
18
+ }
19
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,0EAA0E;AAC1E,yEAAyE;AAEzE,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,MAAc;IACjE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,EAAE;QACxE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;QAC9C,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,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2DAA2D,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5F,CAAC"}
@@ -1,2 +1,2 @@
1
- import type { Command } from 'commander';
1
+ import { Command } from 'commander';
2
2
  export declare function registerAdopt(program: Command): void;
@@ -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":"AAEA,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,4DAA4D,CAAC;SACzE,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
+ {"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 type { Command } from 'commander';
1
+ import { Command } from 'commander';
2
2
  export declare function registerCreate(program: Command): void;
@@ -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('--project <id>', 'Mapples project id to link')
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":"AAEA,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,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
+ {"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 config = readConfig(root);
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,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,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,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,SAAS,EAAE;QACnB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAC;IACH,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
+ {"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 const DEFAULT_API_URL = "https://api.mapples.io";
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 { isNetworkError } from '../../api/client.js';
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
- export const DEFAULT_API_URL = 'https://api.mapples.io';
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
- let projectId = typeof opts.project === 'string' ? opts.project : undefined;
20
- if (!projectId) {
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
- console.log(chalk.bold(`\nmapples create ${app}`));
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,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,IAA6B;IACxE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,kCAAkC,CAAC,CAAC;IAC/D,CAAC;IACD,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvC,IAAI,SAAS,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC3B,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,sDAAsD;SAChE,CAAC,CAAC;QACH,SAAS,GAAG,MAAM,CAAC,SAA+B,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;IAE/E,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC,WAAW,CAAC,MAAM,EAAE;QAClB,SAAS;QACT,MAAM;QACN,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,eAAe;QAC1B,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAEzE,gEAAgE;IAChE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,OAAO,EAAE,MAAM;QACf,SAAS;QACT,MAAM,EAAE,SAAS,EAAE;QACnB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,OAAO,CAAC,GAAG,CACT;QACE,EAAE;QACF,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;QACzB,QAAQ,GAAG,EAAE;QACb,iCAAiC;QACjC,kBAAkB;KACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
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 { DEFAULT_API_URL } from './createImpl.js';
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
- let projectId = typeof opts.project === 'string' ? opts.project : undefined;
21
- if (!projectId) {
22
- const answer = await prompts({
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
- console.log(chalk.bold('\nmapples init'));
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":"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"}
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 config = readConfig(root);
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,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,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,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,SAAS,EAAE;QACnB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAC;IAEH,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,CACT,IAAI,CAAC,SAAS,CACZ;YACE,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,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"}
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"}
@@ -1,2 +1,2 @@
1
- import type { Command } from 'commander';
1
+ import { Command } from 'commander';
2
2
  export declare function registerInit(program: Command): void;
@@ -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('--project <id>', 'Mapples project id to link')
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":"AAEA,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,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"}
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"}
@@ -1,2 +1,2 @@
1
- import type { Command } from 'commander';
1
+ import { Command } from 'commander';
2
2
  export declare function registerSync(program: Command): void;
@@ -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":"AAEA,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,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"}
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,2 @@
1
+ import { JpatchClient } from '../api/client.js';
2
+ export declare function clientForApp(root: string, opts: Record<string, unknown>): JpatchClient;
@@ -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').replaceAll('__APP_NAME__', appName);
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":"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"}
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.1.1",
3
+ "version": "0.2.0-beta.0",
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.1.0",
21
+ "@mapples/sid-ast": "^0.2.0-beta.0",
22
22
  "@noble/hashes": "^1.6.1",
23
23
  "axios": "^1.7.9",
24
24
  "chalk": "^5.4.1",
@@ -5,3 +5,5 @@ web-build/
5
5
  *.log
6
6
  .DS_Store
7
7
  .mapples/outbox/
8
+ # project API secret — never commit
9
+ .mapples/secret
@@ -10,21 +10,59 @@
10
10
  "sync": "mapples sync"
11
11
  },
12
12
  "dependencies": {
13
- "@mapples/render": "latest",
14
- "@mapples/ui": "latest",
15
- "expo": "~54.0.0",
16
- "expo-router": "~6.0.0",
17
- "expo-status-bar": "~3.0.0",
18
- "react": "19.1.0",
19
- "react-native": "0.81.4",
20
- "react-native-safe-area-context": "~5.6.0",
21
- "react-native-screens": "~4.16.0"
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.0",
25
- "babel-plugin-mapples-sid": "latest",
26
- "mapples": "latest",
27
- "typescript": "~5.9.0"
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
  }