@ankhorage/templates 7.0.3 → 9.0.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 (84) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/assets/templates/capability-proof/checker.svg +1 -0
  3. package/dist/authoring/compose-category-manifest.d.ts +40 -0
  4. package/dist/authoring/compose-category-manifest.d.ts.map +1 -0
  5. package/dist/authoring/compose-category-manifest.js +150 -0
  6. package/dist/authoring/compose-category-manifest.js.map +1 -0
  7. package/dist/catalog.d.ts +4 -3
  8. package/dist/catalog.d.ts.map +1 -1
  9. package/dist/catalog.js +6 -3
  10. package/dist/catalog.js.map +1 -1
  11. package/dist/commands.d.ts +4 -6
  12. package/dist/commands.d.ts.map +1 -1
  13. package/dist/commands.js +16 -14
  14. package/dist/commands.js.map +1 -1
  15. package/dist/design/category-source.d.ts +557 -0
  16. package/dist/design/category-source.d.ts.map +1 -0
  17. package/dist/design/category-source.js +578 -0
  18. package/dist/design/category-source.js.map +1 -0
  19. package/dist/design/category-theme.d.ts +44 -0
  20. package/dist/design/category-theme.d.ts.map +1 -0
  21. package/dist/design/category-theme.js +146 -0
  22. package/dist/design/category-theme.js.map +1 -0
  23. package/dist/design/category-types.d.ts +73 -0
  24. package/dist/design/category-types.d.ts.map +1 -0
  25. package/dist/design/category-types.js +3 -0
  26. package/dist/design/category-types.js.map +1 -0
  27. package/dist/design/tone-catalog.d.ts +29 -0
  28. package/dist/design/tone-catalog.d.ts.map +1 -0
  29. package/dist/design/tone-catalog.js +254 -0
  30. package/dist/design/tone-catalog.js.map +1 -0
  31. package/dist/generators/create-category-app.d.ts.map +1 -1
  32. package/dist/generators/create-category-app.js +9 -3
  33. package/dist/generators/create-category-app.js.map +1 -1
  34. package/dist/index.d.ts +6 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +6 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/presets/category-presets.d.ts +4 -10
  39. package/dist/presets/category-presets.d.ts.map +1 -1
  40. package/dist/presets/category-presets.js +101 -209
  41. package/dist/presets/category-presets.js.map +1 -1
  42. package/dist/projectSeed.d.ts +4 -0
  43. package/dist/projectSeed.d.ts.map +1 -1
  44. package/dist/projectSeed.js +75 -5
  45. package/dist/projectSeed.js.map +1 -1
  46. package/dist/templates/shared/create-theme.d.ts +1 -0
  47. package/dist/templates/shared/create-theme.d.ts.map +1 -1
  48. package/dist/templates/shared/create-theme.js +2 -0
  49. package/dist/templates/shared/create-theme.js.map +1 -1
  50. package/dist/templates/starter/index.d.ts +2 -1
  51. package/dist/templates/starter/index.d.ts.map +1 -1
  52. package/dist/templates/starter/index.js +1 -0
  53. package/dist/templates/starter/index.js.map +1 -1
  54. package/dist/templates/starter/starter.assets.d.ts +22 -0
  55. package/dist/templates/starter/starter.assets.d.ts.map +1 -0
  56. package/dist/templates/starter/starter.assets.js +124 -0
  57. package/dist/templates/starter/starter.assets.js.map +1 -0
  58. package/dist/templates/starter/starter.registry.d.ts.map +1 -1
  59. package/dist/templates/starter/starter.registry.js +6 -11
  60. package/dist/templates/starter/starter.registry.js.map +1 -1
  61. package/dist/templates/starter/starter.template.d.ts +3 -4
  62. package/dist/templates/starter/starter.template.d.ts.map +1 -1
  63. package/dist/templates/starter/starter.template.js +5 -2
  64. package/dist/templates/starter/starter.template.js.map +1 -1
  65. package/dist/templates/starter/starter.types.d.ts +4 -0
  66. package/dist/templates/starter/starter.types.d.ts.map +1 -1
  67. package/dist/templates/starter/starter.types.js.map +1 -1
  68. package/package.json +5 -3
  69. package/dist/templates/starter/categories/fallback/default.template.d.ts +0 -4
  70. package/dist/templates/starter/categories/fallback/default.template.d.ts.map +0 -1
  71. package/dist/templates/starter/categories/fallback/default.template.js +0 -17
  72. package/dist/templates/starter/categories/fallback/default.template.js.map +0 -1
  73. package/dist/templates/starter/categories/fallback/index.d.ts +0 -8
  74. package/dist/templates/starter/categories/fallback/index.d.ts.map +0 -1
  75. package/dist/templates/starter/categories/fallback/index.js +0 -10
  76. package/dist/templates/starter/categories/fallback/index.js.map +0 -1
  77. package/dist/templates/starter/categories/fallback/routes.d.ts +0 -9
  78. package/dist/templates/starter/categories/fallback/routes.d.ts.map +0 -1
  79. package/dist/templates/starter/categories/fallback/routes.js +0 -20
  80. package/dist/templates/starter/categories/fallback/routes.js.map +0 -1
  81. package/dist/templates/starter/categories/fallback/screens.d.ts +0 -5
  82. package/dist/templates/starter/categories/fallback/screens.d.ts.map +0 -1
  83. package/dist/templates/starter/categories/fallback/screens.js +0 -133
  84. package/dist/templates/starter/categories/fallback/screens.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EAGjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAuB,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAEL,qBAAqB,EACrB,oBAAoB,EACpB,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,EAMtB,cAAc,GAGf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,cAAc,GAIf,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAE3B,0BAA0B,EAM1B,wBAAwB,GACzB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAIL,qBAAqB,EAErB,2BAA2B,GAE5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,aAAa,GAGd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EAEnB,wBAAwB,EACxB,uBAAuB,EAEvB,eAAe,EAEf,iBAAiB,GAKlB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EAGjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EACL,8BAA8B,EAC9B,gBAAgB,GAKjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,qBAAqB,EACrB,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,EAUtB,8BAA8B,EAC9B,4BAA4B,EAC5B,cAAc,EAId,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,cAAc,GAIf,MAAM,sBAAsB,CAAC"}
