@jigx/sdk-tools 1.1.0-rc → 1.1.0-rc.4

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 (130) hide show
  1. package/README.md +30 -51
  2. package/dist/auth/cognito-auth.d.ts +26 -0
  3. package/dist/auth/cognito-auth.d.ts.map +1 -0
  4. package/dist/auth/cognito-auth.js +150 -0
  5. package/dist/auth/cognito-auth.js.map +1 -0
  6. package/dist/auth/cognito-config.d.ts +10 -0
  7. package/dist/auth/cognito-config.d.ts.map +1 -0
  8. package/dist/auth/cognito-config.js +17 -0
  9. package/dist/auth/cognito-config.js.map +1 -0
  10. package/dist/auth/credentials-store.d.ts +34 -0
  11. package/dist/auth/credentials-store.d.ts.map +1 -0
  12. package/dist/auth/credentials-store.js +116 -0
  13. package/dist/auth/credentials-store.js.map +1 -0
  14. package/dist/auth/errors.d.ts +23 -0
  15. package/dist/auth/errors.d.ts.map +1 -0
  16. package/dist/auth/errors.js +39 -0
  17. package/dist/auth/errors.js.map +1 -0
  18. package/dist/auth/identity-client.d.ts +19 -0
  19. package/dist/auth/identity-client.d.ts.map +1 -0
  20. package/dist/auth/identity-client.js +70 -0
  21. package/dist/auth/identity-client.js.map +1 -0
  22. package/dist/auth/index.d.ts +12 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +7 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/auth/jigx-config-store.d.ts +27 -0
  27. package/dist/auth/jigx-config-store.d.ts.map +1 -0
  28. package/dist/auth/jigx-config-store.js +76 -0
  29. package/dist/auth/jigx-config-store.js.map +1 -0
  30. package/dist/cli.js +138 -14
  31. package/dist/cli.js.map +1 -1
  32. package/dist/deployer/deploy-to-strata.js +2 -2
  33. package/dist/deployer/deploy-to-strata.js.map +1 -1
  34. package/dist/deployer/deploy.d.ts +17 -0
  35. package/dist/deployer/deploy.d.ts.map +1 -1
  36. package/dist/deployer/deploy.js +90 -4
  37. package/dist/deployer/deploy.js.map +1 -1
  38. package/dist/deployer/index.d.ts +1 -1
  39. package/dist/deployer/index.d.ts.map +1 -1
  40. package/dist/deployer/index.js +1 -1
  41. package/dist/deployer/index.js.map +1 -1
  42. package/dist/index.d.ts +8 -2
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +4 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/init/index.d.ts +2 -0
  47. package/dist/init/index.d.ts.map +1 -0
  48. package/dist/init/index.js +2 -0
  49. package/dist/init/index.js.map +1 -0
  50. package/dist/init/init.d.ts +45 -0
  51. package/dist/init/init.d.ts.map +1 -0
  52. package/dist/init/init.js +125 -0
  53. package/dist/init/init.js.map +1 -0
  54. package/dist/login/index.d.ts +3 -0
  55. package/dist/login/index.d.ts.map +1 -0
  56. package/dist/login/index.js +2 -0
  57. package/dist/login/index.js.map +1 -0
  58. package/dist/login/login.d.ts +19 -0
  59. package/dist/login/login.d.ts.map +1 -0
  60. package/dist/login/login.js +58 -0
  61. package/dist/login/login.js.map +1 -0
  62. package/dist/logout/index.d.ts +3 -0
  63. package/dist/logout/index.d.ts.map +1 -0
  64. package/dist/logout/index.js +2 -0
  65. package/dist/logout/index.js.map +1 -0
  66. package/dist/logout/logout.d.ts +26 -0
  67. package/dist/logout/logout.d.ts.map +1 -0
  68. package/dist/logout/logout.js +100 -0
  69. package/dist/logout/logout.js.map +1 -0
  70. package/dist/scaffolder/scaffold.d.ts.map +1 -1
  71. package/dist/scaffolder/scaffold.js +1 -4
  72. package/dist/scaffolder/scaffold.js.map +1 -1
  73. package/dist/scaffolder/templates.d.ts +0 -1
  74. package/dist/scaffolder/templates.d.ts.map +1 -1
  75. package/dist/scaffolder/templates.js +23 -47
  76. package/dist/scaffolder/templates.js.map +1 -1
  77. package/dist/whoami/index.d.ts +3 -0
  78. package/dist/whoami/index.d.ts.map +1 -0
  79. package/dist/whoami/index.js +2 -0
  80. package/dist/whoami/index.js.map +1 -0
  81. package/dist/whoami/whoami.d.ts +27 -0
  82. package/dist/whoami/whoami.d.ts.map +1 -0
  83. package/dist/whoami/whoami.js +52 -0
  84. package/dist/whoami/whoami.js.map +1 -0
  85. package/package.json +19 -3
  86. package/CHANGELOG.md +0 -15
  87. package/dist/builder/__tests__/build.test.d.ts +0 -2
  88. package/dist/builder/__tests__/build.test.d.ts.map +0 -1
  89. package/dist/builder/__tests__/build.test.js +0 -88
  90. package/dist/builder/__tests__/build.test.js.map +0 -1
  91. package/dist/builder/__tests__/extract-to-folder.test.d.ts +0 -2
  92. package/dist/builder/__tests__/extract-to-folder.test.d.ts.map +0 -1
  93. package/dist/builder/__tests__/extract-to-folder.test.js +0 -198
  94. package/dist/builder/__tests__/extract-to-folder.test.js.map +0 -1
  95. package/dist/builder/__tests__/fixtures/sample-application.d.ts +0 -2
  96. package/dist/builder/__tests__/fixtures/sample-application.d.ts.map +0 -1
  97. package/dist/builder/__tests__/fixtures/sample-application.js +0 -56
  98. package/dist/builder/__tests__/fixtures/sample-application.js.map +0 -1
  99. package/dist/creator/__tests__/create.test.d.ts +0 -2
  100. package/dist/creator/__tests__/create.test.d.ts.map +0 -1
  101. package/dist/creator/__tests__/create.test.js +0 -93
  102. package/dist/creator/__tests__/create.test.js.map +0 -1
  103. package/dist/deployer/__tests__/deploy-to-strata.test.d.ts +0 -2
  104. package/dist/deployer/__tests__/deploy-to-strata.test.d.ts.map +0 -1
  105. package/dist/deployer/__tests__/deploy-to-strata.test.js +0 -174
  106. package/dist/deployer/__tests__/deploy-to-strata.test.js.map +0 -1
  107. package/dist/deployer/__tests__/deploy.test.d.ts +0 -2
  108. package/dist/deployer/__tests__/deploy.test.d.ts.map +0 -1
  109. package/dist/deployer/__tests__/deploy.test.js +0 -116
  110. package/dist/deployer/__tests__/deploy.test.js.map +0 -1
  111. package/dist/env-loader/__tests__/load-env.test.d.ts +0 -2
  112. package/dist/env-loader/__tests__/load-env.test.d.ts.map +0 -1
  113. package/dist/env-loader/__tests__/load-env.test.js +0 -46
  114. package/dist/env-loader/__tests__/load-env.test.js.map +0 -1
  115. package/dist/env-loader/index.d.ts +0 -3
  116. package/dist/env-loader/index.d.ts.map +0 -1
  117. package/dist/env-loader/index.js +0 -2
  118. package/dist/env-loader/index.js.map +0 -1
  119. package/dist/env-loader/load-env.d.ts +0 -12
  120. package/dist/env-loader/load-env.d.ts.map +0 -1
  121. package/dist/env-loader/load-env.js +0 -50
  122. package/dist/env-loader/load-env.js.map +0 -1
  123. package/dist/scaffolder/__tests__/scaffold.test.d.ts +0 -2
  124. package/dist/scaffolder/__tests__/scaffold.test.d.ts.map +0 -1
  125. package/dist/scaffolder/__tests__/scaffold.test.js +0 -124
  126. package/dist/scaffolder/__tests__/scaffold.test.js.map +0 -1
  127. package/dist/slug/__tests__/validate.test.d.ts +0 -2
  128. package/dist/slug/__tests__/validate.test.d.ts.map +0 -1
  129. package/dist/slug/__tests__/validate.test.js +0 -51
  130. package/dist/slug/__tests__/validate.test.js.map +0 -1
