create-harper 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/install.js +1 -1
- package/package.json +4 -2
- package/template-vue/README.md +120 -0
- package/template-vue/_aiignore +1 -0
- package/template-vue/_env +3 -0
- package/template-vue/_env.example +3 -0
- package/template-vue/_github/workflow/deploy.yaml +33 -0
- package/template-vue/_gitignore +149 -0
- package/template-vue/_nvmrc +1 -0
- package/template-vue/config.yaml +23 -0
- package/template-vue/deploy-template/config.yaml +2 -0
- package/template-vue/deploy-template/fastify/static.js +14 -0
- package/template-vue/deploy-template/package.json +5 -0
- package/template-vue/graphql.config.yml +3 -0
- package/template-vue/index.html +13 -0
- package/template-vue/package.json +28 -0
- package/template-vue/public/react.svg +14 -0
- package/template-vue/public/typescript.svg +16 -0
- package/template-vue/public/vite.svg +42 -0
- package/template-vue/public/vue.svg +9 -0
- package/template-vue/resources/README.md +11 -0
- package/template-vue/schemas/README.md +11 -0
- package/template-vue/src/App.vue +42 -0
- package/template-vue/src/main.js +6 -0
- package/template-vue/src/style.css +96 -0
- package/template-vue/vite.config.js +22 -0
- package/template-vue-ts/README.md +132 -0
- package/template-vue-ts/_aiignore +1 -0
- package/template-vue-ts/_env +3 -0
- package/template-vue-ts/_env.example +3 -0
- package/template-vue-ts/_github/workflow/deploy.yaml +33 -0
- package/template-vue-ts/_gitignore +149 -0
- package/template-vue-ts/_nvmrc +1 -0
- package/template-vue-ts/config.yaml +23 -0
- package/template-vue-ts/deploy-template/config.yaml +2 -0
- package/template-vue-ts/deploy-template/fastify/static.js +14 -0
- package/template-vue-ts/deploy-template/package.json +5 -0
- package/template-vue-ts/graphql.config.yml +3 -0
- package/template-vue-ts/index.html +13 -0
- package/template-vue-ts/package.json +31 -0
- package/template-vue-ts/public/react.svg +14 -0
- package/template-vue-ts/public/typescript.svg +16 -0
- package/template-vue-ts/public/vite.svg +42 -0
- package/template-vue-ts/public/vue.svg +9 -0
- package/template-vue-ts/resources/README.md +11 -0
- package/template-vue-ts/schemas/README.md +11 -0
- package/template-vue-ts/src/App.vue +42 -0
- package/template-vue-ts/src/main.ts +6 -0
- package/template-vue-ts/src/style.css +96 -0
- package/template-vue-ts/src/vite-env.d.ts +15 -0
- package/template-vue-ts/tsconfig.json +33 -0
- package/template-vue-ts/vite.config.ts +22 -0
package/lib/install.js
CHANGED
|
@@ -21,7 +21,7 @@ export function install(root, agent) {
|
|
|
21
21
|
cwd: root,
|
|
22
22
|
});
|
|
23
23
|
prompts.log.step('Installing Harper skills...');
|
|
24
|
-
run('npx -y skills add harperfast/skills --all --yes', {
|
|
24
|
+
run(['npx', '-y', 'skills', 'add', 'harperfast/skills', '--all', '--yes'], {
|
|
25
25
|
stdio: 'inherit',
|
|
26
26
|
cwd: root,
|
|
27
27
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-harper",
|
|
3
3
|
"description": "Scaffold a new Harper project in JavaScript or TypeScript.",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "HarperDB",
|
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
"template-react/",
|
|
19
19
|
"template-react-ts/",
|
|
20
20
|
"template-vanilla/",
|
|
21
|
-
"template-vanilla-ts/"
|
|
21
|
+
"template-vanilla-ts/",
|
|
22
|
+
"template-vue/",
|
|
23
|
+
"template-vue-ts/"
|
|
22
24
|
],
|
|
23
25
|
"scripts": {
|
|
24
26
|
"commitlint": "commitlint --edit",
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# your-project-name-here
|
|
2
|
+
|
|
3
|
+
Your new app is now ready for development!
|
|
4
|
+
|
|
5
|
+
Here's what you should do next:
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
To get started, make sure you have [installed Harper](https://docs.harperdb.io/docs/deployments/install-harper):
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install -g harperdb
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Development
|
|
16
|
+
|
|
17
|
+
Then you can start your app:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
npm run dev
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Define Your Schema
|
|
24
|
+
|
|
25
|
+
1. Create a new yourTableName.graphql file in the [schemas](./schemas) directory.
|
|
26
|
+
2. Craft your schema by hand.
|
|
27
|
+
3. Save your changes.
|
|
28
|
+
|
|
29
|
+
These schemas are the heart of a great Harper app, specifying which tables you want and what attributes/fields they should have. Any table you `@export` stands up [endpoints automatically](./.agents/skills/harper-best-practices/rules/automatic-apis.md).
|
|
30
|
+
|
|
31
|
+
### Add Custom Endpoints
|
|
32
|
+
|
|
33
|
+
1. Create a new greeting.js file in the [resources](./resources) directory.
|
|
34
|
+
|
|
35
|
+
2. Customize your resource:
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
export class Greeting extends Resource {
|
|
39
|
+
static loadAsInstance = false;
|
|
40
|
+
|
|
41
|
+
async post(
|
|
42
|
+
target,
|
|
43
|
+
newRecord,
|
|
44
|
+
) {
|
|
45
|
+
// By default, only super users can access these endpoints.
|
|
46
|
+
return { greeting: 'Greetings, post!' };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async get(target) {
|
|
50
|
+
// But if we want anyone to be able to access it, we can turn off the permission checks!
|
|
51
|
+
target.checkPermission = false;
|
|
52
|
+
return { greeting: 'Greetings, get! ' + process.version };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async put(
|
|
56
|
+
target,
|
|
57
|
+
record,
|
|
58
|
+
) {
|
|
59
|
+
target.checkPermission = false;
|
|
60
|
+
if (this.getCurrentUser()?.name?.includes('Coffee')) {
|
|
61
|
+
// You can add your own authorization guards, of course.
|
|
62
|
+
return new Response('Coffee? COFFEE?!', { status: 418 });
|
|
63
|
+
}
|
|
64
|
+
return { greeting: 'Sssssssssssssss!' };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async patch(
|
|
68
|
+
target,
|
|
69
|
+
record,
|
|
70
|
+
) {
|
|
71
|
+
return { greeting: 'We can make this work!' };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async delete(target) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
3. Save your changes.
|
|
81
|
+
|
|
82
|
+
### View Your Website
|
|
83
|
+
|
|
84
|
+
Pop open [http://localhost:9926](http://localhost:9926) to view [web/index.html](./web/index.html) in your browser.
|
|
85
|
+
|
|
86
|
+
### Use Your API
|
|
87
|
+
|
|
88
|
+
Test your application works by querying the `/Greeting` endpoint:
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
curl http://localhost:9926/Greeting
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
You should see the following:
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{ "greeting": "Hello, world!" }
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Configure Your App
|
|
101
|
+
|
|
102
|
+
Take a look at the [default configuration](./config.yaml), which specifies how files are handled in your application.
|
|
103
|
+
|
|
104
|
+
## Deployment
|
|
105
|
+
|
|
106
|
+
When you are ready, head to [https://fabric.harper.fast/](https://fabric.harper.fast/), log in to your account, and create a cluster.
|
|
107
|
+
|
|
108
|
+
Come back here and configure your [.env](./.env) file with your secure cluster credentials. Don't commit this file to source control!
|
|
109
|
+
|
|
110
|
+
Then you can deploy your app to your cluster:
|
|
111
|
+
|
|
112
|
+
```sh
|
|
113
|
+
npm run deploy
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Keep Going!
|
|
117
|
+
|
|
118
|
+
For more information about getting started with Harper and building applications, see our [getting started guide](https://docs.harperdb.io/docs).
|
|
119
|
+
|
|
120
|
+
For more information on Harper Components, see the [Components documentation](https://docs.harperdb.io/docs/reference/components).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.env
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Deploy to Harper Fabric
|
|
2
|
+
on:
|
|
3
|
+
workflow_dispatch:
|
|
4
|
+
# push:
|
|
5
|
+
# branches:
|
|
6
|
+
# - main
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: main
|
|
10
|
+
cancel-in-progress: false
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
deploy:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- name: Checkout code
|
|
17
|
+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
|
18
|
+
with:
|
|
19
|
+
fetch-depth: 0
|
|
20
|
+
fetch-tags: true
|
|
21
|
+
- name: Set up Node.js
|
|
22
|
+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
|
|
23
|
+
with:
|
|
24
|
+
cache: 'npm'
|
|
25
|
+
node-version-file: '.nvmrc'
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: npm ci
|
|
28
|
+
- name: Run unit tests
|
|
29
|
+
run: npm test
|
|
30
|
+
- name: Run lint
|
|
31
|
+
run: npm run lint
|
|
32
|
+
- name: Build & deploy
|
|
33
|
+
run: npm run deploy
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
.DS_Store
|
|
2
|
+
web
|
|
3
|
+
deploy
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
# https://raw.githubusercontent.com/github/gitignore/refs/heads/main/Node.gitignore
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
# Logs
|
|
10
|
+
logs
|
|
11
|
+
*.log
|
|
12
|
+
npm-debug.log*
|
|
13
|
+
yarn-debug.log*
|
|
14
|
+
yarn-error.log*
|
|
15
|
+
lerna-debug.log*
|
|
16
|
+
|
|
17
|
+
# Diagnostic reports (https://nodejs.org/api/report.html)
|
|
18
|
+
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
|
19
|
+
|
|
20
|
+
# Runtime data
|
|
21
|
+
pids
|
|
22
|
+
*.pid
|
|
23
|
+
*.seed
|
|
24
|
+
*.pid.lock
|
|
25
|
+
|
|
26
|
+
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
27
|
+
lib-cov
|
|
28
|
+
|
|
29
|
+
# Coverage directory used by tools like istanbul
|
|
30
|
+
coverage
|
|
31
|
+
*.lcov
|
|
32
|
+
|
|
33
|
+
# nyc test coverage
|
|
34
|
+
.nyc_output
|
|
35
|
+
|
|
36
|
+
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
|
37
|
+
.grunt
|
|
38
|
+
|
|
39
|
+
# Bower dependency directory (https://bower.io/)
|
|
40
|
+
bower_components
|
|
41
|
+
|
|
42
|
+
# node-waf configuration
|
|
43
|
+
.lock-wscript
|
|
44
|
+
|
|
45
|
+
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
|
46
|
+
build/Release
|
|
47
|
+
|
|
48
|
+
# Dependency directories
|
|
49
|
+
node_modules/
|
|
50
|
+
jspm_packages/
|
|
51
|
+
|
|
52
|
+
# Snowpack dependency directory (https://snowpack.dev/)
|
|
53
|
+
web_modules/
|
|
54
|
+
|
|
55
|
+
# TypeScript cache
|
|
56
|
+
*.tsbuildinfo
|
|
57
|
+
|
|
58
|
+
# Optional npm cache directory
|
|
59
|
+
.npm
|
|
60
|
+
|
|
61
|
+
# Optional eslint cache
|
|
62
|
+
.eslintcache
|
|
63
|
+
|
|
64
|
+
# Optional stylelint cache
|
|
65
|
+
.stylelintcache
|
|
66
|
+
|
|
67
|
+
# Optional REPL history
|
|
68
|
+
.node_repl_history
|
|
69
|
+
|
|
70
|
+
# Output of 'npm pack'
|
|
71
|
+
*.tgz
|
|
72
|
+
|
|
73
|
+
# Yarn Integrity file
|
|
74
|
+
.yarn-integrity
|
|
75
|
+
|
|
76
|
+
# dotenv environment variable files
|
|
77
|
+
.env
|
|
78
|
+
.env.*
|
|
79
|
+
!.env.example
|
|
80
|
+
|
|
81
|
+
# parcel-bundler cache (https://parceljs.org/)
|
|
82
|
+
.cache
|
|
83
|
+
.parcel-cache
|
|
84
|
+
|
|
85
|
+
# Next.js build output
|
|
86
|
+
.next
|
|
87
|
+
out
|
|
88
|
+
|
|
89
|
+
# Nuxt.js build / generate output
|
|
90
|
+
.nuxt
|
|
91
|
+
dist
|
|
92
|
+
.output
|
|
93
|
+
|
|
94
|
+
# Gatsby files
|
|
95
|
+
.cache/
|
|
96
|
+
# Comment in the public line in if your project uses Gatsby and not Next.js
|
|
97
|
+
# https://nextjs.org/blog/next-9-1#public-directory-support
|
|
98
|
+
# public
|
|
99
|
+
|
|
100
|
+
# vuepress build output
|
|
101
|
+
.vuepress/dist
|
|
102
|
+
|
|
103
|
+
# vuepress v2.x temp and cache directory
|
|
104
|
+
.temp
|
|
105
|
+
.cache
|
|
106
|
+
|
|
107
|
+
# Sveltekit cache directory
|
|
108
|
+
.svelte-kit/
|
|
109
|
+
|
|
110
|
+
# vitepress build output
|
|
111
|
+
**/.vitepress/dist
|
|
112
|
+
|
|
113
|
+
# vitepress cache directory
|
|
114
|
+
**/.vitepress/cache
|
|
115
|
+
|
|
116
|
+
# Docusaurus cache and generated files
|
|
117
|
+
.docusaurus
|
|
118
|
+
|
|
119
|
+
# Serverless directories
|
|
120
|
+
.serverless/
|
|
121
|
+
|
|
122
|
+
# FuseBox cache
|
|
123
|
+
.fusebox/
|
|
124
|
+
|
|
125
|
+
# DynamoDB Local files
|
|
126
|
+
.dynamodb/
|
|
127
|
+
|
|
128
|
+
# Firebase cache directory
|
|
129
|
+
.firebase/
|
|
130
|
+
|
|
131
|
+
# TernJS port file
|
|
132
|
+
.tern-port
|
|
133
|
+
|
|
134
|
+
# Stores VSCode versions used for testing VSCode extensions
|
|
135
|
+
.vscode-test
|
|
136
|
+
|
|
137
|
+
# yarn v3
|
|
138
|
+
.pnp.*
|
|
139
|
+
.yarn/*
|
|
140
|
+
!.yarn/patches
|
|
141
|
+
!.yarn/plugins
|
|
142
|
+
!.yarn/releases
|
|
143
|
+
!.yarn/sdks
|
|
144
|
+
!.yarn/versions
|
|
145
|
+
|
|
146
|
+
# Vite files
|
|
147
|
+
vite.config.js.timestamp-*
|
|
148
|
+
vite.config.ts.timestamp-*
|
|
149
|
+
.vite/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
24.13.1
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# yaml-language-server: $schema=./node_modules/harperdb/config-app.schema.json
|
|
2
|
+
|
|
3
|
+
# This is the configuration file for the application.
|
|
4
|
+
# It specifies built-in Harper components that will load the specified feature and files.
|
|
5
|
+
# For more information, see https://docs.harperdb.io/docs/reference/components/built-in-extensions
|
|
6
|
+
|
|
7
|
+
# Load Environment Variables from the specified file
|
|
8
|
+
# loadEnv:
|
|
9
|
+
# files: '.env'
|
|
10
|
+
|
|
11
|
+
# This provides the HTTP REST interface for all exported resources
|
|
12
|
+
rest: true
|
|
13
|
+
|
|
14
|
+
# These reads GraphQL schemas to define the schema of database/tables/attributes.
|
|
15
|
+
graphqlSchema:
|
|
16
|
+
files: 'schemas/*.graphql'
|
|
17
|
+
|
|
18
|
+
# Loads JavaScript modules such that their exports are exported as resources
|
|
19
|
+
jsResource:
|
|
20
|
+
files: 'resources/*.js'
|
|
21
|
+
|
|
22
|
+
'@harperfast/vite-plugin':
|
|
23
|
+
package: '@harperfast/vite-plugin'
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import fastifyStatic from '@fastify/static';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
|
|
4
|
+
export default async (fastify) => {
|
|
5
|
+
fastify.register(fastifyStatic, {
|
|
6
|
+
root: join(import.meta.dirname, '../web'),
|
|
7
|
+
maxAge: '30d',
|
|
8
|
+
immutable: true,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
fastify.get('/', function(req, reply) {
|
|
12
|
+
reply.sendFile('index.html', { maxAge: '1m', immutable: false });
|
|
13
|
+
});
|
|
14
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>your-project-name-here</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="app"></div>
|
|
11
|
+
<script type="module" src="/src/main.js"></script>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "your-package-name-here",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"repository": "github:HarperFast/create-harper",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"agent:run": "npx -y @harperfast/agent@latest",
|
|
8
|
+
"agent:skills:update": "npx -y skills@latest add harperfast/skills --all --yes",
|
|
9
|
+
"dev": "harper run .",
|
|
10
|
+
"test": "echo 'No tests implemented yet'",
|
|
11
|
+
"lint": "echo 'No lint implemented yet'",
|
|
12
|
+
"build": "vite build",
|
|
13
|
+
"preview": "vite preview",
|
|
14
|
+
"deploy": "rm -Rf deploy && npm run build && mkdir deploy && mv web deploy/ && cp -R deploy-template/* deploy/ && dotenv -- npm run deploy:component && rm -Rf deploy",
|
|
15
|
+
"deploy:component": "(cd deploy && harperdb deploy_component . project=web restart=rolling replicated=true)"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@harperfast/vite-plugin": "^0.0.1",
|
|
19
|
+
"@vitejs/plugin-vue": "^6.0.0",
|
|
20
|
+
"dotenv-cli": "^11.0.0",
|
|
21
|
+
"harperdb": "^4.7.17",
|
|
22
|
+
"vite": "npm:rolldown-vite@7.3.1",
|
|
23
|
+
"vue": "^3.5.13"
|
|
24
|
+
},
|
|
25
|
+
"overrides": {
|
|
26
|
+
"vite": "npm:rolldown-vite@7.3.1"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg
|
|
2
|
+
width="100%"
|
|
3
|
+
height="100%"
|
|
4
|
+
viewBox="-10.5 -9.45 21 18.9"
|
|
5
|
+
fill="none"
|
|
6
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
+
>
|
|
8
|
+
<circle cx="0" cy="0" r="2" fill="#58c4dc"></circle>
|
|
9
|
+
<g stroke="#58c4dc" stroke-width="1" fill="none">
|
|
10
|
+
<ellipse rx="10" ry="4.5"></ellipse>
|
|
11
|
+
<ellipse rx="10" ry="4.5" transform="rotate(60)"></ellipse>
|
|
12
|
+
<ellipse rx="10" ry="4.5" transform="rotate(120)"></ellipse>
|
|
13
|
+
</g>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg
|
|
2
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
3
|
+
aria-hidden="true"
|
|
4
|
+
role="img"
|
|
5
|
+
class="iconify iconify--logos"
|
|
6
|
+
width="32"
|
|
7
|
+
height="32"
|
|
8
|
+
preserveAspectRatio="xMidYMid meet"
|
|
9
|
+
viewBox="0 0 256 256"
|
|
10
|
+
>
|
|
11
|
+
<path fill="#007ACC" d="M0 128v128h256V0H0z"></path>
|
|
12
|
+
<path
|
|
13
|
+
fill="#FFF"
|
|
14
|
+
d="m56.612 128.85l-.081 10.483h33.32v94.68h23.568v-94.68h33.321v-10.28c0-5.69-.122-10.444-.284-10.566c-.122-.162-20.4-.244-44.983-.203l-44.74.122l-.121 10.443Zm149.955-10.742c6.501 1.625 11.459 4.51 16.01 9.224c2.357 2.52 5.851 7.111 6.136 8.208c.08.325-11.053 7.802-17.798 11.988c-.244.162-1.22-.894-2.317-2.52c-3.291-4.795-6.745-6.867-12.028-7.233c-7.76-.528-12.759 3.535-12.718 10.321c0 1.992.284 3.17 1.097 4.795c1.707 3.536 4.876 5.649 14.832 9.956c18.326 7.883 26.168 13.084 31.045 20.48c5.445 8.249 6.664 21.415 2.966 31.208c-4.063 10.646-14.14 17.879-28.323 20.276c-4.388.772-14.79.65-19.504-.203c-10.28-1.828-20.033-6.908-26.047-13.572c-2.357-2.6-6.949-9.387-6.664-9.874c.122-.163 1.178-.813 2.356-1.504c1.138-.65 5.446-3.129 9.509-5.485l7.355-4.267l1.544 2.276c2.154 3.29 6.867 7.801 9.712 9.305c8.167 4.307 19.383 3.698 24.909-1.26c2.357-2.153 3.332-4.388 3.332-7.68c0-2.966-.366-4.266-1.91-6.501c-1.99-2.845-6.054-5.242-17.595-10.24c-13.206-5.69-18.895-9.224-24.096-14.832c-3.007-3.25-5.852-8.452-7.03-12.8c-.975-3.617-1.22-12.678-.447-16.335c2.723-12.76 12.353-21.659 26.25-24.3c4.51-.853 14.994-.528 19.424.569Z"
|
|
15
|
+
></path>
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<svg
|
|
2
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
3
|
+
aria-hidden="true"
|
|
4
|
+
role="img"
|
|
5
|
+
class="iconify iconify--logos"
|
|
6
|
+
width="31.88"
|
|
7
|
+
height="32"
|
|
8
|
+
preserveAspectRatio="xMidYMid meet"
|
|
9
|
+
viewBox="0 0 256 257"
|
|
10
|
+
>
|
|
11
|
+
<defs>
|
|
12
|
+
<linearGradient
|
|
13
|
+
id="IconifyId1813088fe1fbc01fb466"
|
|
14
|
+
x1="-.828%"
|
|
15
|
+
x2="57.636%"
|
|
16
|
+
y1="7.652%"
|
|
17
|
+
y2="78.411%"
|
|
18
|
+
>
|
|
19
|
+
<stop offset="0%" stop-color="#41D1FF"></stop>
|
|
20
|
+
<stop offset="100%" stop-color="#BD34FE"></stop>
|
|
21
|
+
</linearGradient>
|
|
22
|
+
<linearGradient
|
|
23
|
+
id="IconifyId1813088fe1fbc01fb467"
|
|
24
|
+
x1="43.376%"
|
|
25
|
+
x2="50.316%"
|
|
26
|
+
y1="2.242%"
|
|
27
|
+
y2="89.03%"
|
|
28
|
+
>
|
|
29
|
+
<stop offset="0%" stop-color="#FFEA83"></stop>
|
|
30
|
+
<stop offset="8.333%" stop-color="#FFDD35"></stop>
|
|
31
|
+
<stop offset="100%" stop-color="#FFA800"></stop>
|
|
32
|
+
</linearGradient>
|
|
33
|
+
</defs>
|
|
34
|
+
<path
|
|
35
|
+
fill="url(#IconifyId1813088fe1fbc01fb466)"
|
|
36
|
+
d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"
|
|
37
|
+
></path>
|
|
38
|
+
<path
|
|
39
|
+
fill="url(#IconifyId1813088fe1fbc01fb467)"
|
|
40
|
+
d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"
|
|
41
|
+
></path>
|
|
42
|
+
</svg>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Resources
|
|
2
|
+
|
|
3
|
+
The [schemas you define in .GraphQL files](../.agents/skills/harper-best-practices/rules/adding-tables-with-schemas.md) will [automatically stand-up REST APIs](../.agents/skills/harper-best-practices/rules/automatic-apis.md).
|
|
4
|
+
|
|
5
|
+
But you can [extend your tables with custom logic](../.agents/skills/harper-best-practices/rules/extending-tables.md) and [create your own resources](../.agents/skills/harper-best-practices/rules/custom-resources.md) in this directory.
|
|
6
|
+
|
|
7
|
+
## Want to read more?
|
|
8
|
+
|
|
9
|
+
Check out the rest of the "skills" documentation!
|
|
10
|
+
|
|
11
|
+
[Harper Best Practices Skill](../.agents/skills/harper-best-practices/SKILL.md)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Schemas
|
|
2
|
+
|
|
3
|
+
Your schemas are defined in `.graphql` files within this `schemas` directory. These files contain the structure and types for your database tables, allowing Harper to automatically generate REST APIs for CRUD operations.
|
|
4
|
+
|
|
5
|
+
Take a look at the [Adding Tables with Schemas](../.agents/skills/harper-best-practices/rules/adding-tables-with-schemas.md) to learn more!
|
|
6
|
+
|
|
7
|
+
## Want to read more?
|
|
8
|
+
|
|
9
|
+
Check out the rest of the "skills" documentation!
|
|
10
|
+
|
|
11
|
+
[Harper Best Practices Skill](../.agents/skills/harper-best-practices/SKILL.md)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import typescriptLogo from '/typescript.svg';
|
|
3
|
+
import viteLogo from '/vite.svg';
|
|
4
|
+
import vueLogo from '/vue.svg';
|
|
5
|
+
import { ref } from 'vue';
|
|
6
|
+
|
|
7
|
+
const counter = ref(0);
|
|
8
|
+
const countUp = () => {
|
|
9
|
+
counter.value++;
|
|
10
|
+
};
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<div>
|
|
15
|
+
<a href="https://vite.dev" target="_blank" rel="noopener noreferrer">
|
|
16
|
+
<img :src="viteLogo" class="logo" alt="Vite logo" />
|
|
17
|
+
</a>
|
|
18
|
+
<a
|
|
19
|
+
href="https://www.typescriptlang.org/"
|
|
20
|
+
target="_blank"
|
|
21
|
+
rel="noopener noreferrer"
|
|
22
|
+
>
|
|
23
|
+
<img :src="typescriptLogo" class="logo vanilla" alt="TypeScript logo" />
|
|
24
|
+
</a>
|
|
25
|
+
<a href="https://vuejs.org/" target="_blank" rel="noopener noreferrer">
|
|
26
|
+
<img :src="vueLogo" class="logo vue" alt="Vue logo" />
|
|
27
|
+
</a>
|
|
28
|
+
<h1>Vite + TypeScript + Vue</h1>
|
|
29
|
+
<p>Wow, look at this!</p>
|
|
30
|
+
<div class="card">
|
|
31
|
+
<button id="counter" type="button" @click="countUp">
|
|
32
|
+
count is {{ counter }}
|
|
33
|
+
</button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</template>
|
|
37
|
+
|
|
38
|
+
<style scoped>
|
|
39
|
+
.logo.vue:hover {
|
|
40
|
+
filter: drop-shadow(0 0 2em #42b883aa);
|
|
41
|
+
}
|
|
42
|
+
</style>
|