@@ -1,12 +1,6 @@
1
- import type { AppCategory, ThemeConfig } from '@ankhorage/contracts';
2
- export interface CategoryPreset {
3
- label: string;
4
- defaultName: string;
5
- defaultSlug: string;
6
- primaryColor: string;
7
- harmony: ThemeConfig['light']['harmony'];
8
- summary: string;
9
- focusAreas: readonly [string, string, string];
10
- }
1
+ import type { AppCategory } from '@ankhorage/contracts';
2
+ import type { CategoryPreset, CategoryPresetReconciliationReport } from '../design/category-types';
3
+ export declare const CATEGORY_PRESET_RECONCILIATION: readonly CategoryPresetReconciliationReport[];
11
4
  export declare const CATEGORY_PRESETS: Record<AppCategory, CategoryPreset>;
5
+ export type { CategoryPreset, CategoryPresetFieldReconciliation, CategoryPresetReconciliationDecision, CategoryPresetReconciliationReport, } from '../design/category-types';
12
6
  //# sourceMappingURL=category-presets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"category-presets.d.ts","sourceRoot":"","sources":["../../src/presets/category-presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAErE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/C;AAMD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,CAgNhE,CAAC"}
1
+ {"version":3,"file":"category-presets.d.ts","sourceRoot":"","sources":["../../src/presets/category-presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,KAAK,EACV,cAAc,EAEd,kCAAkC,EAEnC,MAAM,0BAA0B,CAAC;AAqGlC,eAAO,MAAM,8BAA8B,EAAE,SAAS,kCAAkC,EACxB,CAAC;AAEjE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,CAwBhE,CAAC;AAEF,YAAY,EACV,cAAc,EACd,iCAAiC,EACjC,oCAAoC,EACpC,kCAAkC,GACnC,MAAM,0BAA0B,CAAC"}
@@ -1,213 +1,105 @@
1
- function createPreset(config) {
2
- return config;
1
+ import { CATEGORY_SOURCE } from '../design/category-source';
2
+ const CATEGORY_RECONCILIATION_SOURCE = CATEGORY_SOURCE;
3
+ /*** Resolve the single checked-in reconciliation source for a category. */
4
+ function resolveSource(category) {
5
+ const source = CATEGORY_RECONCILIATION_SOURCE.find((entry) => entry.category === category);
6
+ if (!source)
7
+ throw new Error(`Missing category reconciliation source: ${category}.`);
8
+ return source;
3
9
  }
10
+ /*** Keep reviewed recommendations in preference order without inventing alternatives. */
11
+ function createRecommendations(supplied, existing) {
12
+ return supplied === existing ? [supplied] : [supplied, existing];
13
+ }
14
+ /*** Reconcile existing template identity with richer supplied design direction. */
15
+ function createCategoryPreset(source) {
16
+ return {
17
+ category: source.category,
18
+ label: source.existing.label,
19
+ defaultName: source.existing.defaultName,
20
+ defaultSlug: source.existing.defaultSlug,
21
+ summary: source.existing.summary,
22
+ focusAreas: source.existing.focusAreas,
23
+ designIntent: source.supplied.designIntent,
24
+ recommendedPrimaryColors: createRecommendations(source.supplied.primaryColor, source.existing.primaryColor),
25
+ recommendedHarmonies: createRecommendations(source.supplied.harmony, source.existing.harmony),
26
+ tonePairs: { light: source.supplied.lightTonePair, dark: source.supplied.darkTonePair },
27
+ bodyFontCandidates: source.supplied.bodyFontCandidates,
28
+ headingStrategy: source.supplied.headingStrategy,
29
+ headingFontCandidates: source.supplied.headingFontCandidates,
30
+ specialistFontCandidates: source.supplied.specialistFontCandidates,
31
+ density: source.supplied.density,
32
+ shape: source.supplied.shape,
33
+ };
34
+ }
35
+ /*** Describe every source field decision so reconciliation cannot silently discard input. */
36
+ function createFieldReconciliation(source) {
37
+ const preserved = ['label', 'defaultName', 'defaultSlug', 'summary', 'focusAreas'].map((field) => ({
38
+ field: `existing.${field}`,
39
+ decision: 'preserved-existing',
40
+ reason: 'Templates already owns this product and template identity field.',
41
+ }));
42
+ const adopted = [
43
+ 'designIntent',
44
+ 'lightTonePair',
45
+ 'darkTonePair',
46
+ 'bodyFontCandidates',
47
+ 'headingStrategy',
48
+ 'headingFontCandidates',
49
+ 'specialistFontCandidates',
50
+ 'density',
51
+ 'shape',
52
+ ].map((field) => ({
53
+ field: `supplied.${field}`,
54
+ decision: 'adopted-supplied',
55
+ reason: 'The existing preset had no equivalent durable authoring field.',
56
+ }));
57
+ return [
58
+ ...preserved,
59
+ createSharedFieldDecision('primaryColor', source),
60
+ createSharedFieldDecision('harmony', source),
61
+ ...adopted,
62
+ ];
63
+ }
64
+ /*** Preserve agreeing values once and retain conflicts as ordered recommendations. */
65
+ function createSharedFieldDecision(field, source) {
66
+ const agrees = Reflect.get(source.existing, field) === Reflect.get(source.supplied, field);
67
+ return {
68
+ field: `existing.${field} + supplied.${field}`,
69
+ decision: agrees ? 'sources-agree' : 'ordered-both',
70
+ reason: agrees
71
+ ? 'Both reviewed sources specify the same value; the canonical list contains it once.'
72
+ : 'The richer design recommendation is first and the established template value remains an explicit second option.',
73
+ };
74
+ }
75
+ /*** Build one public reconciliation report entry from the canonical source. */
76
+ function createReconciliationReport(source) {
77
+ return { category: source.category, source, fields: createFieldReconciliation(source) };
78
+ }
79
+ export const CATEGORY_PRESET_RECONCILIATION = CATEGORY_RECONCILIATION_SOURCE.map(createReconciliationReport);
4
80
  export const CATEGORY_PRESETS = {
5
- books_reading: createPreset({
6
- label: 'Books & Reading',
7
- defaultName: 'Books & Reading',
8
- defaultSlug: 'books-reading-app',
9
- primaryColor: '#8B4513',
10
- harmony: 'analogous',
11
- summary: 'reading lists, reviews, recommendations, and subscriptions',
12
- focusAreas: ['Reading queue', 'Featured picks', 'Community notes'],
13
- }),
14
- business_productivity: createPreset({
15
- label: 'Business & Productivity',
16
- defaultName: 'Business & Productivity',
17
- defaultSlug: 'business-productivity-app',
18
- primaryColor: '#1D4ED8',
19
- harmony: 'analogous',
20
- summary: 'team coordination, goals, and execution tracking',
21
- focusAreas: ['Active projects', 'Weekly priorities', 'Team updates'],
22
- }),
23
- developer_tools: createPreset({
24
- label: 'Developer Tools',
25
- defaultName: 'Developer Tools',
26
- defaultSlug: 'developer-tools-app',
27
- primaryColor: '#7C3AED',
28
- harmony: 'triadic',
29
- summary: 'release workflows, observability, and engineering operations',
30
- focusAreas: ['Build status', 'Incident queue', 'Developer settings'],
31
- }),
32
- education_learning: createPreset({
33
- label: 'Education & Learning',
34
- defaultName: 'Education & Learning',
35
- defaultSlug: 'education-learning-app',
36
- primaryColor: '#4338CA',
37
- harmony: 'analogous',
38
- summary: 'courses, practice loops, and learner progress',
39
- focusAreas: ['Current lessons', 'Practice plan', 'Milestone tracking'],
40
- }),
41
- entertainment_media: createPreset({
42
- label: 'Entertainment & Media',
43
- defaultName: 'Entertainment & Media',
44
- defaultSlug: 'entertainment-media-app',
45
- primaryColor: '#F97316',
46
- harmony: 'complementary',
47
- summary: 'content discovery, watchlists, and editorial highlights',
48
- focusAreas: ['Featured releases', 'Continue watching', 'Trending topics'],
49
- }),
50
- finance_money: createPreset({
51
- label: 'Finance & Money',
52
- defaultName: 'Finance & Money',
53
- defaultSlug: 'finance-money-app',
54
- primaryColor: '#15803D',
55
- harmony: 'analogous',
56
- summary: 'balances, budgeting, and financial operations',
57
- focusAreas: ['Cash overview', 'Budget health', 'Upcoming activity'],
58
- }),
59
- food_drink: createPreset({
60
- label: 'Food & Drink',
61
- defaultName: 'Food & Drink',
62
- defaultSlug: 'food-drink-app',
63
- primaryColor: '#EA580C',
64
- harmony: 'analogous',
65
- summary: 'menus, ordering, and loyalty experiences',
66
- focusAreas: ['Popular items', 'Order flow', 'Rewards status'],
67
- }),
68
- games: createPreset({
69
- label: 'Games',
70
- defaultName: 'Games',
71
- defaultSlug: 'games-app',
72
- primaryColor: '#7C3AED',
73
- harmony: 'splitComplementary',
74
- summary: 'quests, progression, and player engagement loops',
75
- focusAreas: ['Daily quests', 'Progression', 'Social challenges'],
76
- }),
77
- graphics_design: createPreset({
78
- label: 'Graphics & Design',
79
- defaultName: 'Graphics & Design',
80
- defaultSlug: 'graphics-design-app',
81
- primaryColor: '#9333EA',
82
- harmony: 'triadic',
83
- summary: 'creative assets, reviews, and delivery workflows',
84
- focusAreas: ['Current briefs', 'Asset review', 'Brand tokens'],
85
- }),
86
- health_fitness: createPreset({
87
- label: 'Health & Fitness',
88
- defaultName: 'Health & Fitness',
89
- defaultSlug: 'health-fitness-app',
90
- primaryColor: '#059669',
91
- harmony: 'analogous',
92
- summary: 'habits, activity tracking, and coaching plans',
93
- focusAreas: ['Today plan', 'Progress rings', 'Recovery status'],
94
- }),
95
- kids_family: createPreset({
96
- label: 'Kids & Family',
97
- defaultName: 'Kids & Family',
98
- defaultSlug: 'kids-family-app',
99
- primaryColor: '#F97316',
100
- harmony: 'splitComplementary',
101
- summary: 'safe discovery, routines, and shared family coordination',
102
- focusAreas: ['Daily routines', 'Favorites', 'Parent controls'],
103
- }),
104
- lifestyle: createPreset({
105
- label: 'Lifestyle',
106
- defaultName: 'Lifestyle',
107
- defaultSlug: 'lifestyle-app',
108
- primaryColor: '#DB2777',
109
- harmony: 'analogous',
110
- summary: 'memberships, routines, and curated recommendations',
111
- focusAreas: ['Personal dashboard', 'Saved lists', 'Upcoming plans'],
112
- }),
113
- medical: createPreset({
114
- label: 'Medical',
115
- defaultName: 'Medical',
116
- defaultSlug: 'medical-app',
117
- primaryColor: '#0369A1',
118
- harmony: 'analogous',
119
- summary: 'care coordination, intake, and patient communication',
120
- focusAreas: ['Appointments', 'Care team', 'Health records'],
121
- }),
122
- music_audio: createPreset({
123
- label: 'Music & Audio',
124
- defaultName: 'Music & Audio',
125
- defaultSlug: 'music-audio-app',
126
- primaryColor: '#7C3AED',
127
- harmony: 'triadic',
128
- summary: 'catalog browsing, playback, and creator discovery',
129
- focusAreas: ['Featured mixes', 'Recent listening', 'Creator spotlight'],
130
- }),
131
- navigation_travel: createPreset({
132
- label: 'Navigation & Travel',
133
- defaultName: 'Navigation & Travel',
134
- defaultSlug: 'navigation-travel-app',
135
- primaryColor: '#0284C7',
136
- harmony: 'analogous',
137
- summary: 'planning, routing, and trip operations',
138
- focusAreas: ['Trip planner', 'Saved places', 'Travel alerts'],
139
- }),
140
- news_magazines: createPreset({
141
- label: 'News & Magazines',
142
- defaultName: 'News & Magazines',
143
- defaultSlug: 'news-magazines-app',
144
- primaryColor: '#374151',
145
- harmony: 'monochromatic',
146
- summary: 'headlines, editorial curation, and subscriptions',
147
- focusAreas: ['Top stories', 'Topics', 'Saved articles'],
148
- }),
149
- photo_video: createPreset({
150
- label: 'Photo & Video',
151
- defaultName: 'Photo & Video',
152
- defaultSlug: 'photo-video-app',
153
- primaryColor: '#6D28D9',
154
- harmony: 'complementary',
155
- summary: 'capture flows, asset libraries, and publishing',
156
- focusAreas: ['Recent captures', 'Collections', 'Publishing queue'],
157
- }),
158
- reference: createPreset({
159
- label: 'Reference',
160
- defaultName: 'Reference',
161
- defaultSlug: 'reference-app',
162
- primaryColor: '#1D4ED8',
163
- harmony: 'monochromatic',
164
- summary: 'search, lookup, and structured knowledge discovery',
165
- focusAreas: ['Quick lookup', 'Saved resources', 'Reference sets'],
166
- }),
167
- shopping_commerce: createPreset({
168
- label: 'Shopping & Commerce',
169
- defaultName: 'Shopping & Commerce',
170
- defaultSlug: 'shopping-commerce-app',
171
- primaryColor: '#EA580C',
172
- harmony: 'analogous',
173
- summary: 'catalogs, carts, and fulfillment journeys',
174
- focusAreas: ['Featured products', 'Cart state', 'Order tracking'],
175
- }),
176
- social_community: createPreset({
177
- label: 'Social & Community',
178
- defaultName: 'Social & Community',
179
- defaultSlug: 'social-community-app',
180
- primaryColor: '#2563EB',
181
- harmony: 'complementary',
182
- summary: 'feeds, groups, and community participation',
183
- focusAreas: ['Community feed', 'Group highlights', 'Creator actions'],
184
- }),
185
- sports: createPreset({
186
- label: 'Sports',
187
- defaultName: 'Sports',
188
- defaultSlug: 'sports-app',
189
- primaryColor: '#DC2626',
190
- harmony: 'splitComplementary',
191
- summary: 'fixtures, scores, and fan engagement',
192
- focusAreas: ['Live schedule', 'Standings', 'Team updates'],
193
- }),
194
- utilities_tools: createPreset({
195
- label: 'Utilities & Tools',
196
- defaultName: 'Utilities & Tools',
197
- defaultSlug: 'utilities-tools-app',
198
- primaryColor: '#374151',
199
- harmony: 'monochromatic',
200
- summary: 'task-driven workflows, controls, and quick actions',
201
- focusAreas: ['Primary utilities', 'Saved shortcuts', 'Automation settings'],
202
- }),
203
- weather: createPreset({
204
- label: 'Weather',
205
- defaultName: 'Weather',
206
- defaultSlug: 'weather-app',
207
- primaryColor: '#0284C7',
208
- harmony: 'analogous',
209
- summary: 'conditions, alerts, and forecast planning',
210
- focusAreas: ['Current conditions', 'Hourly forecast', 'Alerts'],
211
- }),
81
+ books_reading: createCategoryPreset(resolveSource('books_reading')),
82
+ business_productivity: createCategoryPreset(resolveSource('business_productivity')),
83
+ developer_tools: createCategoryPreset(resolveSource('developer_tools')),
84
+ education_learning: createCategoryPreset(resolveSource('education_learning')),
85
+ entertainment_media: createCategoryPreset(resolveSource('entertainment_media')),
86
+ finance_money: createCategoryPreset(resolveSource('finance_money')),
87
+ food_drink: createCategoryPreset(resolveSource('food_drink')),
88
+ games: createCategoryPreset(resolveSource('games')),
89
+ graphics_design: createCategoryPreset(resolveSource('graphics_design')),
90
+ health_fitness: createCategoryPreset(resolveSource('health_fitness')),
91
+ kids_family: createCategoryPreset(resolveSource('kids_family')),
92
+ lifestyle: createCategoryPreset(resolveSource('lifestyle')),
93
+ medical: createCategoryPreset(resolveSource('medical')),
94
+ music_audio: createCategoryPreset(resolveSource('music_audio')),
95
+ navigation_travel: createCategoryPreset(resolveSource('navigation_travel')),
96
+ news_magazines: createCategoryPreset(resolveSource('news_magazines')),
97
+ photo_video: createCategoryPreset(resolveSource('photo_video')),
98
+ reference: createCategoryPreset(resolveSource('reference')),
99
+ shopping_commerce: createCategoryPreset(resolveSource('shopping_commerce')),
100
+ social_community: createCategoryPreset(resolveSource('social_community')),
101
+ sports: createCategoryPreset(resolveSource('sports')),
102
+ utilities_tools: createCategoryPreset(resolveSource('utilities_tools')),
103
+ weather: createCategoryPreset(resolveSource('weather')),
212
104
  };
213
105
  //# sourceMappingURL=category-presets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"category-presets.js","sourceRoot":"","sources":["../../src/presets/category-presets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"category-presets.js","sourceRoot":"","sources":["../../src/presets/category-presets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAQ5D,MAAM,8BAA8B,GAClC,eAAe,CAAC;AAElB,2EAA2E;AAC3E,SAAS,aAAa,CAAC,QAAqB;IAC1C,MAAM,MAAM,GAAG,8BAA8B,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC3F,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,QAAQ,GAAG,CAAC,CAAC;IACrF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yFAAyF;AACzF,SAAS,qBAAqB,CAC5B,QAAgB,EAChB,QAAgB;IAEhB,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED,mFAAmF;AACnF,SAAS,oBAAoB,CAAC,MAA0C;IACtE,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;QAC5B,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;QACxC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;QACxC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;QAChC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;QACtC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY;QAC1C,wBAAwB,EAAE,qBAAqB,CAC7C,MAAM,CAAC,QAAQ,CAAC,YAAY,EAC5B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAC7B;QACD,oBAAoB,EAAE,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC7F,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE;QACvF,kBAAkB,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB;QACtD,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe;QAChD,qBAAqB,EAAE,MAAM,CAAC,QAAQ,CAAC,qBAAqB;QAC5D,wBAAwB,EAAE,MAAM,CAAC,QAAQ,CAAC,wBAAwB;QAClE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;QAChC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;KAC7B,CAAC;AACJ,CAAC;AAED,6FAA6F;AAC7F,SAAS,yBAAyB,CAChC,MAA0C;IAE1C,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,GAAG,CACpF,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACV,KAAK,EAAE,YAAY,KAAK,EAAE;QAC1B,QAAQ,EAAE,oBAA6B;QACvC,MAAM,EAAE,kEAAkE;KAC3E,CAAC,CACH,CAAC;IACF,MAAM,OAAO,GAAG;QACd,cAAc;QACd,eAAe;QACf,cAAc;QACd,oBAAoB;QACpB,iBAAiB;QACjB,uBAAuB;QACvB,0BAA0B;QAC1B,SAAS;QACT,OAAO;KACR,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChB,KAAK,EAAE,YAAY,KAAK,EAAE;QAC1B,QAAQ,EAAE,kBAA2B;QACrC,MAAM,EAAE,gEAAgE;KACzE,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,GAAG,SAAS;QACZ,yBAAyB,CAAC,cAAc,EAAE,MAAM,CAAC;QACjD,yBAAyB,CAAC,SAAS,EAAE,MAAM,CAAC;QAC5C,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,SAAS,yBAAyB,CAChC,KAAiC,EACjC,MAA0C;IAE1C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3F,OAAO;QACL,KAAK,EAAE,YAAY,KAAK,eAAe,KAAK,EAAE;QAC9C,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc;QACnD,MAAM,EAAE,MAAM;YACZ,CAAC,CAAC,oFAAoF;YACtF,CAAC,CAAC,iHAAiH;KACtH,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,SAAS,0BAA0B,CACjC,MAA0C;IAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GACzC,8BAA8B,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,gBAAgB,GAAwC;IACnE,aAAa,EAAE,oBAAoB,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACnE,qBAAqB,EAAE,oBAAoB,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;IACnF,eAAe,EAAE,oBAAoB,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACvE,kBAAkB,EAAE,oBAAoB,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC7E,mBAAmB,EAAE,oBAAoB,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAC/E,aAAa,EAAE,oBAAoB,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACnE,UAAU,EAAE,oBAAoB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC7D,KAAK,EAAE,oBAAoB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACnD,eAAe,EAAE,oBAAoB,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACvE,cAAc,EAAE,oBAAoB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACrE,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/D,SAAS,EAAE,oBAAoB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3D,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/D,iBAAiB,EAAE,oBAAoB,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC3E,cAAc,EAAE,oBAAoB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACrE,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/D,SAAS,EAAE,oBAAoB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3D,iBAAiB,EAAE,oBAAoB,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC3E,gBAAgB,EAAE,oBAAoB,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACzE,MAAM,EAAE,oBAAoB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrD,eAAe,EAAE,oBAAoB,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACvE,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;CACxD,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { mkdir, writeFile } from 'node:fs/promises';
2
2
  import type { AppCategory, AppManifest } from '@ankhorage/contracts';
3
+ import { type StarterTemplateAsset } from './templates/starter/starter.assets';
3
4
  interface TemplateSeedMetadata {
4
5
  readonly package: string;
5
6
  readonly version: string;
@@ -15,13 +16,16 @@ export interface CreateProjectSeedRequest {
15
16
  readonly readmeText: string;
16
17
  readonly metadata: TemplateSeedMetadata;
17
18
  readonly manifest: AppManifest;
19
+ readonly assets: readonly StarterTemplateAsset[];
18
20
  }
19
21
  export interface CreateProjectSeedResult {
20
22
  readonly projectPath: string;
23
+ readonly createdFiles: readonly string[];
21
24
  }
22
25
  export interface ProjectSeedDependencies {
23
26
  readonly mkdir: typeof mkdir;
24
27
  readonly pathExists: (targetPath: string) => Promise<boolean>;
28
+ readonly readTemplateAsset: (asset: StarterTemplateAsset) => Promise<Uint8Array>;
25
29
  readonly writeFile: typeof writeFile;
26
30
  }
27
31
  export declare function createProjectSeed(request: CreateProjectSeedRequest, dependencies?: Partial<ProjectSeedDependencies>): Promise<CreateProjectSeedResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"projectSeed.d.ts","sourceRoot":"","sources":["../src/projectSeed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAQ,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAErE,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,QAAQ,CAAC,SAAS,EAAE,OAAO,SAAS,CAAC;CACtC;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,EACjC,YAAY,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAClD,OAAO,CAAC,uBAAuB,CAAC,CA0BlC"}
1
+ {"version":3,"file":"projectSeed.d.ts","sourceRoot":"","sources":["../src/projectSeed.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,EAA4B,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIrF,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,EACL,KAAK,oBAAoB,EAG1B,MAAM,oCAAoC,CAAC;AAK5C,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAOD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAClD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACjF,QAAQ,CAAC,SAAS,EAAE,OAAO,SAAS,CAAC;CACtC;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,EACjC,YAAY,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAClD,OAAO,CAAC,uBAAuB,CAAC,CA2BlC"}
@@ -1,24 +1,94 @@
1
- import { mkdir, stat, writeFile } from 'node:fs/promises';
1
+ import { createHash } from 'node:crypto';
2
+ import { lstat, mkdir, readFile, realpath, stat, writeFile } from 'node:fs/promises';
2
3
  import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { summarizeStarterTemplateAssets, validateStarterTemplateAssets, } from './templates/starter/starter.assets';
6
+ const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
7
+ const PACKAGED_TEMPLATE_ASSET_ROOT = path.join(PACKAGE_ROOT, 'assets', 'templates');
3
8
  export async function createProjectSeed(request, dependencies = {}) {
4
9
  const resolvedDependencies = createProjectSeedDependencies(dependencies);
5
10
  const projectPath = path.resolve(request.cwd, request.projectSlug);
6
11
  if (await resolvedDependencies.pathExists(projectPath)) {
7
12
  throw new Error(`Project path already exists: ${projectPath}`);
8
13
  }
14
+ const assets = validateStarterTemplateAssets(request.manifest, request.assets);
15
+ const materializedAssets = await materializeTemplateAssets(assets, resolvedDependencies.readTemplateAsset);
9
16
  await resolvedDependencies.mkdir(projectPath, { recursive: false });
10
- await resolvedDependencies.writeFile(path.join(projectPath, 'ankh.config.json'), `${JSON.stringify(request.manifest, null, 2)}\n`, 'utf8');
11
- await resolvedDependencies.writeFile(path.join(projectPath, 'ankh.template.json'), `${JSON.stringify(request.metadata, null, 2)}\n`, 'utf8');
12
- await resolvedDependencies.writeFile(path.join(projectPath, 'README.md'), request.readmeText, 'utf8');
13
- return { projectPath };
17
+ await writeProjectMetadata(projectPath, request, assets, resolvedDependencies.writeFile);
18
+ await writeMaterializedAssets(projectPath, materializedAssets, resolvedDependencies);
19
+ return {
20
+ projectPath,
21
+ createdFiles: [
22
+ 'ankh.config.json',
23
+ 'ankh.template.json',
24
+ 'README.md',
25
+ ...assets.map((asset) => asset.targetPath),
26
+ ],
27
+ };
28
+ }
29
+ /*** Write the manifest, template provenance, and readme for one generated project seed. */
30
+ async function writeProjectMetadata(projectPath, request, assets, writeProjectFile) {
31
+ await writeProjectFile(path.join(projectPath, 'ankh.config.json'), `${JSON.stringify(request.manifest, null, 2)}\n`, 'utf8');
32
+ await writeProjectFile(path.join(projectPath, 'ankh.template.json'), `${JSON.stringify({
33
+ ...request.metadata,
34
+ assets: summarizeStarterTemplateAssets(assets),
35
+ }, null, 2)}\n`, 'utf8');
36
+ await writeProjectFile(path.join(projectPath, 'README.md'), request.readmeText, 'utf8');
37
+ }
38
+ /*** Write preverified template assets below their app-relative manifest paths. */
39
+ async function writeMaterializedAssets(projectPath, materializedAssets, dependencies) {
40
+ for (const materialized of materializedAssets) {
41
+ const targetPath = path.resolve(projectPath, materialized.asset.targetPath);
42
+ assertInside(projectPath, targetPath, 'Template asset target');
43
+ await dependencies.mkdir(path.dirname(targetPath), { recursive: true });
44
+ await dependencies.writeFile(targetPath, materialized.contents);
45
+ }
46
+ }
47
+ /*** Resolve and byte-verify every asset before project creation starts. */
48
+ async function materializeTemplateAssets(assets, readTemplateAsset) {
49
+ return Promise.all(assets.map(async (asset) => ({
50
+ asset,
51
+ contents: await readTemplateAsset(asset),
52
+ })));
14
53
  }
15
54
  function createProjectSeedDependencies(overrides) {
16
55
  return {
17
56
  mkdir: overrides.mkdir ?? mkdir,
18
57
  pathExists: overrides.pathExists ?? pathExists,
58
+ readTemplateAsset: overrides.readTemplateAsset ?? readPackagedTemplateAsset,
19
59
  writeFile: overrides.writeFile ?? writeFile,
20
60
  };
21
61
  }
62
+ /*** Read and verify one immutable image from the published Templates asset inventory. */
63
+ async function readPackagedTemplateAsset(asset) {
64
+ const sourcePath = path.resolve(PACKAGE_ROOT, asset.sourcePath);
65
+ assertInside(PACKAGED_TEMPLATE_ASSET_ROOT, sourcePath, 'Template asset source');
66
+ const sourceStats = await lstat(sourcePath);
67
+ if (!sourceStats.isFile() || sourceStats.isSymbolicLink()) {
68
+ throw new Error(`Template asset source must be a regular file: ${asset.sourcePath}`);
69
+ }
70
+ const canonicalSourcePath = await realpath(sourcePath);
71
+ assertInside(PACKAGED_TEMPLATE_ASSET_ROOT, canonicalSourcePath, 'Template asset source');
72
+ const contents = await readFile(canonicalSourcePath);
73
+ if (contents.byteLength !== asset.sizeBytes) {
74
+ throw new Error(`Template asset byte size does not match its descriptor: ${asset.sourcePath}`);
75
+ }
76
+ const sha256 = createHash('sha256').update(contents).digest('hex');
77
+ if (sha256 !== asset.sha256) {
78
+ throw new Error(`Template asset sha256 does not match its descriptor: ${asset.sourcePath}`);
79
+ }
80
+ return contents;
81
+ }
82
+ /*** Require a resolved path to remain strictly below its declared owner directory. */
83
+ function assertInside(parentPath, childPath, label) {
84
+ const relativePath = path.relative(parentPath, childPath);
85
+ if (relativePath === '' ||
86
+ relativePath === '..' ||
87
+ relativePath.startsWith(`..${path.sep}`) ||
88
+ path.isAbsolute(relativePath)) {
89
+ throw new Error(`${label} escapes its owner directory: ${childPath}`);
90
+ }
91
+ }
22
92
  async function pathExists(targetPath) {
23
93
  try {
24
94
  await stat(targetPath);
@@ -1 +1 @@
1
- {"version":3,"file":"projectSeed.js","sourceRoot":"","sources":["../src/projectSeed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAgC7B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC,EACjC,eAAiD,EAAE;IAEnD,MAAM,oBAAoB,GAAG,6BAA6B,CAAC,YAAY,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnE,IAAI,MAAM,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,oBAAoB,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,MAAM,oBAAoB,CAAC,SAAS,CAClC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAC1C,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAChD,MAAM,CACP,CAAC;IACF,MAAM,oBAAoB,CAAC,SAAS,CAClC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAC5C,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAChD,MAAM,CACP,CAAC;IACF,MAAM,oBAAoB,CAAC,SAAS,CAClC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EACnC,OAAO,CAAC,UAAU,EAClB,MAAM,CACP,CAAC;IAEF,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,6BAA6B,CACpC,SAA2C;IAE3C,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,KAAK;QAC/B,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,UAAU;QAC9C,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,SAAS;KAC5C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,UAAkB;IAC1C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"projectSeed.js","sourceRoot":"","sources":["../src/projectSeed.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { ThemeConfig } from '@ankhorage/contracts';
2
2
  interface CreateThemeSeed {
3
3
  primaryColor: string;
4
4
  harmony: ThemeConfig['light']['harmony'];
5
+ theme?: ThemeConfig;
5
6
  themeId?: string;
6
7
  themeName?: string;
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-theme.d.ts","sourceRoot":"","sources":["../../../src/templates/shared/create-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAe9D"}
1
+ {"version":3,"file":"create-theme.d.ts","sourceRoot":"","sources":["../../../src/templates/shared/create-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAgB9D"}
@@ -1,5 +1,7 @@
1
1
  import { DEFAULT_THEME_ID, DEFAULT_THEME_NAME } from '../../internal/defaults';
2
2
  export function createTheme(seed) {
3
+ if (seed.theme)
4
+ return structuredClone(seed.theme);
3
5
  const themeId = seed.themeId ?? DEFAULT_THEME_ID;
4
6
  return {
5
7
  id: themeId,
@@ -1 +1 @@
1
- {"version":3,"file":"create-theme.js","sourceRoot":"","sources":["../../../src/templates/shared/create-theme.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAS/E,MAAM,UAAU,WAAW,CAAC,IAAqB;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;IAEjD,OAAO;QACL,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,kBAAkB;QAC1C,KAAK,EAAE;YACL,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"create-theme.js","sourceRoot":"","sources":["../../../src/templates/shared/create-theme.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAU/E,MAAM,UAAU,WAAW,CAAC,IAAqB;IAC/C,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;IAEjD,OAAO;QACL,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,kBAAkB;QAC1C,KAAK,EAAE;YACL,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB;QACD,IAAI,EAAE;YACJ,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB;KACF,CAAC;AACJ,CAAC"}
@@ -1,2 +1,3 @@
1
- export { createStarterTemplate, listStarterTemplateSummaries, listStarterTemplates, listStarterTemplatesByCategory, resolveStarterTemplate, TEMPLATE_KINDS, type CategoryStarterTemplateDefinition, type StarterTemplateFactory, type StarterTemplateId, type StarterTemplateOptions, type StarterTemplateSelection, type StarterTemplateSummary, type TemplateKind, type TemplateSeed, } from './starter.template';
1
+ export { createStarterTemplateArtifact, type StarterTemplateArtifact, type StarterTemplateAsset, type StarterTemplateAssetSummary, summarizeStarterTemplateAssets, TEMPLATE_IMAGE_CONTENT_TYPES, type TemplateImageContentType, validateStarterTemplateAssets, } from './starter.assets';
2
+ export { createStarterTemplate, listStarterTemplateSummaries, listStarterTemplates, listStarterTemplatesByCategory, resolveStarterTemplate, TEMPLATE_KINDS, type CategoryStarterTemplateDefinition, type StarterTemplateFactory, type StarterTemplateId, type StarterTemplateOptions, type StarterTemplateSelection, type StarterTemplateSummary, type StarterTemplateResult, type TemplateKind, type TemplateSeed, } from './starter.template';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/starter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,8BAA8B,EAC9B,sBAAsB,EACtB,cAAc,EACd,KAAK,iCAAiC,EACtC,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/starter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,8BAA8B,EAC9B,4BAA4B,EAC5B,KAAK,wBAAwB,EAC7B,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,8BAA8B,EAC9B,sBAAsB,EACtB,cAAc,EACd,KAAK,iCAAiC,EACtC,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
@@ -1,2 +1,3 @@
1
+ export { createStarterTemplateArtifact, summarizeStarterTemplateAssets, TEMPLATE_IMAGE_CONTENT_TYPES, validateStarterTemplateAssets, } from './starter.assets';
1
2
  export { createStarterTemplate, listStarterTemplateSummaries, listStarterTemplates, listStarterTemplatesByCategory, resolveStarterTemplate, TEMPLATE_KINDS, } from './starter.template';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/starter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,8BAA8B,EAC9B,sBAAsB,EACtB,cAAc,GASf,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/templates/starter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAI7B,8BAA8B,EAC9B,4BAA4B,EAE5B,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,8BAA8B,EAC9B,sBAAsB,EACtB,cAAc,GAUf,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { AppManifest } from '@ankhorage/contracts';
2
+ export declare const TEMPLATE_IMAGE_CONTENT_TYPES: readonly ["image/avif", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp"];
3
+ export type TemplateImageContentType = (typeof TEMPLATE_IMAGE_CONTENT_TYPES)[number];
4
+ export interface StarterTemplateAsset {
5
+ readonly sourcePath: string;
6
+ readonly targetPath: string;
7
+ readonly contentType: TemplateImageContentType;
8
+ readonly sizeBytes: number;
9
+ readonly sha256: string;
10
+ }
11
+ export type StarterTemplateAssetSummary = Omit<StarterTemplateAsset, 'sourcePath'>;
12
+ export interface StarterTemplateArtifact {
13
+ readonly manifest: AppManifest;
14
+ readonly assets: readonly StarterTemplateAsset[];
15
+ }
16
+ /*** Compose one canonical starter artifact from a manifest and its distributable image files. */
17
+ export declare function createStarterTemplateArtifact(manifest: AppManifest, assets?: readonly StarterTemplateAsset[]): StarterTemplateArtifact;
18
+ /*** Validate and deterministically order the bundled image files owned by one starter manifest. */
19
+ export declare function validateStarterTemplateAssets(manifest: AppManifest, assets: readonly StarterTemplateAsset[]): readonly StarterTemplateAsset[];
20
+ /*** Describe distributable image assets without exposing their package-internal source paths. */
21
+ export declare function summarizeStarterTemplateAssets(assets: readonly StarterTemplateAsset[]): readonly StarterTemplateAssetSummary[];
22
+ //# sourceMappingURL=starter.assets.d.ts.map