@@ -1,116 +0,0 @@
1
- import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import path from 'node:path';
4
- import { afterEach, beforeEach, describe, expect, test } from 'vitest';
5
- import { EnvMissingError } from '../../env-loader/index.js';
6
- import { deploy } from '../deploy.js';
7
- function jsonResponse(status, body) {
8
- return new Response(JSON.stringify(body), {
9
- status,
10
- headers: { 'Content-Type': 'application/json' },
11
- });
12
- }
13
- async function createFixture(options) {
14
- const { env } = options;
15
- const projectRoot = await mkdtemp(path.join(tmpdir(), 'jigx-sdk-tools-deploy-test-'));
16
- await writeFile(path.join(projectRoot, 'package.json'), JSON.stringify({ name: 'fixture', private: true, type: 'module' }), 'utf8');
17
- await mkdir(path.join(projectRoot, 'src'), { recursive: true });
18
- await writeFile(path.join(projectRoot, 'src', 'app.ts'), `export const app = {
19
- build: () => ({
20
- name: 'fixture-app',
21
- title: 'Fixture Application',
22
- category: 'business',
23
- description: 'A fixture',
24
- type: 'app',
25
- }),
26
- }`, 'utf8');
27
- if (env !== undefined) {
28
- await writeFile(path.join(projectRoot, '.env'), env, 'utf8');
29
- }
30
- return projectRoot;
31
- }
32
- describe('deploy (e2e smoke)', () => {
33
- let projectRoot;
34
- let originalFetch;
35
- beforeEach(() => {
36
- projectRoot = undefined;
37
- originalFetch = globalThis.fetch;
38
- });
39
- afterEach(async () => {
40
- globalThis.fetch = originalFetch;
41
- if (projectRoot)
42
- await rm(projectRoot, { recursive: true, force: true });
43
- });
44
- test('builds, loads env, and issues GET → POST → PUT for a new Application against prod URLs', async () => {
45
- projectRoot = await createFixture({
46
- env: 'JIGX_API_KEY=test-token\nJIGX_ORGANIZATION_ID=00000000-0000-4000-8000-000000000002\n',
47
- });
48
- const calls = [];
49
- globalThis.fetch = (async (input, init) => {
50
- const url = typeof input === 'string' ? input : input.toString();
51
- const method = init?.method ?? 'GET';
52
- const rawBody = typeof init?.body === 'string' ? init.body : undefined;
53
- calls.push({ url, method, body: rawBody ? JSON.parse(rawBody) : undefined });
54
- if (method === 'GET' && url.endsWith('/solutions/fixture-app')) {
55
- return jsonResponse(404, { error: 'not found' });
56
- }
57
- if (method === 'POST' && url.endsWith('/solutions/')) {
58
- return jsonResponse(201, { solutionId: '00000000-0000-4000-8000-00000000cccc' });
59
- }
60
- if (method === 'PUT' &&
61
- url.endsWith('/solutions/00000000-0000-4000-8000-00000000cccc/content')) {
62
- return jsonResponse(200, {});
63
- }
64
- throw new Error(`unexpected ${method} ${url}`);
65
- });
66
- const result = await deploy({ projectRoot, environment: 'prod' });
67
- expect(result).toEqual({
68
- applicationName: 'fixture-app',
69
- solutionId: '00000000-0000-4000-8000-00000000cccc',
70
- isNewApplication: true,
71
- manageUrl: 'https://manage.jigx.com/org/00000000-0000-4000-8000-000000000002/solution/00000000-0000-4000-8000-00000000cccc',
72
- });
73
- expect(calls.map((c) => `${c.method} ${c.url}`)).toEqual([
74
- 'GET https://us-east-1.api.jigx.com/v2.0/strata/organizations/00000000-0000-4000-8000-000000000002/solutions/fixture-app',
75
- 'POST https://us-east-1.api.jigx.com/v2.0/strata/organizations/00000000-0000-4000-8000-000000000002/solutions/',
76
- 'PUT https://us-east-1.api.jigx.com/v2.0/strata/organizations/00000000-0000-4000-8000-000000000002/solutions/00000000-0000-4000-8000-00000000cccc/content',
77
- ]);
78
- });
79
- test('hits dev URLs when environment is "dev"', async () => {
80
- projectRoot = await createFixture({
81
- env: 'JIGX_API_KEY=test-token\nJIGX_ORGANIZATION_ID=00000000-0000-4000-8000-000000000002\n',
82
- });
83
- const calls = [];
84
- globalThis.fetch = (async (input, init) => {
85
- const url = typeof input === 'string' ? input : input.toString();
86
- const method = init?.method ?? 'GET';
87
- calls.push({ url, method });
88
- if (method === 'GET' && url.endsWith('/solutions/fixture-app')) {
89
- return jsonResponse(404, { error: 'not found' });
90
- }
91
- if (method === 'POST' && url.endsWith('/solutions/')) {
92
- return jsonResponse(201, { solutionId: '00000000-0000-4000-8000-00000000cccc' });
93
- }
94
- if (method === 'PUT' &&
95
- url.endsWith('/solutions/00000000-0000-4000-8000-00000000cccc/content')) {
96
- return jsonResponse(200, {});
97
- }
98
- throw new Error(`unexpected ${method} ${url}`);
99
- });
100
- const result = await deploy({ projectRoot, environment: 'dev' });
101
- expect(result.manageUrl).toBe('https://manage-dev.jigx.com/org/00000000-0000-4000-8000-000000000002/solution/00000000-0000-4000-8000-00000000cccc');
102
- expect(calls.every((c) => c.url.startsWith('https://us-west-2.dev-api.jigx.com'))).toBe(true);
103
- });
104
- test('throws EnvMissingError before any fetch when .env is absent', async () => {
105
- projectRoot = await createFixture({});
106
- let fetchCount = 0;
107
- globalThis.fetch = (async () => {
108
- fetchCount++;
109
- return jsonResponse(200, {});
110
- });
111
- const error = await deploy({ projectRoot, environment: 'prod' }).catch((e) => e);
112
- expect(error).toBeInstanceOf(EnvMissingError);
113
- expect(fetchCount).toBe(0);
114
- });
115
- });
116
- //# sourceMappingURL=deploy.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deploy.test.js","sourceRoot":"","sources":["../../../src/deployer/__tests__/deploy.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=load-env.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-env.test.d.ts","sourceRoot":"","sources":["../../../src/env-loader/__tests__/load-env.test.ts"],"names":[],"mappings":""}
@@ -1,46 +0,0 @@
1
- import { mkdtemp, rm, writeFile } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import path from 'node:path';
4
- import { afterEach, beforeEach, describe, expect, test } from 'vitest';
5
- import { EnvMissingError, loadEnv } from '../load-env.js';
6
- describe('EnvLoader.loadEnv', () => {
7
- let projectRoot;
8
- beforeEach(() => {
9
- projectRoot = undefined;
10
- });
11
- afterEach(async () => {
12
- if (projectRoot)
13
- await rm(projectRoot, { recursive: true, force: true });
14
- });
15
- test('returns apiKey + organizationId when both vars are present in .env', async () => {
16
- projectRoot = await mkdtemp(path.join(tmpdir(), 'jigx-env-loader-test-'));
17
- await writeFile(path.join(projectRoot, '.env'), 'JIGX_API_KEY=secret-token\nJIGX_ORGANIZATION_ID=org-abc\n', 'utf8');
18
- const result = await loadEnv({ projectRoot });
19
- expect(result).toEqual({ apiKey: 'secret-token', organizationId: 'org-abc' });
20
- });
21
- test('throws EnvMissingError naming missing vars when .env omits them', async () => {
22
- projectRoot = await mkdtemp(path.join(tmpdir(), 'jigx-env-loader-test-'));
23
- await writeFile(path.join(projectRoot, '.env'), 'JIGX_API_KEY=secret-token\n', 'utf8');
24
- const error = await loadEnv({ projectRoot }).catch((e) => e);
25
- expect(error).toBeInstanceOf(EnvMissingError);
26
- expect(error.message).toMatch(/JIGX_ORGANIZATION_ID/);
27
- expect(error.message).toMatch(/\.env/);
28
- });
29
- test('throws EnvMissingError when .env file does not exist', async () => {
30
- projectRoot = await mkdtemp(path.join(tmpdir(), 'jigx-env-loader-test-'));
31
- const error = await loadEnv({ projectRoot }).catch((e) => e);
32
- expect(error).toBeInstanceOf(EnvMissingError);
33
- expect(error.message).toMatch(/\.env/);
34
- expect(error.message).toMatch(/JIGX_API_KEY/);
35
- expect(error.message).toMatch(/JIGX_ORGANIZATION_ID/);
36
- });
37
- test('treats empty values as missing', async () => {
38
- projectRoot = await mkdtemp(path.join(tmpdir(), 'jigx-env-loader-test-'));
39
- await writeFile(path.join(projectRoot, '.env'), 'JIGX_API_KEY=\nJIGX_ORGANIZATION_ID=\n', 'utf8');
40
- const error = await loadEnv({ projectRoot }).catch((e) => e);
41
- expect(error).toBeInstanceOf(EnvMissingError);
42
- expect(error.message).toMatch(/JIGX_API_KEY/);
43
- expect(error.message).toMatch(/JIGX_ORGANIZATION_ID/);
44
- });
45
- });
46
- //# sourceMappingURL=load-env.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-env.test.js","sourceRoot":"","sources":["../../../src/env-loader/__tests__/load-env.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export { loadEnv, EnvMissingError } from './load-env.js';
2
- export type { LoadEnvOptions, LoadedEnv } from './load-env.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/env-loader/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACxD,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA"}
@@ -1,2 +0,0 @@
1
- export { loadEnv, EnvMissingError } from './load-env.js';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/env-loader/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA"}
@@ -1,12 +0,0 @@
1
- export interface LoadEnvOptions {
2
- readonly projectRoot: string;
3
- }
4
- export interface LoadedEnv {
5
- readonly apiKey: string;
6
- readonly organizationId: string;
7
- }
8
- export declare class EnvMissingError extends Error {
9
- constructor(message: string);
10
- }
11
- export declare function loadEnv(options: LoadEnvOptions): Promise<LoadedEnv>;
12
- //# sourceMappingURL=load-env.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-env.d.ts","sourceRoot":"","sources":["../../src/env-loader/load-env.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAE7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAgCD,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CA4BzE"}
@@ -1,50 +0,0 @@
1
- import { readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { parseEnv } from 'node:util';
4
- export class EnvMissingError extends Error {
5
- constructor(message) {
6
- super(message);
7
- this.name = 'EnvMissingError';
8
- }
9
- }
10
- const REQUIRED_VARS = ['JIGX_API_KEY', 'JIGX_ORGANIZATION_ID'];
11
- function isFileNotFoundError(error) {
12
- return (error instanceof Error && 'code' in error && error.code === 'ENOENT');
13
- }
14
- function missingVarsMessage(options) {
15
- const { missing, envPath, fileExists } = options;
16
- const lead = fileExists
17
- ? `Missing required environment variables in ${envPath}: ${missing.join(', ')}.`
18
- : `No .env file found at ${envPath}.`;
19
- const instruction = fileExists
20
- ? `Add the variable${missing.length > 1 ? 's' : ''} to .env:`
21
- : `Create .env with:`;
22
- const lines = REQUIRED_VARS.map((name) => ` ${name}=<your-${name.toLowerCase()}>`);
23
- return [lead, instruction, ...lines].join('\n');
24
- }
25
- export async function loadEnv(options) {
26
- const { projectRoot } = options;
27
- const envPath = path.join(projectRoot, '.env');
28
- let parsed = {};
29
- let fileExists = true;
30
- try {
31
- parsed = parseEnv(await readFile(envPath, 'utf8'));
32
- }
33
- catch (error) {
34
- if (!isFileNotFoundError(error))
35
- throw error;
36
- fileExists = false;
37
- }
38
- const apiKey = parsed.JIGX_API_KEY;
39
- const organizationId = parsed.JIGX_ORGANIZATION_ID;
40
- const missing = [];
41
- if (!apiKey)
42
- missing.push('JIGX_API_KEY');
43
- if (!organizationId)
44
- missing.push('JIGX_ORGANIZATION_ID');
45
- if (missing.length > 0 || !apiKey || !organizationId) {
46
- throw new EnvMissingError(missingVarsMessage({ missing, envPath, fileExists }));
47
- }
48
- return { apiKey, organizationId };
49
- }
50
- //# sourceMappingURL=load-env.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-env.js","sourceRoot":"","sources":["../../src/env-loader/load-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAYpC,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe,EAAE;QAC3B,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAAA,CAC9B;CACF;AAED,MAAM,aAAa,GAAG,CAAC,cAAc,EAAE,sBAAsB,CAAU,CAAA;AAEvE,SAAS,mBAAmB,CAAC,KAAc,EAAW;IACpD,OAAO,CACL,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAChG,CAAA;AAAA,CACF;AAED,SAAS,kBAAkB,CAAC,OAI3B,EAAU;IACT,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,IAAI,GAAG,UAAU;QACrB,CAAC,CAAC,6CAA6C,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAChF,CAAC,CAAC,yBAAyB,OAAO,GAAG,CAAA;IACvC,MAAM,WAAW,GAAG,UAAU;QAC5B,CAAC,CAAC,mBAAmB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW;QAC7D,CAAC,CAAC,mBAAmB,CAAA;IACvB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,UAAU,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;IACnF,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAAA,CAChD;AAQD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB,EAAsB;IACzE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAE9C,IAAI,MAAM,GAAwB,EAAE,CAAA;IACpC,IAAI,UAAU,GAAG,IAAI,CAAA;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAA;QAC5C,UAAU,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAA;IAClC,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAoB,CAAA;IAElD,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACzC,IAAI,CAAC,cAAc;QAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IAKzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACrD,MAAM,IAAI,eAAe,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;IACjF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;AAAA,CAClC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=scaffold.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold.test.d.ts","sourceRoot":"","sources":["../../../src/scaffolder/__tests__/scaffold.test.ts"],"names":[],"mappings":""}
@@ -1,124 +0,0 @@
1
- import { mkdtemp, readFile, rm } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import path from 'node:path';
4
- import { afterEach, beforeEach, describe, expect, test } from 'vitest';
5
- import { scaffold, ScaffoldError } from '../scaffold.js';
6
- describe('Scaffolder.scaffold', () => {
7
- let workdir;
8
- beforeEach(() => {
9
- workdir = undefined;
10
- });
11
- afterEach(async () => {
12
- if (workdir)
13
- await rm(workdir, { recursive: true, force: true });
14
- });
15
- test('writes the canonical file tree with prompt values substituted', async () => {
16
- workdir = await mkdtemp(path.join(tmpdir(), 'jigx-scaffold-test-'));
17
- const destinationPath = path.join(workdir, 'customer-selection');
18
- const result = await scaffold({
19
- title: 'Customer Selection',
20
- applicationName: 'customer-selection',
21
- type: 'app',
22
- destinationPath,
23
- });
24
- expect(result.destinationPath).toBe(destinationPath);
25
- expect(result.filesWritten.map((p) => path.relative(destinationPath, p)).sort()).toEqual([
26
- '.env',
27
- '.env.example',
28
- '.gitignore',
29
- '.npmrc',
30
- '.yarnrc.yml',
31
- 'README.md',
32
- 'package.json',
33
- 'src/app.ts',
34
- 'tsconfig.json',
35
- ].sort());
36
- const pkg = JSON.parse(await readFile(path.join(destinationPath, 'package.json'), 'utf8'));
37
- expect(pkg).toMatchObject({
38
- name: 'customer-selection',
39
- private: true,
40
- type: 'module',
41
- engines: { node: '>=22' },
42
- scripts: { build: 'jigx build', deploy: 'jigx deploy', typecheck: 'tsc --build' },
43
- dependencies: { '@jigx/core-sdk': '^1.0.0' },
44
- devDependencies: {
45
- '@jigx/sdk-tools': expect.any(String),
46
- tsx: expect.any(String),
47
- typescript: expect.any(String),
48
- },
49
- });
50
- expect(pkg.packageManager).toBeUndefined();
51
- const gitignoreContent = await readFile(path.join(destinationPath, '.gitignore'), 'utf8');
52
- expect(gitignoreContent).toContain('.env');
53
- expect(gitignoreContent).toContain('node_modules/');
54
- expect(gitignoreContent).toContain('build/');
55
- const envExampleContent = await readFile(path.join(destinationPath, '.env.example'), 'utf8');
56
- expect(envExampleContent).toContain('JIGX_API_KEY');
57
- expect(envExampleContent).toContain('JIGX_ORGANIZATION_ID');
58
- const envContent = await readFile(path.join(destinationPath, '.env'), 'utf8');
59
- expect(envContent).toBe(envExampleContent);
60
- const npmrcContent = await readFile(path.join(destinationPath, '.npmrc'), 'utf8');
61
- expect(npmrcContent).toContain('@jigx:registry=https://registry.npmjs.org/');
62
- expect(npmrcContent).toContain('//registry.npmjs.org/:_authToken=${NPM_TOKEN}');
63
- const yarnrcContent = await readFile(path.join(destinationPath, '.yarnrc.yml'), 'utf8');
64
- expect(yarnrcContent).toContain('nodeLinker: node-modules');
65
- const readmeContent = await readFile(path.join(destinationPath, 'README.md'), 'utf8');
66
- expect(readmeContent).toContain('Customer Selection');
67
- expect(readmeContent).toContain('customer-selection');
68
- expect(readmeContent).toContain('NPM_TOKEN');
69
- expect(readmeContent).toContain('JIGX_API_KEY');
70
- expect(readmeContent).toContain('JIGX_ORGANIZATION_ID');
71
- expect(readmeContent).toContain('jigx build');
72
- expect(readmeContent).toContain('jigx deploy');
73
- const appTsContent = await readFile(path.join(destinationPath, 'src', 'app.ts'), 'utf8');
74
- expect(appTsContent).toContain("name: 'customer-selection'");
75
- expect(appTsContent).toContain('title: "Customer Selection"');
76
- expect(appTsContent).toContain("type: 'app'");
77
- expect(appTsContent).toContain('ApplicationBuilder');
78
- expect(appTsContent).toContain('export const app');
79
- expect(appTsContent).toContain("screenId: 'home'");
80
- });
81
- test('aborts when destination already exists', async () => {
82
- workdir = await mkdtemp(path.join(tmpdir(), 'jigx-scaffold-test-'));
83
- const destinationPath = path.join(workdir, 'taken');
84
- await scaffold({
85
- title: 'Taken',
86
- applicationName: 'taken',
87
- type: 'app',
88
- destinationPath,
89
- });
90
- await expect(scaffold({
91
- title: 'Taken Again',
92
- applicationName: 'taken',
93
- type: 'data',
94
- destinationPath,
95
- })).rejects.toBeInstanceOf(ScaffoldError);
96
- });
97
- test('embeds the data type in app.ts when type === "data"', async () => {
98
- workdir = await mkdtemp(path.join(tmpdir(), 'jigx-scaffold-test-'));
99
- const destinationPath = path.join(workdir, 'data-app');
100
- await scaffold({
101
- title: 'Data App',
102
- applicationName: 'data-app',
103
- type: 'data',
104
- destinationPath,
105
- });
106
- const appTsContent = await readFile(path.join(destinationPath, 'src', 'app.ts'), 'utf8');
107
- expect(appTsContent).toContain("type: 'data'");
108
- });
109
- test('safely escapes titles containing quotes, backslashes, and newlines in src/app.ts', async () => {
110
- workdir = await mkdtemp(path.join(tmpdir(), 'jigx-scaffold-test-'));
111
- const destinationPath = path.join(workdir, 'tricky');
112
- const trickyTitle = 'Bob\'s "weird" \\back\nline';
113
- await scaffold({
114
- title: trickyTitle,
115
- applicationName: 'bobs-app',
116
- type: 'app',
117
- destinationPath,
118
- });
119
- const appTsContent = await readFile(path.join(destinationPath, 'src', 'app.ts'), 'utf8');
120
- expect(appTsContent).toContain(`title: ${JSON.stringify(trickyTitle)}`);
121
- expect(appTsContent).toContain(`title: ${JSON.stringify(`Welcome to ${trickyTitle}`)}`);
122
- });
123
- });
124
- //# sourceMappingURL=scaffold.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold.test.js","sourceRoot":"","sources":["../../../src/scaffolder/__tests__/scaffold.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=validate.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.test.d.ts","sourceRoot":"","sources":["../../../src/slug/__tests__/validate.test.ts"],"names":[],"mappings":""}
@@ -1,51 +0,0 @@
1
- import { describe, expect, test } from 'vitest';
2
- import { slugifyTitle, validateApplicationName } from '../validate.js';
3
- describe('slugifyTitle', () => {
4
- const cases = [
5
- ['Customer Selection', 'customer-selection'],
6
- [' Customer Selection ', 'customer-selection'],
7
- ['Café Crème!', 'cafe-creme'],
8
- ['Foo_Bar/Baz', 'foo-bar-baz'],
9
- ['---trim---', 'trim'],
10
- ['UPPER', 'upper'],
11
- ['mixed 123 thing', 'mixed-123-thing'],
12
- ['$$$', ''],
13
- ['', ''],
14
- ];
15
- test.each(cases)('slugifyTitle(%j) === %j', (input, expected) => {
16
- expect(slugifyTitle(input)).toBe(expected);
17
- });
18
- test('truncates to 50 characters', () => {
19
- const longInput = 'a'.repeat(60);
20
- expect(slugifyTitle(longInput).length).toBe(50);
21
- });
22
- });
23
- describe('validateApplicationName', () => {
24
- const valid = [
25
- 'a1',
26
- 'customer-selection',
27
- 'app',
28
- 'a'.repeat(50),
29
- '0-9-abc',
30
- '123',
31
- ];
32
- const invalid = [
33
- ['', /2–50 characters/],
34
- ['a', /2–50 characters/],
35
- ['a'.repeat(51), /2–50 characters/],
36
- ['Customer-Selection', /\[a-z0-9-\]\+/],
37
- ['customer_selection', /\[a-z0-9-\]\+/],
38
- ['customer selection', /\[a-z0-9-\]\+/],
39
- ['hello!', /\[a-z0-9-\]\+/],
40
- ];
41
- test.each(valid)('accepts %j', (name) => {
42
- expect(validateApplicationName(name)).toEqual({ ok: true });
43
- });
44
- test.each(invalid)('rejects %j', (name, pattern) => {
45
- const result = validateApplicationName(name);
46
- expect(result.ok).toBe(false);
47
- if (!result.ok)
48
- expect(result.error).toMatch(pattern);
49
- });
50
- });
51
- //# sourceMappingURL=validate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../../src/slug/__tests__/validate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAEtE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;IAC7B,MAAM,KAAK,GAA6C;QACtD,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;QAC5C,CAAC,yBAAyB,EAAE,oBAAoB,CAAC;QACjD,CAAC,eAAa,EAAE,YAAY,CAAC;QAC7B,CAAC,aAAa,EAAE,aAAa,CAAC;QAC9B,CAAC,YAAY,EAAE,MAAM,CAAC;QACtB,CAAC,OAAO,EAAE,OAAO,CAAC;QAClB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;QACtC,CAAC,KAAK,EAAE,EAAE,CAAC;QACX,CAAC,EAAE,EAAE,EAAE,CAAC;KACT,CAAA;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;QAC/D,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAAA,CAC3C,CAAC,CAAA;IAEF,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAChC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAAA,CAChD,CAAC,CAAA;AAAA,CACH,CAAC,CAAA;AAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC;IACxC,MAAM,KAAK,GAAsB;QAC/B,IAAI;QACJ,oBAAoB;QACpB,KAAK;QACL,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACd,SAAS;QACT,KAAK;KACN,CAAA;IAED,MAAM,OAAO,GAA6C;QACxD,CAAC,EAAE,EAAE,mBAAiB,CAAC;QACvB,CAAC,GAAG,EAAE,mBAAiB,CAAC;QACxB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,mBAAiB,CAAC;QACnC,CAAC,oBAAoB,EAAE,eAAe,CAAC;QACvC,CAAC,oBAAoB,EAAE,eAAe,CAAC;QACvC,CAAC,oBAAoB,EAAE,eAAe,CAAC;QACvC,CAAC,QAAQ,EAAE,eAAe,CAAC;KAC5B,CAAA;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAAA,CAC5D,CAAC,CAAA;IAEF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAAA,CACtD,CAAC,CAAA;AAAA,CACH,CAAC,CAAA"}